




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2015年mysql春季版辛星辛星,的关注辛星mysql于2014年8月,当时原计划写五本,但是只:知识,传递。 希望本书能够起到一个比较正确的作用。win7+wampserver2.2,MySQL下MySQL的历史。MySQL的历史最早可以追溯到1979年,创始人是MontyWideniusTcxbasic设计了一个报表工具。1990,TcxSQL于是Monty雄心大起,决定自己重写一个SQL支持。六年的时间一闪而过,1996MySQL1.01996103.11.1没有2.x版本。当时的MySQL其他功能。随后的两年里,MySQL被移植到各个平台。1999-2000MySQLAB2000MySQLGPL20014.0InnoDB2004104.1200510MySQL5.0,2008116MySQLSun2009420,Sun公司又被Oracle2010年发布了SQLServer由于我之前写PHP使用的是wampserver这个集成软件,因此这里也使用的是wampserver,这里使用的是2.2版本,当然2.5对于wampserver这个软件,朋友们如果用过,自然是最好,如果没有用过,可以去一下,然后安装即可,对于它的使用,我如果朋友们了wamp,那么对托盘区的小图标点左键,在弹出菜单中选择”MySQL”,然后单击MySQL我们可以使用showdatabases;这个命令来查看所有的数据库,如一定要注意在showdatabases;之后的分号奥,而且要注意这里的databases是s的,也就是说它有复数形式的。上面我们看到MySQL控制台的提示符为”mysql>”,一般有经验DBA如我们对wampMySQL,my.ini,对于上面提到的这个prompt,我们可以通过它显示比较多的信息 下”mysqlprompt”来阅读没有截图说明,这些内容在2014年MySQL秋季版中是有wampMySQL,这两者在使用上很像,但是不完全相同,如果读者直接一个MySQL,会发现大约有200MB那么大,但是一个wamp总共才只有不到60MB,就是因为wamp删掉了一些东西。资料去、安装、配置,使用方式相差并不大。SQLStructedQueryLanguage”结构化查询语言原名是SQL最早可以追溯到1974年,源于IBM,在1986年通过了ANSI数据库的批准,成为了标准。SQL1987年通过了ISO,929903MySQLSQL语句如果读者有过Python或者Ruby的学习经历,那么对于这种交互javascript的在数据之前,须有一个数据库,我们可以给它指定一比如我们创建一个数据库,取名为xinxing,那么我们只需要在命令行中输入createdatabasexinxing;然后敲回车即可:这里我们就创建了一个数据库,名字叫做xinxing,虽然它里面什databaseschema,它也表示创建一个数据库,咱们也可以用createschemaxiaoqian;来创建一个数据库:那么schemadatabasedatabase,学术派多用schema。我们也可以把showdatabases;showschemas;它们的效果是这种格式来删除一个数据库,比如我们想干掉xiaoqian这个数据库,上面我们已经删除了xiaoqian这个数据库,如果我们再次删除这此时我们就可以加上if exists这个选项,表示如果存在,就删除,我们的数据表是如何组织的呢?其实它很类似我们的ExcelExcel信息来表示相同类型信息的不同,比如第一行表示思科,第二称为”字段”,每一列表示一类信息,比如第一列表示id,第二列表示用户名,第三列表示。的信息,第二行表示的信息,第三行表示的信息。这里我们还没有学习如何建表,这里我使用我之前建立的一个表,有、音频,还有表格、文本等很多格式。们可以统一使用int这个数据类型,它表示整数。字段的类型。比如idint就表示这个字段名称为id,这个字段类型是int。关键字。各个字段,比如createtablexinxing(idint,ageint);就创建了一个xinxingid,age这里报错Nodatabaseselected,说我们还没有选择相应的数据我们可以使用use数据库名;来进入相应的数据库,这里我们选择我们刚才创建的xinxing数据库,即:注意这里usexinxing和usexinxing;都是一样的,也就是这里分我们可以使用showtables;来查看该数据库下有多少表,注意这里的tables是加了复数的,操作如下:上面我们使用的;结尾,我们还可以使用\G其中\G我们可以用showcreatetable表名;来查看我们刚才的建表语句,对于上面展示的两列信息,第一列是Table,就是表名,当然是xiinxing了,第二列是CreateTable,就是咱们的建表语句,但是貌详细介绍InnoDB这个引擎。对于字段中的 defaultcharset=latin11们在后面会介绍各种字符集。insertinto表名(列名1,2n)vlaues12...值查询一下表中的数据,我们这里可以使用select*from表名;表示insertinto表名set列名1=值1,列名2=值 列名n=值有时候我们可以插入多条数据,格式如下:insertinto表名 (列名1,列名2.....列名n) (值11,值12.....值1n),(值21,值22.....值2n)........m1m2xxxinsertintoxxx,不过这里的into是可以省略的,我们直接写insertxxx即可。值id几个员工,已知员工编号,但是不知道其,那么age字段就无age的,即insertintoxinxing(id,age)values(10,23);和insertintoxinxing(age,id)values(23,10);插入的信息是一样的。这时我们发现xinxing这个表中的两条记录是一样一样的,它并不数据库的原则,它了第二范式,但是这种表还是没问题的。有些数据库了数据就是为了不断的变更的,当然这里的变更update表名set列1122....列nnwhere这里的where其语范,这里我们只需要知道它是干什么的即可。id10age23,然后修改为88,我们操作如下:对于where2588,那么修改之后的数据应该是89,它的写法是:set列名=表达式,比如setage=age+1就表示age这个列的字1,范例:经过变换之后的值,这里我们可以指定id为10的记录的age字段的值修改为id的平方,即age字段修改为100。对于数据的修改,向来也是MySQLdelete、truncatedropdeletefrom表 id8truncate然后我们可以使用select来看一下数据库中的数据,可以看到此是存在的,我们可以用desc来看一下表结构:如果说truncate还不够彰显的心狠手辣与无情冷血,那droptablexin;可以删除该表及其表中的数据,具descxin咱们的MySQL是是否其实抛开安全性不谈,对于MyISAM的动态表会产生数据碎片,取值为0,表示未删除即可。对于查询,我们前面也介绍过了,用select *可以查询所有记录,原因之一就是业务的复杂性,我们的信息和我们想得到的信是查询操作,因此,对很多来说,查询数据库的效率往往决定着的相应速度。前面我们使用select*这种查询方式,其实是效率的方式,它select*几乎是不被允许的。select列1,列2.....列 from表 select*fromxinxing;中的*是一个通配符,表示匹配所有的列,虽然写法简单,但是它给MySQL的压力很大,因为有较多的任务需要让MySQL去做。select列名1as别名1,列名2as别名2.... 列名nas别名nfrom表名其他语句;的,但是我们使用select查询信息的时候,是可以显示中文的,也比如我们的时候,我们往往的是它的出生年份,那么当我们从数据库中检索一个人的时候,就需要经过一定的运比如我们在birth表中的是人的信息,它的数据如下除法使用的是/运算符,运算结果为浮点数。year减去idbirth具体步骤看作:函数Python编程或者Ruby当前的时间,可以使用selectnow();来输出当前时间,比如:当然啦,这里的nowMySQL参数,直接使用select查看其返回值即可。max()、minMySQL这个时候我们可以在selectdistinct子句早面讲update、insert、delete的时候,我们就接触过wherewheretrue,那么就把这些对于where子句的几种常见形式,我们在下面分类给出,如果读比较运算符用于比较两个数据,MySQLnullnull。我们用 3并且小于等于7可以使用wherexxxbetween3and7.其中 数据,这时候就需要in操作符了。id2,4,5,7的数据,那么我们的where以这么写:whereidin(2,4,5,7)。而且多个元间是用逗号分开的。not操作符表示取反,但是它一般不单独使用,它可以和between...andinid2,4,5,7idnotnot如果一条记录中的某个字段为null,那么表示该字段并没有数有时候我们对某些记录的为null的数据比较关注,我们可以用where字段名isnull来查找那些为nullwhere字段名isnotnull来查找那些不为null的字段。agenull当然我们前面也有介绍,我们也可以用where字段名<=>来找到那些字段值为null可能有人会问,那我们是否可以用where字段名=null呢,答案是不可以,就是因为该运算会返回一个null,那么该条件就会一直在我们继续向前推进之前,须再认识一种数据类型才行,那就是char类型,它表示字符类型。字符,比如char(20)表示20个字符大小的字符串。我们可以在char类型中使用中文,但是前提须使用合适的通常我们可以在建表的最后加上一个charset=gbk或者charset=utf8like运算符用于一个字符串是否与指定的字符串相匹配,当然,它适用于咱们上面所介绍的char类型。like”%”或者”_”一起使用,其中%在where字段名like匹配字符串;expression的缩写,也就是”正则表达式”.它的作用和like 力,可以跳过这部分或者阅读相关资料,我在PHP或者Python教可能朋友们初次接触like和regexp,难免会有点晕,这两者究竟答案很简单,regexp是正则匹配,它只要regexp一个子集就可以了,因此和是好朋友”regexp“辛”会返回一个true,我们看一下实例操作:likelike还是上面那个例子,我们把regexp换成like,也就是和是好朋友”like“辛”会返回一个false,看下面实例操作:true验,我们可以这么写和是好朋友”like“辛%”,这样就会返回一个true了,看作:比较运算符,比<、>、=等运算符,进行简单的比较运likeregexp(rlike),分别用来表示模对于范围比较,可以使用between...and对于null值的比较,建议使用is(not)null的方式,判断字符在员工表中查找工号最小的,它会返回一个特定的值,比如22.列值具有相同的数据类型,因此它特别适合和wherein操一条记录,比如我们就查询员工号为02321的这个员工的和工龄,那么这就返回一个1行2列的一条记录。NMselect*NMN1where子句里出现,但是我们可以从这个表里再次筛选信息,它可以像一个表一样,被from子句,也可以被exists。from(能用fromcomacombcoma从comb里面找出大于等于该编号的员工信息。可以写如下的伪SQL语句:select*fromcomb id>=Xcomaid,selectmax(id)fromselect*fromcombwhereid>=(selectmax(id)fromselectmax(id)fromcoma;返回的是一个具体的数据,也就是4,我们可以用4替换为外层查询的那如果让我们用一个SQL语句来找到公司AB注意我们这里是拿到coma和comb中相同id的coma中的信息,select*fromcoma idinselect fromselect*fromcoma idin(selectidfrom可能有朋友会说:这里只是查询的id相同的,如果要求所有信息comacomb这里对于内层循环,也就是select*fromcomb;朋友们肯定comaidand不过值得注意的是对于from型子查询,它会产生一个临时表,因此须为from表名的表指定一个别名,也就是给这个临时表指X,那么我们的外层查询即:select*fromXasxwherenameregexp‘辛’;然后我们向X中只需要产生一个随机数,并且让id小于这个随机数就可以了,这里我们使用了floor和rand()这两个随机函数:select*fromcomawhereid<=fromNM列的一个数据表,我们可以继续从它里面进行select操作,非常方知识点,,才能走得下去。comacomb,那么当我们需要用到这两个表中的字段的时候,比如coma和comb都id、name、age我们可以使用表名.字段名的方式来指定,比如就是表示表comanamecomb.id就是表示表comb的id型子查询true,那么外查询的结果就显示出来,否则外查询的结果就不combcomaselect*fromcombwhereexists(select*fromcomawherecomb.year=coma.year);combexists如果select*fromcoma a.yearexists也就是说,我们只从combexistsselect*fromcombwhereexists(select*fromcomawherecoma.year=comb.year);然后我们执行select*fromcomb,然后我们取出了一条记录,也就是(0,”张文科”,1989),然后我们执行select* fromcomawherecoma.year=comb.year,注意这里的comb.year应该被替换为1989,也就是从coma表中查找一下是否有year这个字段为1989的,显然后我们外层查询又会查询出一条记录(2,”,1987),然后我们相当于执行select*fromcomawherecoma.year=1987;发现在coma中有一条数据是(2,””,1987),因为这两个记录是相同的,们找一下coma中有没有记录的year字段为1993的,发现没有,然后我们继续搜索,又得到一条记录:(6,””,1987),然后我comayear1987,发现有一条记录是(2,””,1987),因此这两个记录的year属性是一样滴,因此,我们的(6,””,1987)会被保存到结果集中。子查询按照语句可以分为where、from、exists型子查询,子查询索引,所以很多时候会造能问题,不过我们目前还未接触索引,本节虽然名为查询进阶,主要讲述内容为groupby、having、 by、limit和union等几个关键字的使用。对于聚合函数,我们应该并不陌生,面我们已经接触过了,也就是sum用于求和、count用于统计个数、max用于求最大值、avg用于求平均值、min用于求最小值等一系列函数。groupby如果我们要查询某个部门的工资最高的员工的,而不是工资数,那么应该怎么写SQL语句呢?可能有人提议说我们可首先select出来工资最高的数目,然后再根据此数目得到id和,当然,此法是可行的,但是如何在一条SQL语句中实现这个功能呢。当然然知道了groupby总是取得该分组的第一条记录,那orderby相信读者朋友们应该对分组操作也就是group有了一个比较清晰当然groupby操作并不是只能用于一个字段,它也可以用于多个level字段进行分组,然后使用dept我们在groupbyMySQLhavingselect中检索的列和外部查询中的列。数,那么我们就可以在groupby之后用一个having count(name)>1,大家注意这里我们使用了mysql的扩展,因为我们操作的这个name字段并不是groupby子句里面的,而是我们的select的列中SQL也是mysql给我们提供的扩展那,我们用的问心无愧@_@SQLhaving这一列信息是在groupby子句中的,比如我们除去销售部这一条记havingdept‘开发部;来强硬的规定不显示销售部的信息(注:开发部的哭了)代where的作用?where和having是什么关系?第一个就是顺序问题,wheregroup第二个就是涉及的字段问题,where可以处理一切字段,但是havinggroupselecthavinggroupby明,而where的使用和groupby的使用毫无关系。wherehaving它们的使用并没有太多的不同,不同之处就是where在grouphaving在groupbywherehavinggroupbyselectid这个字段在select们的id是select列中的字段,但是我们的第二次检索中,我们的id不再是select中的字段了,因此会检索失败。但是我们使用where子句就不一样了,where中可用的字段在原则上并不受限制,因此我们前面也绝大多数使用where子句,因为having和where**********having和wheregroupgroup通常使用在groupby如果朋友们想追求尽可能的简单,那么如果我们使用groupby,可以在它后面使用having,如果我们不使用groupby,那么我们就可以不使用having了。当然我们记住这个顺序也是很重要的:wheregroup句>>having子句。它的语法格式为:limitPostgreSQLlimitmoffsetnmlimitn,limit0,这里表示从第零行开始取,取出第n条数据。我们使用”select*from 当然我们还可以直接用”select*fromcomalimit3”3为了与pgsqlpgsqlPostgreSQL,它是MySQLoffset注意的是,去n条数据是把n挨着limit写,从第m条数据开始取是把m挨着offset写。对于by了。orderby字段名 [desc|asc],字段名2[desc|asc]...asc,desc26id也就是让”在”上面,如下所示:果要把这两个查询结果拼接起来呢?这就需要union了。询的时候建立了两个表,比如coma和comb。select语 union allall,表示在结果集中保留所有数据,需要说明一下的是,我们这两个select语句得到的列数必须是匹然后我们把这两个结果集放到一起显示,首先我们使用union orderby不过要注意的一点就是对于union,它必须要求各个查询的列是我们在写一个完整的SQL语句的时候,如果上面几句都用到,那么顺序必须是:where子句>>groupby子句>>having子句>>orderby>>limit 然后分组和排序,------------------------->group和order 而且我感觉从两边向中间比从左向右要好记的多,虽然咱们写SQL语句是从左向右写。同理,不过MySQL并不支持全(外)连接。所有和aa表中的id一样的记录。 列名列表from表1leftjoin表 用自己当做一个标准来匹配表bb,因此表aa的记录是全部显示出来的,但是bb中只能有部分记录被显示出来。首先是这个SQL语句,它的select*表示列出所有的字段,这个前面也了。然后就是aaleftjoinbb,则确定了这是一个左连接,而且然后就是onaa.id=bb.id,这个条件,它说明了我们匹配的条件就是这两者的id相等,因此我们看到的上述结果集中,也就是左右两边的id都是一样的。id3的记录的,此时就会报告一个null出来。onwhere首先就是顺序问题,我们前面学习groupby、having、order我们的on和whereon在whereonwhere们首先以on条件筛选表,然后两个表左连接,但是对于where来我们先看一个试图用whereon上面之所以会报错,是因为这个左连接的连接操作需要on来提wherewhere对然后我们看一下如果去掉where我们分析一下这个流程,大家需要记住一句话:on起作用,因此,在做左连接的时候,我们发现bb表由于需要满足bb.id<3id1id2我们都知道select*fromaaleftjoinbbonaa.id=bb.id;是一个什么结果集,而后面的这个wherebb.id<3就相当于对这个结leftright回溯算法有关系,可能在之后的版本中MySQL的内部算法有所修我们上面讲左连接的时候用的是leftjoin,其实也可以用left join,也就是说这个outer是可以去掉的,因为左连接肯定是因为没有所谓的左内。我发现当我们使用where通常都没有问题,但是与on、having一起使用的时候就可能有人犯晕了,如果读者对having不熟悉,不妨on在wherecrossjoin,也可以什么都不用,直接逗号分隔crossjoin还记得我们之前的用where来筛选结果集吗?我们得到的这个164x4的时候,这个结果及也会增加的非常迅速,因此我们可以用wherebbidaaid1a1、a2a3,可能有人会问:逗号与crossjoin在表示两个交叉连接的时候有crossjoinoninnerjoinab算,就是ainnerjoinb。id,那么为何不提供一种语法来简既然我们想到了,那么MySQL早就想到了,于是就诞生usingid指定任何条件,也会变叉连接,比如:MySQLinnerjoin来连接,这里的on子句不要求两边的字段都是相同的,比如ontable1.uid=table2.gid都是可以的。级的类别,这些书籍大多数不是专门介绍MySQL的,下面我们来naturaljoin,它可以说是一种特殊的等值连接,naturaljoin第一种写法是直接使用naturaljoin的写法,即select fromaanaturaljoincc;第二种写法就是使用innerjoin的写法,即select *fromaainnerjoinccusing(id);第三种写法就是使用innerjoin的写法,不过来具体的列名,其实也没有本质区别,即select fromaainnerjoincconaa.id=cc.id;aabb.. 然后我们向staffstaffaleftjoinstaffba和b之所以要用别名,是因为咱们只用staff很难区分哪个表是基表,哪a和b进行乘积的连目前计算机中应用的最广泛的字符集及其编码,是AmericanStandardCodeforInformationInterchange,即“标准信息交ISOISO646就是Unicode。有规定这个二进制码该如何。式,它们都是Unicode。我们计算机上通常所说的UnicodeUCS-2即直接用两个字节存入字符的Unicode码。编码格式ANSIASCII中文通常是GBK。体中文的BIG5.5.从ASCII到GB2312再到GBK,这些编码方法是向下兼容的,即的字符。 BIG5GB2312GBKGBKGB18030咱们可以使用showvariableslike“%char%”我们这里说的这条特殊语句就是:setnamesxxxxxx比如setnamesutf8setcharacter_set_=setcharacter_set_connection=‘utf8’;setcharacter_set_results=’utf8’;查看字符集我们可以使用showcharset查看校对集我们可以使用showcollation;来查看,这里我们也看有好多人给我反映说这个等号在里面看很像冒号,我这里直charset和gbk间上面我们讲的都是gbk,那么对于utf-8字符集呢,注意一点,那第三种就是使用set关键字,不过这里我们就不能使用charset了,必须使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程清包施工合同
- 委托招生合作协议合同
- 幕墙分包施工合同
- 鞋子订单合同
- 供货质量保证承诺合同协议书
- 吊车汽车租赁合同
- 广告牌钢结构安装工程合同
- 茶艺师中级练习试题及答案(一)
- 营销现场作业安全管理和反窃电技能竞赛参考复习试题附答案(一)
- 银行业发展趋势与前景分析
- 12 UG NX运动仿真基础
- (完整版)10KV配电室安装工程施工方案
- 中国银行履约保函(中英文)
- 逻辑思维训练500题及答案
- 不锈钢储罐施工方案(2024043554)
- 新安全生产法主要负责人和安全管理人员职责
- VISI简单操作说明140709
- 1.铝合金阳极氧化实用工艺及全参数理论指导
- 自考00911互联网数据库 精华小抄笔记
- 油库工艺流程及设备一览表
- 1辅导员班主任谈心谈话记录表
评论
0/150
提交评论