基础查询

SELECT 字段 
FROM 表名;
解析:从 student 表中查询 name 与 age

条件查询

SELECT 字段 
FROM 表名 
WHERE 条件;
举例:
SELECT name 
FROM student 
WHERE age = 15;
解析:从 student 表中查询 age = 15 的 name

模糊查询

SELECT 字段 
FROM 表名 
WHERE 字段 like '%数据%';

举例:
SELECT * 
FROM student 
WHERE name like '%张%';
解析:从 student 表中查询 name 中含有 '张' 的所有记录

算术运算符

语法:>(大于), <(小于), =(等于), !=(不等于), <>(不等于), >=(大于等于), <=(小于等于)

举例:
SELECT * 
FROM student 
WHERE age < 15;
解析:从 student 表中查询 age < 15 的所有记录

逻辑运算符

and(且), or(或), not(非)
举例:
SELECT * 
FROM student 
WHERE age = 15 OR sex = 'man';
解析:从 student 表中查询 age = 15 或 sex = 'man' 的所有记录

IN与NOT IN运算符

SELECT 字段 
FROM 表名 
WHERE 字段 IN(列表) 或 NOT IN(列表);

举例:
SELECT * FROM student 
WHERE age IN(13, 14, 15);
解析:从 student 表中查询 age 为 (13, 14, 15) 之间的所有记录

范围运算

语法:用来替换算术运算符
SELECT 字段 
FROM 表名 
WHERE 字段 
BETWEEN 范围1 AND 范围2;

举例:
SELECT * 
FROM student 
WHERE age BETWEEN 13 AND 15;
解析:从 student 表中查询 age >= 13 and age <= 15 的所有记录

等价于 
SELECT * 
FROM student 
WHERE age >= 13 AND age <= 15;

排序查询

SELECT 字段
FROM 表
ORDER BY 字段1 DESC / ASC, 字段1 DESC / ASC;

SELECT 字段
FROM 表
ORDER BY 1 DESC / ASC, 1 DESC / ASC;

DESC降序
ASC升序

举例:查询出所有员工的信息,并按薪资降序排序
SELECT last_name, salary
FROM employees
ORDER BY salary DESC;

SELECT last_name, salary
FROM employees
ORDER BY 1 DESC;

分组查询

聚合函数

聚合函数分类:
MAX、 MIN、 AVG、 SUM、 COUNT
MAX、 MIN 用来获取最大值和最小值
AVG、SUM 用来求平均值和总和
COUNT 用来计数

举例:查询出整个公司员工的个数
SELECT COUNT(*)
FROM employees e;

1.COUNT(字段) 用来统计字段非空个数
2.COUNT(1)等价于COUNT(*) 用来统计记录个数

举例:查询出公司最低薪资
SELECT min(e.salary)
FROM employees e;

举例:查询出公司每个月总薪资支出
SELECT SUM(e.salary)
FROM employees e;

分组查询

分组查询 相当于对指定字段的每一组数据进行聚合函数
语法:
SELECT 分组字段(可选), 聚合函数(字段)
FROM 表
GROUP BY 分组字段;

举例:查询每个部门的最高薪资
SELECT e.department_id, MAX(e.salary)
FROM employees e
GROUP BY e.department_id;

数据过滤
分组前使用 WHERE
分组后使用 HAVING
注意 HVING中可以使用聚合函数 而WHERE中不可以使用

SELECT 分组字段(可选), 聚合函数(字段)
FROM 表
WHERE 过滤条件
GROUP BY 分组字段
HAVING 过滤条件;

举例:查询出平均工资大于1万的部门
SELECT e.department_id, AVG(e.salary)
FROM employees e
GROUP BY e.department_id
HAVING AVG(e.salary) > 10000;

脚下留心:
1、如果是分组查询,查询字段必须是分组字段和聚合函数。
2、查询字段是普通字段,只取第一个值

分页查询

语法:limit可以限制制定查询结果的记录条数
SELECT 字段 
FROM 表名 
LIMIT n, m;


SELECT * 
FROM student 
LIMIT 3, 5;
解析:从 student 表中查询第四行开始的5条记录,但要注意的是 0 表示第一行记录,也是从 0 开始计算序号(相当于C语言中数组下标)

嵌套查询(子查询)

语法:嵌套查询也就是在查询语句中包含有子查询语句,所以叫嵌套查询,没有单独的语法,嵌套子查询通常位于查询语句的条件之后(也可以位于其他关键字后);
分类
单行子查询:
子查询只返回单个值
可以使用 > >= < <= = != 来对子查询的结果进行判断

举例:
SELECT `name`, age 
FROM student 
WHERE `name` = (
    SELECT `name `
    FROM engScore 
    WHERE score = 100
)
解析:查询 student 表中 (engScore 表中 score = 100 的 `name`)的 `name`,age 记录
也就是说通过查询 engScore 表中的一百分得到姓名,然后用这个姓名当作条件查询 student 表中的姓名与年龄
                  
多行子查询:
子查询返回多个数据
可以使用 IN/ANY/ALL 来对子查询的结果进行判断是否满足指定条件
IN/NOT IN:判断是否有等于子查询中的数值
ANY:判断是否满足子查询里面任意一个值
ALL:判断是否满足子查询里所有值
其中ANY需要和 > >= < <=  =配合使用
ALL需要和 > >= < <= 配合使用
EXISTS/ NOT EXISTS 关键字
EXISTS 子查询用来判断子查询中是否存在有数据
NOT EXISTS 子查询用来判断子查询是不是为空

举例:
查询出所有有员工的部门信息
SELECT d.*
FROM departments d
WHERE EXISTS(
    SELECT *
    FROM employees e
    WHERE d.department_id = e.department_id
);

查询出所有没有员工的部门信息
SELECT d.*
FROM departments d
WHERE NOT EXISTS(
    SELECT *
    FROM employees e
    WHERE d.department_id = e.department_id
);

多表连接查询

内连接

SELECT *
FROM 表1, 表2
WHERE 表1.连接字段 = 表2.连接字段;

SELECT *
FROM 表1
INNER JOIN 表2 
ON 表1.连接字段 = 表2.连接字段;

SELECT *
FROM 表1
INNER JOIN 表2 
USING(连接字段);

举例:
查询出所有员工的姓氏+所在部门的名称
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;

SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;

SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d
USING(department_id);

左外连接

SELECT *
FROM 表1
LEFT JOIN 表2 
ON 表1.连接字段 = 表2.连接字段;

举例:查询出所有没有部门的员工信息
SELECT e.*
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_id IS NULL;

右外连接

SELECT *
FROM 表1
RIGHT JOIN 表2 
ON 表1.连接字段 = 表2.连接字段;

举例:查询出所有没有员工的部门信息
SELECT d.*
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
WHERE e.department_id IS NULL;

合并查询

将多个查询的结果合并为一个
查询1
UNION
查询2;
使用UNION会对重复记录进行去重,而使用UNION ALL则不会去重重复记录会保留

举例:查询出50号部门和100号部门的员工信息 分别使用两个查询
SELECT *
FROM employees e
WHERE e.department_id =  50
UNION
SELECT *
FROM employees e
WHERE e.department_id =  100;

注意:每个查询的字段顺序和数据类型需要一一对应