1. SQL概述
因为查问语句应用的十分的频繁,所以很多人把查问语句单拎进去一类:DQL(数据查询语言)。
还有独自将COMMIT
、ROLLBACK
取出来称为TCL (Transaction Control Language,事务管制语言)。
DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还能够用来创立、删除、批改数据库和数据表的构造。
- 次要的语句关键字包含
CREATE
、DROP
、ALTER
等。
- 次要的语句关键字包含
DML(Data Manipulation Language、数据操作语言),用于增加、删除、更新和查询数据库记录,并查看数据完整性。
- 次要的语句关键字包含
INSERT
、DELETE
、UPDATE
、SELECT
等。 - SELECT是SQL语言的根底,最为重要。
- 次要的语句关键字包含
DCL(Data Control Language、数据管制语言),用于定义数据库、表、字段、用户的拜访权限和安全级别。
- 次要的语句关键字包含
GRANT
、REVOKE
、COMMIT
、ROLLBACK
、SAVEPOINT
等。
- 次要的语句关键字包含
2. SQL语言的规定与标准
2.1 根本规定
- SQL 能够写在一行或者多行。为了进步可读性,各子句分行写,必要时应用缩进
- 每条命令以 ; 或 \g 或 \G 完结
- 关键字不能被缩写也不能分行
对于标点符号
- 必须保障所有的()、单引号、双引号是成对完结的
- 必须应用英文状态下的半角输出形式
- 字符串型和日期工夫类型的数据能够应用单引号(' ')示意
- 列的别名,尽量应用双引号(" "),而且不倡议省略as
2.2 SQL大小写标准 (倡议恪守)
- MySQL 在 Windows 环境下是大小写不敏感的
MySQL 在 Linux 环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格辨别大小写的
- 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是疏忽大小写的。
举荐采纳对立的书写标准:
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL 关键字、函数名、绑定变量等都大写
2.3 命名规定(临时理解)
- 数据库、表名不得超过30个字符,变量名限度为29个
- 必须只能蕴含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名两头不要蕴含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保障你的字段没有和保留字、数据库系统或罕用办法抵触。如果保持应用,请在SQL语句中应用`(着重号)引起来
- 放弃字段名和类型的一致性,在命名字段并为其指定数据类型的时候肯定要保障一致性。如果数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
2.5 数据导入指令
在命令行客户端登录mysql,应用source指令导入
- 例如:mysql> source d:\mysqldb.sql
3. 显示表构造
应用DESCRIBE 或 DESC 命令,示意表构造。
- 例如:DESCRIBE employees; 或 DESC employees;
4. 多表查问
4.1 SQL99语法实现多表查问的根本语法
应用JOIN...ON子句创立连贯的语法结构:
SELECT table1.column, table2.column,table3.columnFROM table1 JOIN table2 ON table1 和 table2 的连贯条件 JOIN table3 ON table2 和 table3 的连贯条件
SQL99 采纳的这种嵌套构造十分清新、层次性更强、可读性更强,即便再多的表进行连贯也都清晰可见。如果你采纳 SQL92,可读性就会大打折扣。
语法阐明:
- 能够应用ON子句指定额定的连贯条件。
- 这个连贯条件是与其它条件离开的。
- ON子句使语句具备更高的易读性。
- 关键字 JOIN、INNER JOIN、CROSS JOIN 的含意是一样的,都示意内连贯
4.2 内连贯(INNER JOIN)的实现
语法:
SELECT 字段列表FROM A表 INNER JOIN B表ON 关联条件WHERE 等其余子句;
4.3 外连贯(OUTER JOIN)的实现
4.3.1 左外连贯(LEFT OUTER JOIN)
语法:
#实现查问后果是ASELECT 字段列表FROM A表 LEFT JOIN B表ON 关联条件WHERE 等其余子句;
4.3.2 右外连贯(RIGHT OUTER JOIN)
语法:
#实现查问后果是BSELECT 字段列表FROM A表 RIGHT JOIN B表ON 关联条件WHERE 等其余子句;
4.3.3 满外连贯(FULL OUTER JOIN)
- 满外连贯的后果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。
- SQL99是反对满外连贯的。应用FULL JOIN 或 FULL OUTER JOIN来实现。
- 须要留神的是,MySQL不反对FULL JOIN,然而能够用 LEFT JOIN UNION RIGHT join代替。
5. UNION的应用
合并查问后果
利用UNION关键字,能够给出多条SELECT语句,并将它们的后果组合成单个后果集。合并时,两个表对应的列数和数据类型必须雷同,并且互相对应。各个SELECT语句之间应用UNION或UNION ALL关键字分隔。
语法格局:
SELECT column,... FROM table1UNION [ALL]SELECT column,... FROM table2
- UNION操作符
UNION 操作符返回两个查问的后果集的并集,去除重复记录。 UNION ALL操作符
UNION ALL操作符返回两个查问的后果集的并集。对于两个后果集的重复部分,不去重。留神:执行UNION ALL语句时所须要的资源比UNION语句少。如果明确晓得合并数据后的后果数据不存在反复数据,或者不须要去除反复的数据,则尽量应用UNION ALL语句,以进步数据查问的效率。
6. SELECT的执行过程
6.1 查问的构造
#形式1:SELECT ...,....,...FROM ...,...,....WHERE 多表的连贯条件AND 不蕴含组函数的过滤条件GROUP BY ...,...HAVING 蕴含组函数的过滤条件ORDER BY ... ASC/DESCLIMIT ...,...#形式2:SELECT ...,....,...FROM ... JOIN ... ON 多表的连贯条件JOIN ...ON ...WHERE 不蕴含组函数的过滤条件AND/OR 不蕴含组函数的过滤条件GROUP BY ...,...HAVING 蕴含组函数的过滤条件ORDER BY ... ASC/DESCLIMIT ...,...#其中:#(1)from:从哪些表中筛选#(2)on:关联多表查问时,去除笛卡尔积#(3)where:从表中筛选的条件#(4)group by:分组根据#(5)having:在统计后果中再次筛选#(6)order by:排序#(7)limit:分页
6.2 SELECT执行程序
1. 关键字的程序是不能颠倒的
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...
2.SELECT 语句的执行程序(在 MySQL 和 Oracle 中,SELECT 执行程序基本相同)
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
比方你写了一个 SQL 语句,那么它的关键字程序和执行程序是上面这样的:SELECT DISTINCT player_id, player_name, count(*) as num # 程序 5FROM player JOIN team ON player.team_id = team.team_id # 程序 1WHERE height > 1.80 # 程序 2GROUP BY player.team_id # 程序 3HAVING num > 2 # 程序 4ORDER BY num DESC # 程序 6LIMIT 2 # 程序 7
在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个
虚构表
,而后将这个虚构表传入下一个步骤中作为输出。须要留神的是,这些步骤隐含在 SQL 的执行过程中,对于咱们来说是不可见的。
6.3 SQL 的执行原理
- SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经验上面的几个步骤:
- 首先先通过 CROSS JOIN 求笛卡尔积,相当于失去虚构表 vt(virtual table)1-1;
- 通过 ON 进行筛选,在虚构表 vt1-1 的根底上进行筛选,失去虚构表 vt1-2;
- 增加内部行。如果咱们应用的是左连贯、右链接或者全连贯,就会波及到内部行,也就是在虚构表 vt1-2 的根底上减少内部行,失去虚构表 vt1-3。