查询:

基础查询:
1
select 要查询的内容 from 表名;
条件查询:
1
2
3
4
5
select 要查询的字段|表达式|常量值|函数

from 表名

where 条件;
模糊查询:
1
2
3
4
5
6
7
8
9
10
11
(LIKE):一般和通配符% _搭配使用。
例:查询员工名中包含字符a的员工信息。
SELECT *
FROM
employees
WHERE
last_name like '%a%';
查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT last_name,salary
FROM employees
WHERE last_name LIKE '__e_a%';(%:任意多个字符,包含0个字符。_:任意单个字符)
1
2
3
4
5
6
7
8
9
(BETWEEN AND):包含两个临界值;两个临界值不能调换顺序。
例:查询员工编号在100~200之间的员工信息
SELECT *
FROM employees
WHERE employees_id >= 100 AND employees_id <=200;
-----------------------------------------------------
SELECT *
FROM employees
WHERE employees_id BETWEEN 100 AND 200;
1
2
3
4
5
6
7
8
9
10
11
12
13
(IN):用来判断某字段的值是否属于IN列表中的某一项;IN列表的值类型必须一致或兼容;IN列表中不支持通配符。
例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id
FROM emplyoees
WHERE job_id = 'IT_PROG' OR jod_id = 'AD_VP' OR job_id = 'AD_PRES';
------------------------------------------------------------------------
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(IS NULL):=或!=和<>不能用来判断NULL值,IS NULL或IS NOT NULL可以判断NULL值。
例:查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
例:查询有奖金的员工和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NOT NULL;
----------------------------------
SELECT
last_name,
commission_pct
FROM
employees
WHERE
salary IS 12000;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
安全等于<=>
例:查询没有奖金的员工和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=>NULL;
例:查询工资为12000的员工信息
SELECT
last_name,
salary
FROM
employees
WHERE
salary <=> 12000;

IS NULL:仅仅可以判断NULL值,可读性较高(建议使用)。

<=>:既可以判断NULL值,又可以判断普通的数值,可读性较低。

排序查询:
1
2
3
4
5
select 要查询的内容 from 表

where 条件

order by 排序的字段|表达式|函数|别名 asc(默认升序)或desc(降序)
分组查询:
1
2
3
4
5
6
语法:
select 分组函数,列(要求出现在GROUP BY 后面)
form 表
【where 筛选条件】
group by 分组的列表
【order by 子句】

注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段。

特点:

1:和分组函数一同查询的字段必须是group by后出现的字段。

2:筛选分为两类:分组前筛选和分组后筛选

分组前筛选:原始表

分组后筛选:group by后的结果集

group by 前用关键字where,group by后用关键字 having

分组筛选不能放在where后面。

3:分组函数做条件肯定是放在having子句中。

能用分组前筛选的,优先考虑使用分组前筛选

4:group by 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(较少使用)。

5:也可以添加排序(排序放在整个分组查询的最后)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
例:
select 要查询的字段,分组函数 from 表
where 筛选条件
group by 分组的字段
order by 排序的字段

查询每个部门的员工个数:
SELECT COUNT(*) FROM employees WHERE department_id = 90;
简单的分组:
1:查询每个工种的员工的平均工资
SELECT AVG(salary),job_id
FROM emplyoees
GROUP BY job_id;

2:查询每个位置的部门个数
SELECT COUNT(*),location_id
FROM department
GROUP BY location_id;

3:实现分组前的筛选
查询邮箱中包含a字符的每个部门的最高工资
SELECT MAX(salary),manager_id
FROM emplyoees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

分组后筛选
①:查询每个部门的员工个数
SELECT COUNT(*),department_id
FROM emplyoees
GROUP BY departments_id;

②:筛选①的结果,查询哪个部门的员工个数>5
SELECT COUNT(*),department_id
FROM emplyoees
GROUP BY department_id
HAVING COUNT(*)>5;

4:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

5:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
manager_id>102
SELECT manager_id,MIN(salary)
FROM employees
GROUP BY manager_id
HAVING MIN(salary)>5000;

6.添加排序
例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
SELECT job_id,MAX(salary) m
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING m>6000
ORDER BY m ;

7.按多个字段分组
例:查询每个工种每个部门的最低工资,并按最低工资降序
SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;