1 基础SELECT语句
SELECT 标识选择哪些列
FROM 标识从哪个表中选择
选择全部列(*)
* 选择全部列
SELECT *
FROM employees;
选择特定的列(SELECT )
SELECT 列名 选择特定的列
SELECT last_name
FROM employees;
列的别名(AS)
AS 列的别名
"别名"可紧跟列名,也可以在列名和别名之间加入关键字**‘AS’**,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。
SELECT last_name "name",commission_pct comm
FROM employees;
字符串
- 字符串可以是 SELECT 列表中的一个字符,数字,日期。
- 日期和字符只能在单引号中出现。
- 每当返回一行时,字符串被输出一次
显示表结构(DESCRIBE)
DESCRIBE 显示表结构
DESCRIBE employees
2 过滤和排序数据
过滤(WHERE)
WHERE 将不满足条件的行过滤掉
WHERE 子句紧随 FROM 子句
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90 ;
比较运算
操作符 含义
= 等于 (不是 ==)
> 大于
>= 大于、等于
< 小于
<= 小于、等于
<> 不等于 (也可以是 !=)
其它比较运算
BETWEEN ... AND ... 在两个值之间 (包含边界)
IN(set) 等于值列表中的一个
LIKE 模糊查询
IS NULL 空值
BETWEEN ... AND ... 在两个值之间 (包含边界)
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
IN 显示列表中的值
SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201);
LIKE 选择类似的值
选择条件可以包含字符或数字:
-
% 代表零个或多个字符(任意个字符)
-
_ 代表一个字符
-
‘%’和‘-’可以同时使用。
SELECT first_nameFROM employeesWHERE first_name LIKE 'S%';
NULL
使用 IS (NOT) NULL **判断空值,**有NOT就是判断非空值
SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL;
逻辑运算
操作符 含义
AND 逻辑并
OR 逻辑或
NOT 逻辑否
排序(ORDER BY)
-
ASC(ascend): 升序
-
DESC(descend): 降序
-
ORDER BY 子句在SELECT语句的结尾
-
没有标明的话默认为升序
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY hire_date DESC;
3 分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
组函数类型
- AVG() 平均值
- COUNT() 计数
- MAX() 最大值
- MIN() 最小值
- SUM() 合计
分组数据(GROUP BY)
可以使用GROUP BY子句将表中的数据分成若干组
在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
SELECT AVG(salary)
FROM employees
GROUP BY department_id;
在GROUP BY子句中可以包含多个列
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;
非法使用组函数
- 不能在 WHERE 子句中使用组函数。
- 可以在 HAVING 子句中使用组函数。
过滤分组(HAVING)
使用 HAVING 过滤分组:
-
行已经被分组。
-
使用了组函数。
-
满足HAVING 子句中条件的分组将被显示。
SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000;
4 多表查询
Mysql 连接
使用连接在多个表中查询数据。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
- 在 WHERE 子句中写入连接条件。
- 在表中有相同列时,在列名之前加上表名前缀
等值连接
SELECT beauty.id,NAME,boyname FROM beauty ,boys
WHERE beauty.`boyfriend_id`=boys.id;
区分重复的列名
- 使用表名前缀在多个表中区分相同的列。
- 在不同表中具有相同列名的列可以用表的别名加以区分。
- 如果使用了表别名,则在select语句中需要使用表别名代替表名
- 表别名最多支持32个字符长度,但建议越少越好
表的别名
-
使用别名可以简化查询。
-
使用表名前缀可以提高执行效率。
SELECT bt.id,NAME,boyname FROM beauty bt,boys b; WHERE bt.
boyfriend_id=b.id;
连接多个表
连接 n个表,至少需要 n-1个连接条件。 例如:连接三个表,至少需要两个连接条件。
SQL99:使用ON 子句创建连接
- 自然连接中是以具有相同名字的列为连接条件的。
- 可以使用 ON 子句指定额外的连接条件。
- 这个连接条件是与其它条件分开的。
- ON 子句使语句具有更高的易读性。
分类:
- 内连接 [inner] join on
- 外连接
- 左外连接 left [outer] join on
- 右外连接 right [outer] join on
ON 子句
SELECT bt.id,NAME,boyname
FROM beauty bt
Inner join boys b
On bt.`boyfriend_id`=b.id;
使用 ON 子句创建多表连接
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
SELECT <select_list>
FROM A
LEFT JOIN B
ON A.key=B.key
SELECT <select_list>
FROM A
INNER JOIN B
ON A.key=B.key
SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.key=B.key
SELECT <select_list>
FROM A
LEFT JOIN B
ON A.key=B.key
WHERE B.key is null;
SELECT <select_list>
FROM A
RIGHT JOIN B
ON A.key=B.key
WHERE A.key is null;
SELECT <select_list>
FROM A
FULL JOIN B
ON A.key=B.key
SELECT <select_list>
FROM A
FULL JOIN B
ON A.key=B.key
WHERE A.key is null
OR B.key is null;
注:本文借鉴了尚硅谷公开课的内容,若有错误或不妥之处还望提醒。