MySQL查询操作总结归纳
跟着康师傅学了几天MySQL数据库,通过此文进行回顾总结
基本语句
SELECT... , ... , ...
FROM... , ... ( (LEFT\RIGHT ) JOIN ... ON ... )
WHERE ... AND/OR/NOT ...
GROUP BY ...
HAVING ...
ORDER BY ... ( ASC/DESC ) , ...
LIMIT ... , ...
1)from:从哪些表中筛选
2)on:关联多表查询时,去除笛卡尔积
3)where:从表中筛选的条件
4)group by:分组依据
5)having:在统计结果中再次筛选
6)order by:排序
7)limit:分页
注解:
- SELECT:选择字段
标识选择哪些列
SELECT * FROM A (显示A表中所有数据)
SELECT name,age,id FROM A (显示A表中所有的name,age,id)
SELECT salary*12 “annual Salary”–> 别名
使用关键字DISTINCT去除重复行
SELECT DISTINCT * FROM A
- FROM:选择表
标识从哪个表中选择
如上
多表查询
中图:JOIN
左上:LEFT JOIN
右上:RIGHT JOIN
#左中图
#实现A - A∩B
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 从表关联字段 IS NULL AND 等其他子句;
#右中图
#实现B - A∩B
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 从表关联字段 IS NULL AND 等其他子句;
#左下图
#实现查询结果是A∪B
#用左外的A,union 右外的B
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句
UNION
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
#右下图
#实现A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B)
#使用左外的 (A - A∩B) union 右外的(B - A∩B)
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 从表关联字段 IS NULL AND 等其他子句
UNION
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 从表关联字段 IS NULL AND 等其他子句
- WHERE: 过滤数据
与FROM贴贴
不能在 WHERE 子句中使用聚合函数
写些限制条件:
- BETWEEN A AND B 运算符 => 在A和B之间
- IN 运算符 --> 之中
SELECT ‘A’ IN( ‘A’,‘B’,‘C’)√ - NOT IN 运算符 不在什么之中
- LIKE 运算符 “像”
WHERE A LIKE ‘%a%’ => 过滤选择A中有a的
WHERE A LIKE ‘_a%’ => 过滤选择A中第二个字母是a的 - REGEXP 运算符 (正则表达式)
子查询
就是以查询作为限制条件
- 单行子查询
#返回job_id与141号员工相同,salary比143号员工多的员工姓名, #job_id和工资 SELECT last_name, job_id, salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 141) AND salary > (SELECT salary FROM employees WHERE employee_id = 143);
- 多行子查询
多行比较操作符
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
#查询平均工资最低的部门id
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
)
- 相关子查询
#查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
SELECT last_name,salary, department_id
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
)
#查询员工的id,salary,按照department_name 排序
SELECT employee_id,salary
FROM employees e
ORDER BY (
SELECT department_name
FROM departments d
WHERE e.`department_id` = d.`department_id`
);
- 关键字 EXISTS 与 NOT EXISTS
EXISTS:满足条件的
NOT EXISTS:不满足条件的
#查询公司管理者的employee_id,last_name,job_id,department_id信息
SELECT employee_id, last_name, job_id, department_id
FROM employees e1
WHERE EXISTS ( SELECT *
FROM employees e2
WHERE e2.manager_id = e1.employee_id
);
- GROUP BY:分组
一般与聚合函数配合使用
- HAVING:过滤分组
与GROUP UP搭配使用
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
- ORDER BY:排序
- ASC:升序
- DESC:降序
- LIMIT:分页
LIMIT [位置偏移量 , ] 行数
分页显式公式:(当前页数-1)每页条数,每页条数
–前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
–第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
–第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
SELECT的执行过程
SELECT …,…,…
FROM … JOIN …
ON 多表的连接条件
JOIN …
ON …
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY …,…
HAVING 包含组函数的过滤条件
ORDER BY … ASC/DESC
LIMIT …,…
END