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.column FROM 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)
-
语法:
# 实现查问后果是 A SELECT 字段列表 FROM A 表 LEFT JOIN B 表 ON 关联条件 WHERE 等其余子句;
4.3.2 右外连贯(RIGHT OUTER JOIN)
-
语法:
# 实现查问后果是 B SELECT 字段列表 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 table1 UNION [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/DESC
LIMIT ...,...
#形式 2:SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连贯条件
JOIN ...
ON ...
WHERE 不蕴含组函数的过滤条件
AND/OR 不蕴含组函数的过滤条件
GROUP BY ...,...
HAVING 蕴含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#其中:#(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 # 程序 5 FROM player JOIN team ON player.team_id = team.team_id # 程序 1 WHERE height > 1.80 # 程序 2 GROUP BY player.team_id # 程序 3 HAVING num > 2 # 程序 4 ORDER BY num DESC # 程序 6 LIMIT 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。