




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MySQL进阶SELECT语法篇从基本语法可以看出,最简单的SELECT语句是SELECT select_list,实际上利用这个最简单的SELECT语句,你也可以完成许多你期待的功能,首先你能利用它进行MySQL所支持的任何运算,例如:SELECT 1+1,它将返回2;其次,你也能利用它给变量赋值,而在PHP中,运用SELECT语句的这种功能,你就可以自由地运用MySQL的函数为PHP程序进行各种运算,并赋值给变量。在很多的时候,你会发现MySQL拥有许多比PHP更为功能强大的函数。MySQL中SELECT语句的基本语法是:SELECT STRAIGHT_JOIN SQL_SMALL_RESULT SQL_BIG_RESULT HIGH_PRIORITY DISTINCT|DISTINCTROW|ALLselect_listINTOOUTFILE|DUMPFILEfile_nameexport_options FROMtable_references WHEREwhere_definition GROUPBYcol_name,. HAVINGwhere_definition ORDERBYunsighed_integer|col_name|formura ASC|DESC,. LIMIToffset,rows PROCEDUREprocedure_nameSTRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、HIGH_PRIORITY是MySQL对ANSISQL92的扩展。如果优化器以非最佳次序联结表,使用STRAIGHT_JOIN可以加快查询。SQL_SMALL_RESULT和SQL_BIG_RESULT是一组相对的关键词。它们必须与GROUPBY、DISTINCT或DISTINCTROW一起使用。SQL_SMALL_RESULT告知优化器 结果会很小,要求MySQL使用临时表存储最终的表而不是使用排序;SQL_BIG_RESULT告知优化器 结果很小,要求MySQL使用排序而不是做临时表。HIGH_PRIORITY将赋予SELECT比一个更新表的语句更高的优先级,使之可以进行一次优先的快速的查询。以上四个关键词的使用方法的确比较晦涩。幸运的是,在绝大多数情况下,在MySQL中我们完全可以选择不使用这四个关键词。DISTINCT、DISTINCTROW对查询返回的结果集提供了一个最基本但是很有用的过滤。那就是结果集中只含非重复行。在这里要注意的是,对关键词DISTINCT、DISTINCTROW来说,空值都是相等的,无论有多少NULL值,只选择一个。而ALL的用法就画蛇添足了。它对结果集的产生没有任何影响。INTOOUTFILE|DUMPFILEfile_nameexport_options,将结果集写入一个文件。文件在服务器主机上被创建,并且不能是已经存在的。语句中的export_options部分的语法与用在LOADDATAINFILE语句中的FIELDS和LINES子句中的相同,我们将在MySQL进阶_LOADDATA篇中详细讨论它。而OUTFILE与DUMPFILE的关键字的区别是:后前只写一行到文件,并没有任何列或行结束。selectlist:其中可以包含一项或多项下列内容:1、“*”,表示按照createtable的顺序排列的所有列。2、按照用户所需顺序排列的列名的清单。3、可以使用别名取代列名,形式如下:columnnameascolumn_heading。4、表达式(列名、常量、函数,或以算术或逐位运算符连接的列名、常量和函数的任何组合)。5、内部函数或集合函数。6、上述各项的任何一种组合。FROM:决定SELECT命令中使用哪些表。一般都要求有此项,除非select_list中不含列名(例如,只有常量、算术表达式等)。如果表项中有多个表,用逗号将之分开。在关键词FROM后面的表的顺序不影响结果。表名可以给出相关别名,以便使表达清晰。这里的语法是tbl_nameASalias_name。例如:, t2.salaryfromemployeeast1, = 与, t2.salaryfromemployeet1, = 是完全等价的。所有对该表的其他引用,例如在where子句和having子句中,都要用别名,别名不能以数字开头。where子句设置了搜索条件,它在insert,update,delete语句中的应用方法也与在select语句中的应用方法完全相同。搜索条件紧跟在关键词where的后面。如果用户要在语句中使用多个搜索条件,则可用and或or连接。搜索条件的基本语法是notexpressioncomparison_operatorexpression;notexpressionnotlike“match_string”;notexpressionisnotnull;notexpressionnotbetweenexpressionandexpression;notcolumn_namejoin_operatorcolumn_name;notboolean_expression。and:用来联结两个条件,并在两个条件都是TRUE的时候返回结果。当在同一语句中使用多个逻辑运算符时,and运算符总是最优先,除非用户用括号改变了运算顺序。or:用来联结两个条件,当两个条件中有任一条件是TRUE的时候返回结果。当在同一语句中使用多个逻辑运算符时,运算符or通常在运算符and之后进行运算。当然用户可以使用括号改变运算的顺序。between:用来标识范围下限的关键词,and后面跟范围上限的值。范围wherevalbetweenxandy包含首尾值。如果between后面指定的第一个值大于第二个值,则该查询不返回任何行。column_name:在比较中使用的列名。在会产生歧义时,要指明列所在的表名。comparison_operator:比较运算符:=等于;大于;=大于等于;=小于等于;!=不等于;不等于在比较char,varchar 型数据时,“”代表更接近字母表尾部。一般来说,小写字母大于大写字母,大写字母大于数字,但是这可能依赖于服务器上操作系统的比较顺序。在比较时末尾的空格是被忽略的。例如“Dirk”等于“Dirk”。在比较日期时,“”表示晚于。在使用比较运算符比较character和datetime数据时,需用引号将所有数据引起来。expression:可能是列名、常数、函数或者是列名或常数的任意组合,以及以算术运算符或逐位运算符连接的函数。算术运算符 如下所示:符号意义: +加号 ; -减号; *乘号; /除号isnull:在搜索一个NULL值时使用。like:关键词,对char、varchar和datetime(不包括秒和毫秒)可以使用like,在MySQL中like也可以用在数字的表达式上。当用户在搜索datetime型数据时,最好是使用关键词like,因为完整的datetime记录包含各种各样的日期组件。例如用户在列arrival_time中加入一个值“9:20”,而子句wherearrival_time =“9:20”却没有发现它,因为MySQL把录入的数据转换成了“Jan1,19009:20AM”。然而子句wherearrival_timelike “%9:20%” 就能找到它。boolean_expression:返回“true”或“false”值的表达式。match_string:由字符和通配符组成的串,用单引号或双引号引起来,是匹配模式。通配符如下表所示: 符号意义: % 表示0或多个字符的字符串; _ 表示任何一个单个字符not:否定任何逻辑表达式,或是关键词,如like,null,between等。groupby和having子句在select语句中使用,可以将表划分成组并返回匹配having子句条件的组。语法:select语句开头groupbyallaggregate_free_expression,aggregate_free_expression*havingsearch_conditionsselect语句结尾groupby:指定表将划分的组群,如果在select表项中包含集合函数,则为各组计算一个总计值。这些总计值的结果以新的列显示,而不是新的行。在having子句中用户可以引用这些新的总计列。在groupby之前的select_list中可以使用avg、count、max、min和sum等集合函数。表可以被任意列的组合分组。all:在结果中包含所有组群的Transact-SQL扩展,这里的所有组群甚至包括那些被where子句所排除的组群。如果同时使用having子句,将对all的意义进行否定。aggregate_free_expression:不包含集合函数的表达式,Transact-SQL扩展允许在用列名称分组的同时,用无集合函数的表达式分组。having:为groupby子句设置条件,类似于where为select语句设置条件的方法。having的查找条件可以包括集合函数表达式。除此之外,它的查找条件与where查找条件相同。orderby:按列排列结果。对select输出的列可以用列名、列别名或列位置来引用。例如:selectidasmyid, nameasmynamefrommytablegroupbyid、selectidasmyid, nameasmynamefrommytablegroupbymyid、selectidasmyid, nameasmynamefrommytablegroupby1这三句是完全等价的。当然,我们不赞成用第三种用法,这将给程序的可读性带来不好的影响。为了以降序排列,把DESC关键词加到orderby子句中你要排序的列名前。缺省是升序,你也可以用ASC关键词明确指定。limit子句:用来限制select语句返回的行数。limit取1个或2个数字参数,如果给定2个参数,第一个指定要返回的第一行的偏移量,第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。如果给定一个参数,它指出偏移量为0的返回行的最大数目。也就是说limit5和limit0, 5完全等价。至于procedure关键词的含义,我也没搞得太清楚,好象是对存储过程的支持,而MySQL本身不支持存储过程,看来是为了将来扩充的需要而保留的吧。MySQL创建计算字段1、字段字段与列含义差不多,数据库列 一般叫列,字段一般是指计算字段2、拼接字段拼接将值连接到一起构成单个值Concat()函数SELECT Concat(name,(,country,) AS title FROM company Order BY name;这里的AS title,是取别名,title就是计算字段3、执行算数计算可以进行加减乘除的运算Select prod_num*prod_price,prod_name FROM products4、如何测试计算SELECT 3*2,将返回6SELECT NOW(),将返回现在时间mysql insert 语法INSERT LOW_PRIORITY |DELAYED| HIGH_PRIORITY IGNORE INTO tbl_name (col_name,.) VALUES (expr| DEFAULT, .),(.),. ON DUPLICATE KEY UPDATE col_name = expr, . 或:INSERT LOW_PRIORITY |DELAYED| HIGH_PRIORITY IGNORE INTO tbl_name SETcol_name = expr| DEFAULT, . ON DUPLICATE KEY UPDATE col_name = expr, . 或:INSERT LOW_PRIORITY | HIGH_PRIORITY IGNORE INTO tbl_name (col_name,.) SELECT . ON DUPLICATE KEY UPDATE col_name = expr, . 一、DELAYED的使用使用延迟插入操作DELAYED调节符用于INSERT和REPLACE语句。当DELAYED插入操作到达的时候,服务器把数据行放入一个队列中,并立即给客户端返回一个状态信息,这样客户端就可以在数据表被真正地插入记录之前继续进行操作了。如果读取者从该数据表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器还要检查是否有新的读取请求到达和等待。如果有,延迟数据行队列就被挂起,允许读取者继续操作。当没有读取者的时候,服务器再次开始插入延迟的数据行。这个过程一直进行,直到队列空了为止。几点要注意事项: INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED.SELECT语句的DELAYED。 服务器忽略用于INSERT DELAYED.ON DUPLICATE UPDATE语句的DELAYED。 因为在行被插入前,语句立刻返回,所以您不能使用LAST_INSERT_ID()来获取AUTO_INCREMENT值。AUTO_INCREMENT值可能由语句生成。 对于SELECT语句,DELAYED行不可见,直到这些行确实被插入了为止。 DELAYED在从属复制服务器中被忽略了,因为DELAYED不会在从属服务器中产生与主服务器不一样的数据。注意,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,如果您强行中止了mysqld(例如,使用kill -9)或者如果mysqld意外停止,则所有没有被写入磁盘的行都会丢失。二、IGNORE的使用IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTER TABLE的运行。如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。insert ignore into tb (.) value(.)这样不用校验是否存在了,有则忽略,无则添加三、ON DUPLICATE KEY UPDATE的使用如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:mysql INSERT INTO table (a, b, c) VALUES (1,2,3) - ON DUPLICATE KEY UPDATE c=c+1;Mysql UPDATE table SET c=c+1 WHERE a=1;如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:Mysql UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT.UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT.UPDATE语句中有意义,其它时候会返回NULL。示例:Mysql INSERT INTO table (a, b, c) VALUES (1, 2, 3), (4, 5, 6) -ON DUPLICATE KEY UPDATE c= VALUES (a) + VALUES (b);本语句与以下两个语句作用相同:Mysql INSERT INTO table (a, b, c) VALUES (1, 2, 3) -ON DUPLICATE KEY UPDATE c=3;Mysql INSERT INTO table (a, b, c) VALUES (4, 5, 6) -ON DUPLICATE KEY UPDATE c=9;当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。总结:DELAYED 作为快速插入,并不是很关心失效性,提高插入性能。 ignore 只关注主键对应记录是不存在,无则添加,有则忽略。 ON DUPLICATE KEY UPDATE 在添加时操作,关注非主键列,注意与ignor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全骨干培训剖析材料课件
- 湖南省新化县2026届化学九上期中达标检测试题含解析
- 设备安全操作与技能培训课件
- 海航安全员岗前培训心得
- 海盾安全培训课件
- 买卖废铁合同范文3篇
- 安全驾驶培训车课件
- 安全驾驶培训课程表课件
- 流通股权质押协议3篇
- 肥料原料供销合同4篇
- 布袋除尘器性能评估方案
- 2024年11月人力资源管理师三级真题及答案
- 《便携式挥发性有机物检测仪 (PID)技术要求及监测规范》
- JGJ46-2024 建筑与市政工程施工现场临时用电安全技术标准
- 《铁路轨道维护》课件-钢轨钻孔作业
- 《酶切连接与转化》课件
- 中药处方点评培训
- 危险固体废物处理项目可行性研究报告
- 西点制作工艺-第二版教材全套课件教学教程整本书电子教案全书教案课件
- 酸枣仁介绍课件
- 软硬结合板的设计制作与品质要求
评论
0/150
提交评论