1.SQL概述由于查询语句的使用非常频繁,所以很多人将查询语句单独归为一类:DQL(DataQueryLanguage)。还有一个单独的COMMIT和ROLLBACK叫做TCL(TransactionControlLanguage,事务控制语言)。DDL(DataDefinitionLanguages,数据定义语言),这些语句定义了数据库、表、视图、索引等不同的数据库对象,也可以用来创建、删除、修改数据库和数据表的结构。主要语句关键字包括CREATE、DROP、ALTER等。DML(DataManipulationLanguage,数据操纵语言),用于对数据库记录进行增、删、改、查询,检查数据完整性。主要的语句关键字有INSERT、DELETE、UPDATE、SELECT等,SELECT是SQL语言的基础,是最重要的。DCL(DataControlLanguage,数据控制语言),用于定义数据库、表、字段、用户访问权限和安全级别。主要的语句关键字有GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。2.SQL语言的规则和规范2.1基本规则SQL可以写成一行或多行。为了提高可读性,每个条款都写在单独的行上,并在必要时缩进。每个命令以;结尾或\g或\G。关键字不能缩写,也不能分行。关于标点符号,所有(),单引号,双引号成对结尾,英文必须使用半角输入法。字符串和日期时间数据可以使用单引号('')来指示列别名。尽量使用双引号(""),不建议省略as2.2SQL大小写规范(建议遵循)MySQL在Windows环境下不区分大小写MySQL在Linux环境下区分大小写数据库名、表名、表别名、变量名严格区分大小写关键字、函数名、列名(或字段名)、列别名(字段别名)不区分大小写。建议采用统一的书写标准:数据库名、表名、表别名、字段名、字段别名等全部小写;SQL关键字、函数名、绑定变量等全部大写。30个字符,变量名限制在29个只能包含A-Z、a-z、0-9、_共63个字符数据库名、表名、字段名和其他对象名同名不能包含空格MySQL软件在同一个数据库中,数据库不能重名;在同一个库中,表不能重名;同一张表中,字段不能重名。您必须确保您的字段不与保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(强调符号),以保持字段名和类型的一致性。在命名字段并为其指定数据类型时一定要确保一致性。如果数据类型在一个表中是整数,那么在另一个表中不要将其更改为字符类型。2.5数据导入命令在命令行客户端登录mysql,使用source命令导入,例如:mysql>sourced:\mysqldb。sql3。要显示表结构,请使用DESCRIBE或DESC命令指示表结构。例如:描述员工;或DESC员工;4、多表查询4.1SQL99语法实现多表查询的基本语法使用JOIN...ON子句创建连接的语法结构:SELECTtable1.column,table2.column,table3.columnFROMtable1JOINtable2ONtable1和table2的连接条件JOINtable3ONtable2和table3的连接条件SQL99采用的嵌套结构很清爽,更有层次感,可读性更强,即使多表join也清晰明了。如果使用SQL92,可读性会大大降低。语法说明:可以使用ON子句指定其他连接条件。此连接条件独立于其他条件。ON子句使语句更具可读性。JOIN、INNERJOIN、CROSSJOIN这几个关键字含义相同,都代表内连接。4.2内连接(INNERJOIN)实现语法:SELECT字段列表FROMA表INNERJOINB表ON关联条件WHERE等子句;4.3OUTERJOIN的实现4.3.1左外连接(LEFTOUTERJOIN)语法:#实现查询结果为ASELECT字段列表FROMA表LEFTJOINB表ON关联条件WHERE等子句;4.3.2右外连接(RIGHTOUTERJOIN)语法:#实现查询结果为BSELECT字段列表FROMA表RIGHTJOINB表ON关联条件WHERE等子句;4.3.3全外连接(FULLOUTERJOIN)全外连接的结果=左右表匹配数据+左表不匹配数据+右表不匹配数据。SQL99支持全外连接。使用FULLJOIN或FULLOUTERJOIN来实现。需要注意的是MySQL不支持FULLJOIN,但是可以使用LEFTJOINUNIONRIGHTjoin代替。5.使用UNION组合查询结果使用UNION关键字,可以给出多个SELECT语句并将它们的结果组合成一个结果集。合并时,两张表对应的列数和数据类型必须相同且一一对应。使用UNION或UNIONALL关键字来分隔各种SELECT语句。语法格式:SELECTcolumn,...FROMtable1UNION[ALL]SELECTcolumn,...FROMtable2UNIONoperatorUNION运算符返回两个查询的结果集的并集,并删除重复的记录。UNIONALL运算符UNIONALL运算符返回两个查询的结果集的并集。对于两个结果集重复的部分,不做去重。注意:执行UNIONALL语句所需的资源比UNION语句少。如果明确知道合并数据后的结果数据中没有重复数据,或者不需要去除重复数据,可以尝试使用UNIONALL语句来提高数据查询效率。6、SELECT的执行过程6.1查询结构#方法一:SELECT...,....,...FROM...,...,....WHERE多表连接条件AND不包含组函数GROUPBY...,...HAVING的过滤条件包含组函数ORDERBY...ASC/DESCLIMIT...,...的过滤条件#方法二:SELECT...,....,...FROM...JOIN...ON多表的连接条件JOIN...ON...WHERE不包含组函数的过滤条件AND/OR不包含组函数的过滤条件GROUPBY...,...HAVING包含组函数的过滤条件ORDERBY...ASC/DESCLIMIT...,...#Where:#(1)from:从哪些表过滤#(2)on:链接多表时queries,removeCartesianproduct#(3)where:conditiontofilterfromtable#(4)groupby:groupingbasis#(5)having:在统计结果中再次过滤#(6)orderby:sorting#(7)limit:Pagination6.2SELECT执行顺序1.关键字顺序不能颠倒SELECT...FROM...WHERE...GROUPBY...HAVING...ORDERBY...LIMIT...2.SELECT语句执行顺序(在MySQL和Oracle中,SELECT的执行顺序基本相同)FROM->WHERE->GROUPBY->HAVING->SELECTfields->DISTINCT->ORDERBY->LIMIT比如你写一条SQL语句,那么它的关键字顺序和执行顺序如下:SELECTDISTINCTplayer_id,player_name,count(*)asnum#order5FROMplayerJOINteamONplayer.team_id=team.team_id#order1WHEREheight>1.80#order2GROUPBYplayer.team_id#Order3HAVINGnum>2#Order4ORDERBYnumDESC#Sequence6LIMIT2#Sequence7当SELECT语句执行这些步骤时,每一步都会生成一个虚拟表,然后将这个虚拟表作为输入传递给下一步。需要注意的是,这些步骤意味着SQL的执行过程中,对我们来说是不可见的。6.3SQL执行原理SELECT先执行FROM。这个阶段,如果是多表联合查询,会经过以下几个步骤:首先,通过CROSSJOIN得到笛卡尔积,相当于得到虚表vt(虚表)1-1;通过ON过滤,在虚拟表vt1-1的基础上过滤得到虚拟表vt1-2;添加外部行。如果我们使用leftjoin、rightjoin或fulljoin,都会涉及到外部行,即在虚表vt1-2的基础上增加外部行,得到虚表vt1-3。
