文章目录
一、单表查询
查询:用户根据不同的方式从数据库表中获取自己所需要的数据
是数据库操作中非常重要且非常频繁的
1.1 创建数据库
1.创建新库company
2.在company库中创建emp(雇员表)
emp(雇员编号empno
雇员名称empname
雇员的职位empjob
雇员领导编号empleaderno
雇员入职日期hiredate
雇员月薪salary
雇员的津贴allowance
雇员部门编号deptno)
3.给表插入数据
#创建库
create database company charset utf8mb4;
#创建表
create table emp(
empno int unsigned not null primary key auto_increment,
empname varchar(20),
empjob varchar(20),
empleaderno int unsigned,
hiredate date,
salary decimal(10,3),
allowance decimal(10,3),
deptno tinyint unsigned
)
mysql> desc emp;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| empno | int(10) unsigned | NO | PRI | NULL | auto_increment |
| empname | varchar(20) | YES | | NULL | |
| empjob | varchar(20) | YES | | NULL | |
| empleaderno | int(10) unsigned | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,3) | YES | | NULL | |
| allowance | decimal(10,3) | YES | | NULL | |
| deptno | tinyint(3) unsigned | YES | | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
# 插入数据
insert into emp values
(7369, 'Smith', 'clerk ', 7902,'1980-12-17',800, null, 20),
(7499, 'Allen', 'salesman', 7698,'1981-02-20', 1600,300,30),
(7521, 'Ward' , 'salesman', 7698, '1981-02-22',1250,500,30),
(7566, 'Jones', 'manager', 7839,'1981-04-02',2975, null, 20),
(7654, 'Maritn', 'salesman', 7698,'1981-09-28',1250, 1400,30),
(7698,'Blake', 'manager', 7839,'1981-05-01', 2850,null, 30),
(7782,'Clark' , 'manager', 7839,'1981-06-09', 2450, null, 10),
(7788, 'Scott', 'analyst', 7566,'1987-04-19',3000, null, 20),
(7839, 'King', 'president', null, '1981-11-17', 5000, null, 10),
(7844, 'Turner' , 'salesman', 7698,'1981-09-08',1500,0,30),
(7876, 'Adams', 'clerk', 7788,'1987-05-23',1100, null, 20),
(7900, 'James', 'clerk', 7698,'1981-12-03', 950, null, 30),
(7902,'Ford', 'analyst', 7566,'1981-12-03', 3000, null, 20),
(7934, 'Miller' , ' clerk', 7782,'1982-01-23', 1300,null, 10);
注:由于手误原因,最后一行' clerk'多打一个空格,实验中途才发现,最后改正了,但是不影响实验效果。
1.2 单表查询
1.2.1 查询所有字段
语法:
select 字段名1,字段名2... from 表名
例如:查询雇员表中雇员姓名、编号、职位、领导号、入职时间、薪资、奖金、部门编号
mysql> select empno,empname,empjob,empleader,hiredate,salary,allowance,deptno from emp;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
1.2.2 使用通配符*查询所有字段
语法:select * from 表名
例如:查询雇员表中所有信息
select * from emp;
1.2.3 查询指定字段
语法:select 字段名1,字段名2... from 表名
例如:查询雇员表中雇员姓名、职位、部门号、薪资
mysql> select empname,empjob,deptno,salary from emp;
+---------+-----------+--------+----------+
| empname | empjob | deptno | salary |
+---------+-----------+--------+----------+
| Smith | clerk | 20 | 800.000 |
| Allen | salesman | 30 | 1600.000 |
| Ward | salesman | 30 | 1250.000 |
| Jones | manager | 20 | 2975.000 |
| Maritn | salesman | 30 | 1250.000 |
| Blake | manager | 30 | 2850.000 |
| Clark | manager | 10 | 2450.000 |
| Scott | analyst | 20 | 3000.000 |
| King | president | 10 | 5000.000 |
| Turner | salesman | 30 | 1500.000 |
| Adams | clerk | 20 | 1100.000 |
| James | clerk | 30 | 950.000 |
| Ford | analyst | 20 | 3000.000 |
| Miller | clerk | 10 | 1300.000 |
+---------+-----------+--------+----------+
1.2.4 去重distinct的使用
语法:select distinct 字段名1,字段名2 ...from 表名
例如:查询雇员的部门号
查询雇员在哪几个部门号中
mysql> select distinct deptno from emp;
+--------+
| deptno |
+--------+
| 20 |
| 30 |
| 10 |
+--------+
distinct使用到多个字段上
例如:查询雇员部门号及职位
对比如下两种查询方式
mysql> select distinct deptno,empjob from emp;
+--------+-----------+
| deptno | empjob |
+--------+-----------+
| 20 | clerk |
| 30 | salesman |
| 20 | manager |
| 30 | manager |
| 10 | manager |
| 20 | analyst |
| 10 | president |
| 30 | clerk |
| 10 | clerk |
+--------+-----------+
9 rows in set (0.00 sec)
mysql> select deptno,empjob from emp;
+--------+-----------+
| deptno | empjob |
+--------+-----------+
| 20 | clerk |
| 30 | salesman |
| 30 | salesman |
| 20 | manager |
| 30 | salesman |
| 30 | manager |
| 10 | manager |
| 20 | analyst |
| 10 | president |
| 30 | salesman |
| 20 | clerk |
| 30 | clerk |
| 20 | analyst |
| 10 | clerk |
+--------+-----------+
注意:distinct使用到多个字段上,只有多个字段的值都相同时才去重
1.2.5 查询中使用算术运算符
例如:查询雇员的年薪
mysql> select empname,salary*12 from emp;
+---------+-----------+
| empname | salary*12 |
+---------+-----------+
| Smith | 9600.000 |
| Allen | 19200.000 |
| Ward | 15000.000 |
| Jones | 35700.000 |
| Maritn | 15000.000 |
| Blake | 34200.000 |
| Clark | 29400.000 |
| Scott | 36000.000 |
| King | 60000.000 |
| Turner | 18000.000 |
| Adams | 13200.000 |
| James | 11400.000 |
| Ford | 36000.000 |
| Miller | 15600.000 |
+---------+-----------+
1.2.6.给字段起别名
语法:select 字段名1 [as] 别名,字段名2 .....from 表名
例如:查询雇员的年薪,别名为年薪
mysql> select empname as 姓名,salary*12 as 年薪 from emp;
+--------+-----------+
| 姓名 | 年薪 |
+--------+-----------+
| Smith | 9600.000 |
| Allen | 19200.000 |
| Ward | 15000.000 |
| Jones | 35700.000 |
| Maritn | 15000.000 |
| Blake | 34200.000 |
| Clark | 29400.000 |
| Scott | 36000.000 |
| King | 60000.000 |
| Turner | 18000.000 |
| Adams | 13200.000 |
| James | 11400.000 |
| Ford | 36000.000 |
| Miller | 15600.000 |
+--------+-----------+
注意:如果别名中有空格特殊符号 需要使用单引号括起来
例如:查询雇员的年薪,别名为year sal
mysql> select empname as '姓名',salary*12 as 'year sal' from emp;
+--------+-----------+
| 姓名 | year sal |
+--------+-----------+
| Smith | 9600.000 |
| Allen | 19200.000 |
| Ward | 15000.000 |
| Jones | 35700.000 |
1.2.7 concat使用
mysql> select concat('姓名:',empname,'职位:',empjob) from emp;
+--------------------------------------------+
| concat('姓名:',empname,'职位:',empjob) |
+--------------------------------------------+
| 姓名:Smith职位:clerk |
| 姓名:Allen职位:salesman |
| 姓名:Ward职位:salesman |
| 姓名:Jones职位:manager |
| 姓名:Maritn职位:salesman |
| 姓名:Blake职位:manager |
| 姓名:Clark职位:manager |
| 姓名:Scott职位:analyst |
| 姓名:King职位:president |
| 姓名:Turner职位:salesman |
| 姓名:Adams职位:clerk |
| 姓名:James职位:clerk |
| 姓名:Ford职位:analyst |
| 姓名:Miller职位: clerk |
+--------------------------------------------+
二、对查询结果排序
升序默认的排序方式 asc(ascending order),降序 desc( descending order)
2.1 在单个字段中排序
语法:select 查询内容 from 表名 order by 字段 asc|desc
例如:查询雇员信息按雇员薪资升序排序
mysql> select * from emp order by salary asc;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
2.2 在多个字段中使用排序
语法:select 查询内容 from 表名 order by 字段名1 asc|desc,字段名2 asc|desc...
例如:查询雇员信息,先按照雇员薪资升序排序,如果薪资相同则按入职日期降序排序
mysql> select * from emp order by salary asc,hiredate desc;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
注意:排序可以使用别名
例如:查询雇员的年薪,给年薪起别名yearsal 按照年薪降序排序
mysql> select empname, salary*12 as yearsal from emp order by yearsal;
+---------+-----------+
| empname | yearsal |
+---------+-----------+
| Smith | 9600.000 |
| James | 11400.000 |
| Adams | 13200.000 |
| Ward | 15000.000 |
| Maritn | 15000.000 |
| Miller | 15600.000 |
| Turner | 18000.000 |
| Allen | 19200.000 |
| Clark | 29400.000 |
| Blake | 34200.000 |
| Jones | 35700.000 |
| Scott | 36000.000 |
| Ford | 36000.000 |
| King | 60000.000 |
+---------+-----------+
三、条件查询
条件查询:是用户按照一定条件查询,查询满足条件的部分记录
语法:select 查询内容 from 表 where 条件
3.1 比较运算符的使用
例如:查询部门号为20的雇员信息
mysql> select * from emp where deptno=20;
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
查询薪资大于等于3000的雇员信息
mysql> select * from emp where salary>3000;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
查询雇员的姓名为smith的雇员信息
mysql> select * from emp where empname='smith';
+-------+---------+--------+-----------+------------+---------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+--------+-----------+------------+---------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
+-------+---------+--------+-----------+------------+---------+-----------+--------+
注意:MySQL默认的是不区分大小写的,如果需要区分大小写,则可以使用binary关键字
例如:
# 为空
mysql> select * from emp where binary empname='smith';
Empty set (0.01 sec)
mysql> select * from emp where binary empname='Smith';
+-------+---------+--------+-----------+------------+---------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+--------+-----------+------------+---------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
+-------+---------+--------+-----------+------------+---------+-----------+--------+
3.2. [not]between and的使用
可以查询某区间范围的记录
例如:查询薪资在1200-3000之间的雇员信息
select * from empty where salary between 1200 and 3000
mysql> select * from emp where salary between 1200 and 3000;
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
或者
mysql> select * from emp where salary > 1200 and salary < 3000;
注意:between 是开始 and 后是结尾 包括边界
查询薪资不在1200-3000之间的雇员姓名 薪资
select ename,sal from empty where sal not between 1200 and 3000
mysql> select * from emp where salary not between 1200 and 3000;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
3.3. [not] in
表示在指定集合中
语法: select 查询内容 from 表名 where 字段名 in(值1,值2,....)
查询雇员姓名是smith 、scott、king的雇员信息
mysql> select * from emp where empname in('smith','scott','kings');
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
查询雇员姓名不是smith 、scott、king的雇员信息
mysql> select * from emp where empname not in('smith','scott','king');
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
3.4 is null或者 is not null (不区分大小写null Null)
判断某个字段是否为空
例如:查询雇员中,有津贴的雇员信息
mysql> select * from emp where allowance is not null;
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7654 | Maritn | salesman | 7698 | 1981-09-28 | 1250.000 | 1400.000 | 30 |
| 7844 | Turner | salesman | 7698 | 1981-09-08 | 1500.000 | 0.000 | 30 |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
查询雇员中,没有津贴的雇员信息
mysql> select * from emp where allowance is null;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7566 | Jones | manager | 7839 | 1981-04-02 | 2975.000 | NULL | 20 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
| 7876 | Adams | clerk | 7788 | 1987-05-23 | 1100.000 | NULL | 20 |
| 7900 | James | clerk | 7698 | 1981-12-03 | 950.000 | NULL | 30 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
| 7934 | Miller | clerk | 7782 | 1982-01-23 | 1300.000 | NULL | 10 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
3.5 模糊查询
可以查询以XX开头 以XX结尾 包含XX 第几个是X
语法:
select 查询内容 from 表名 where 字段名 like
%: 指任意长度的字符(可以有也可以没有)
_: 匹配一个字符
例如:查询雇员中雇员姓名以S开头的雇员信息
mysql> select * from emp where binary empname like 'S%';
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
查询雇员中雇员姓名以S结尾的雇员信息
mysql> select * from emp where binary empname like '%S';
Empty set (0.00 sec)
查询雇员中雇员姓名包含S的雇员信息
mysql> select * from emp where binary empname like '%S%';
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+---------+-----------+------------+----------+-----------+--------+
| 7369 | Smith | clerk | 7902 | 1980-12-17 | 800.000 | NULL | 20 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
+-------+---------+---------+-----------+------------+----------+-----------+--------
查询雇员姓名第二个字符是l的雇员信息
mysql> select * from emp where empname like '_l%';
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
| 7499 | Allen | salesman | 7698 | 1981-02-20 | 1600.000 | 300.000 | 30 |
| 7698 | Blake | manager | 7839 | 1981-05-01 | 2850.000 | NULL | 30 |
| 7782 | Clark | manager | 7839 | 1981-06-09 | 2450.000 | NULL | 10 |
+-------+---------+----------+-----------+------------+----------+-----------+--------+
3.6 条件中的逻辑运算符
3.6.1 and
指并且 在查询时候只有满足所有查询条件的记录才会被查询出来
语法:select 查询内容 from 表名 where 条件1 and 条件2 and....
例如:查询雇员表中部门号为20 ,职位为clerk的雇员姓名 部门编号 职位
mysql> select empname,deptno,empjob from emp where empjob='clerk' and deptno=20;
+---------+--------+--------+
| empname | deptno | empjob |
+---------+--------+--------+
| Smith | 20 | clerk |
| Adams | 20 | clerk |
+---------+--------+--------+
3.6.2 or
指或者 在查询时候只要满足任意一个条件的记录就能被查询出来
语法: select 查询内容 from 表名 where 条件1 or 条件2 or....
查询雇员表中部门号为20 ,或者职位为clerk的雇员姓名 部门编号 职位
mysql> select empname,deptno,empjob from emp where empjob='clerk' or deptno=20;
+---------+--------+---------+
| empname | deptno | empjob |
+---------+--------+---------+
| Smith | 20 | clerk |
| Jones | 20 | manager |
| Scott | 20 | analyst |
| Adams | 20 | clerk |
| James | 30 | clerk |
| Ford | 20 | analyst |
+---------+--------+---------+
四、分页查询
语法:
select 查询内容
from 表名
where 条件
order by 字段名 asc|desc
limit a,b
注意:
1.limit 从哪条记录开始, 每页显示的条数,且默认第一条的值a=0
例如,显示第n页,每页m条信息的语法为
select * from 表名 limit(n-1)*m,m
2.如果limit与order by连用时候,先排序再分页
例如查询薪资大于1200的员工信息,要求按薪资降序排序,只显示第一页,每页三条数据。
mysql> select * from emp where salary>1200 order by salary desc limit 0,3;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
| 7788 | Scott | analyst | 7566 | 1987-04-19 | 3000.000 | NULL | 20 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
五、函数的使用
5.1 单行函数
5.1.1 字符函数
5.1.1.1 concat() 拼接字符串
例如:查询雇员的信息,以指定格式输出
雇员姓名:XX,薪资:XX,职位:XX,入职日期:XX,年薪:XX
例如:
mysql> select concat('雇员姓名:',empname,'雇员职位:',empjob,'雇员薪资:',salary) from emp;
+---------------------------------------------------------------------------------+
| concat('雇员姓名:',empname, '雇员职位:',empjob, '雇员薪资:',salary) |
+---------------------------------------------------------------------------------+
| 雇员姓名:Smith雇员职位:clerk 雇员薪资:800.000 |
| 雇员姓名:Allen雇员职位:salesman雇员薪资:1600.000 |
| 雇员姓名:Ward雇员职位:salesman雇员薪资:1250.000 |
| 雇员姓名:Jones雇员职位:manager雇员薪资:2975.000 |
| 雇员姓名:Maritn雇员职位:salesman雇员薪资:1250.000 |
| 雇员姓名:Blake雇员职位:manager雇员薪资:2850.000 |
| 雇员姓名:Clark雇员职位:manager雇员薪资:2450.000 |
| 雇员姓名:Scott雇员职位:analyst雇员薪资:3000.000 |
| 雇员姓名:King雇员职位:president雇员薪资:5000.000 |
| 雇员姓名:Turner雇员职位:salesman雇员薪资:1500.000 |
| 雇员姓名:Adams雇员职位:clerk雇员薪资:1100.000 |
| 雇员姓名:James雇员职位:clerk雇员薪资:950.000 |
| 雇员姓名:Ford雇员职位:analyst雇员薪资:3000.000 |
| 雇员姓名:Miller雇员职位: clerk雇员薪资:1300.000 |
+---------------------------------------------------------------------------------+
5.1.1.2 length()计算字符串的长度
例如:查询雇员中雇员姓名长度是4的雇员信息
注意:
mysql中的length()是按照字节统计长度的,汉字的长度和编码有关系,英文不受影响
python中的len()是按照字符统计长度的,汉字的长度和编码无关,一个汉字长度就为1,英文无影响
mysql> select * from emp where length(empname)=4;
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| empno | empname | empjob | empleader | hiredate | salary | allowance | deptno |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
| 7521 | Ward | salesman | 7698 | 1981-02-22 | 1250.000 | 500.000 | 30 |
| 7839 | King | president | NULL | 1981-11-17 | 5000.000 | NULL | 10 |
| 7902 | Ford | analyst | 7566 | 1981-12-03 | 3000.000 | NULL | 20 |
+-------+---------+-----------+-----------+------------+----------+-----------+--------+
5.1.1.3 lower() upper()转换大小写
例如:查询雇员姓名,大写的雇员姓名 ,小写的雇员姓名
mysql> select empname from emp;
+---------+
| empname |
+---------+
| Smith |
| Allen |
| Ward |
| Jones |
| Maritn |
| Blake |
| Clark |
| Scott |
| King |
| Turner |
| Adams |
| James |
| Ford |
| Miller |
+---------+
14 rows in set (0.00 sec)
mysql> select lower(empname) from emp;
+----------------+
| lower(empname) |
+----------------+
| smith |
| allen |
| ward |
| jones |
| maritn |
| blake |
| clark |
| scott |
| king |
| turner |
| adams |
| james |
| ford |
| miller |
+----------------+
14 rows in set (0.01 sec)
mysql> select upper(empname) from emp;
+----------------+
| upper(empname) |
+----------------+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARITN |
| BLAKE |
| CLARK |
| SCOTT |
| KING |
| TURNER |
| ADAMS |
| JAMES |
| FORD |
| MILLER |
+----------------+
5.1.1.4 replace()
在指定的字符串中,将某子串替换为新的字符串
格式:replace(目标字符串,查找的子串,新字符串)
例如:将员工姓名中l替换为L
mysql> select replace(empname,'l','L') from emp;
+--------------------------+
| replace(empname,'l','L') |
+--------------------------+
| Smith |
| ALLen |
| Ward |
| Jones |
| Maritn |
| BLake |
| CLark |
| Scott |
| King |
| Turner |
| Adams |
| James |
| Ford |
| MiLLer |
+--------------------------+
5.1.1.5 substring()截取子串
substring(目标字符串,开始位置,长度)
注意:开始索引是从1开始,不是0
例如:获取雇员姓名的前四个字符
mysql> select substring(empname,1,4) from emp;
+------------------------+
| substring(empname,1,4) |
+------------------------+
| Smit |
| Alle |
| Ward |
| Jone |
| Mari |
| Blak |
| Clar |
| Scot |
| King |
| Turn |
| Adam |
| Jame |
| Ford |
| Mill |
+------------------------+
5.1.2 .数值函数
5.1.2.1 abs()
作用:取绝对值
mysql> select abs(-1),abs(3);
+---------+--------+
| abs(-1) | abs(3) |
+---------+--------+
| 1 | 3 |
+---------+--------+
1 row in set (0.00 sec
5.1.2.2 pi()
作用:获取圆周率
mysql> select pi();
+----------+
| pi() |
+----------+
| 3.141593 |
+----------+
5.1.2.3 mod()
作用:取模
例如:select mod(3,2)
mysql> select mod(3,2);
+----------+
| mod(3,2) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
mysql> select mod(2,3);
+----------+
| mod(2,3) |
+----------+
| 2 |
+----------+
5.1.2.4 pow()
作用:求一个数的n次方
mysql> select power(3,2);
+------------+
| power(3,2) |
+------------+
| 9 |
+------------+
5.1.2.5 ceil() floor()
- ceil():向上取整
- floor():向下取整
mysql> select ceil(3.14);
+------------+
| ceil(3.14) |
+------------+
| 4 |
+------------+
1 row in set (0.00 sec)
mysql> select floor(3.99);
+-------------+
| floor(3.99) |
+-------------+
| 3 |
+-------------+
5.1.2.6 round()
round(num):返回四舍五入的整数
round(num,n):返回四舍五入n位小数
mysql> select round(5.4),round(6.8),round(5.34,1),round(6.789,2);
+------------+------------+---------------+----------------+
| round(5.4) | round(6.8) | round(5.34,1) | round(6.789,2) |
+------------+------------+---------------+----------------+
| 5 | 7 | 5.3 | 6.79 |
+------------+------------+---------------+----------------+
1 row in set (0.00 sec)
5.1.2.7 truncate() 截取
truncate(num,n) 其中n的取值可以是0,1,2..如果n取值为0代表截取整数
mysql> select truncate(5.3,0),truncate(5.67,1),truncate(5.789,2);
+-----------------+------------------+-------------------+
| truncate(5.3,0) | truncate(5.67,1) | truncate(5.789,2) |
+-----------------+------------------+-------------------+
| 5 | 5.6 | 5.78 |
+-----------------+------------------+-------------------+
5.1.2.8 rand()
作用:获取浮点类型的随机数,范围0-1.0 其中包括0但不包括1
mysql> select rand(),rand(),rand();
+--------------------+---------------------+--------------------+
| rand() | rand() | rand() |
+--------------------+---------------------+--------------------+
| 0.5739643895756121 | 0.11088874108240822 | 0.8325505674188496 |
+--------------------+---------------------+--------------------+
5.1.3 日期时间函数
5.1.3.1 now()
获取当前日期和时间 包括年月日 时分秒
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2021-11-11 16:25:24 |
+---------------------+
1 row in set (0.00 sec)
5.1.3.2 curdate()
获取当前日期 只包括年月日
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2021-11-11 |
+------------+
5.1.3.3 curtime()
获取当前时间 只包括时分秒
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 16:27:22 |
+-----------+
5.1.3.4 sysdate()、now()
获取函数执行时的日期和时间
now()获取SQL执行时的日期和时间
mysql> select sysdate(),now();
+---------------------+---------------------+
| sysdate() | now() |
+---------------------+---------------------+
| 2021-11-11 16:43:16 | 2021-11-11 16:43:16 |
+---------------------+---------------------+
mysql> select sysdate(),now(),sleep(2),sysdate(),now();
+---------------------+---------------------+----------+---------------------+---------------------+
| sysdate() | now() | sleep(2) | sysdate() | now() |
+---------------------+---------------------+----------+---------------------+---------------------+
| 2021-11-11 16:43:58 | 2021-11-11 16:43:58 | 0 | 2021-11-11 16:44:00 | 2021-11-11 16:43:58 |
+---------------------+---------------------+----------+---------------------+---------------------+
5.1.3.5 dayofyear()、week()
获取某个日期是所在年份的第几天
week()获取某个日期是所在年份的第几周
例如:select dayofyear(now()),week(now())
mysql> select dayofyear(now()),week(now());
+------------------+-------------+
| dayofyear(now()) | week(now()) |
+------------------+-------------+
| 315 | 45 |
+------------------+-------------+
5.1.3.6 datediff()
计算两个日期之间的时间间隔
例如:计算2021-1-1距离现在时间间隔
mysql> select datediff('2021-1-1',now());
+----------------------------+
| datediff('2021-1-1',now()) |
+----------------------------+
| -314 |
+----------------------------+
5.1.3.7 date_add() date_sub() 实现日期的加减运算
date_add(日期,时间间隔类型关键字interval 时间间隔类型对应的表达式 时间间隔类型)
例如 day_hour 1_12 代表 1天12小时
year_month 2_1 代表 2年1个月
例如,现在时间加上两年一个月的时间
mysql> select date_add(now(),interval '2_1' year_month);
+-------------------------------------------+
| date_add(now(),interval '2_1' year_month) |
+-------------------------------------------+
| 2023-12-11 16:57:30 |
+-------------------------------------------+
现在时间减去三天的时间
mysql> select date_sub(now(),interval '3' day);
+----------------------------------+
| date_sub(now(),interval '3' day) |
+----------------------------------+
| 2021-11-08 17:02:25 |
+----------------------------------+
5.1.4 流程控制函数
5.1.4.1 if(条件,t,f) 如果条件成立返回t,否则返回f
例如:select if(1>2,‘1大于2’,‘1小于2’)
mysql> select if(1>2,'1大于2','1小于2');
+-------------------------------+
| if(1>2,'1大于2','1小于2') |
+-------------------------------+
| 1小于2 |
+-------------------------------+
1 row in set (0.00 sec)
查询雇员的薪资,如果薪资>=3000 输入’高薪’ 否则’低薪’
mysql> select empname,salary,if(salary>3000,'高薪','低薪') from emp;
+---------+----------+-----------------------------------+
| empname | salary | if(salary>3000,'高薪','低薪') |
+---------+----------+-----------------------------------+
| Smith | 800.000 | 低薪 |
| Allen | 1600.000 | 低薪 |
| Ward | 1250.000 | 低薪 |
| Jones | 2975.000 | 低薪 |
| Maritn | 1250.000 | 低薪 |
| Blake | 2850.000 | 低薪 |
| Clark | 2450.000 | 低薪 |
| Scott | 3000.000 | 低薪 |
| King | 5000.000 | 高薪 |
| Turner | 1500.000 | 低薪 |
| Adams | 1100.000 | 低薪 |
| James | 950.000 | 低薪 |
| Ford | 3000.000 | 低薪 |
| Miller | 1300.000 | 低薪 |
+---------+----------+-----------------------------------+
5.1.4.2 ifnull(值1,值2)
如果值1不为空则返回值1,否则返回值2
查询雇员的年
select salary*12 from emp;
select empname,(salary+allowance)*12 from emp;
select empname,(salary+ifnull(allowance,0))*12 from emp; # 因为allowance有null值。
mysql> select empname,(salary+allowance)*12 from emp;
+---------+-----------------------+
| empname | (salary+allowance)*12 |
+---------+-----------------------+
| Smith | NULL |
| Allen | 22800.000 |
| Ward | 21000.000 |
| Jones | NULL |
| Maritn | 31800.000 |
| Blake | NULL |
| Clark | NULL |
| Scott | NULL |
| King | NULL |
| Turner | 18000.000 |
| Adams | NULL |
| James | NULL |
| Ford | NULL |
| Miller | NULL |
+---------+-----------------------+
有null值,显然不合理,需要做如下查询
mysql> select empname,(salary+ifnull(allowance,0))*12 from emp;
+---------+---------------------------------+
| empname | (salary+ifnull(allowance,0))*12 |
+---------+---------------------------------+
| Smith | 9600.000 |
| Allen | 22800.000 |
| Ward | 21000.000 |
| Jones | 35700.000 |
| Maritn | 31800.000 |
| Blake | 34200.000 |
| Clark | 29400.000 |
| Scott | 36000.000 |
| King | 60000.000 |
| Turner | 18000.000 |
| Adams | 13200.000 |
| James | 11400.000 |
| Ford | 36000.000 |
| Miller | 15600.000 |
+---------+---------------------------------+
5.1.4.3 nullif(值1,值2)
如果值1等于值2返回null,否则返回值1
例如 select nullif(1,2),nullif(1,1)
mysql> select nullif(1,2),nullif(1,1);
+-------------+-------------+
| nullif(1,2) | nullif(1,1) |
+-------------+-------------+
| 1 | NULL |
+-------------+-------------+
5.1.4.4 case 值
when 值1 then 结果1
when 值2 then 结果2
...
else 其他结果
end
mysql> select case 1
-> when 1 then '结果是1'
-> when 2 then '结果是2'
-> else '其他结果'
-> end;
+----------------------------------------------------------------------------------+
| case 1
when 1 then '结果是1'
when 2 then '结果是2'
else '其他结果'
end |
+----------------------------------------------------------------------------------+
| 结果是1 |
+----------------------------------------------------------------------------------+
5.1.4.5 case 条件
when 条件 then 结果1
when 条件 then 结果2
.....
else 其他结果
end
例如:查询雇员薪资 如果薪资>=3000返回 ‘高薪’ 否则’低薪’
select salary,case
when sal>=3000 then '高薪'
else '低薪'
end
as '薪资水平' from emp;
mysql> select salary,case
-> when salary >=3000 then '高薪'
-> else '低薪'
-> end
-> as'薪资水平'from emp;
+----------+--------------+
| salary | 薪资水平 |
+----------+--------------+
| 800.000 | 低薪 |
| 1600.000 | 低薪 |
| 1250.000 | 低薪 |
| 2975.000 | 低薪 |
| 1250.000 | 低薪 |
| 2850.000 | 低薪 |
| 2450.000 | 低薪 |
| 3000.000 | 高薪 |
| 5000.000 | 高薪 |
| 1500.000 | 低薪 |
| 1100.000 | 低薪 |
| 950.000 | 低薪 |
| 3000.000 | 高薪 |
| 1300.000 | 低薪 |
+----------+--------------+
5.2 多行函数
1.多行函数:操作一组数据(多行记录) 返回一个结果 也叫分组函数2.多行函数大多使用于统计
例如:统计各部门中雇员的人数
统计各部门中最高最低薪资是多少
5.2.1 count()
统计表中记录的数目
a.统计表中记录的总数目count(*)
例如查询雇员表中有多少条记录
mysql> select count(*) from emp;
+----------+
| count(*) |
+----------+
| 14 |
+----------+
b.count(exp)统计exp值非空的记录数目
例如:查询雇员表中有多少位雇员有津贴
mysql> select count(allowance) from emp;
+------------------+
| count(allowance) |
+------------------+
| 4 |
+------------------+
c.count(distinct(exp)) 返回表达式exp的值不重复且非空的总记录数目
例如:统计雇员表中有多少位雇员是领导
select count(distinct(empleader)) from emp;–统计的是除董事长外的领导人数(董事长是null)
mysql> select count(distinct(empleader)) from emp;
+----------------------------+
| count(distinct(empleader)) |
+----------------------------+
| 6 |
+----------------------------+
统计雇员表中所有领导
ifnull(值1,值2) 如果值1不为null返回值1 ,否则返回值2
select count(distinct(ifnull(empleader,1))) from emp; # 因为经理的领导为null
mysql> select count(distinct(ifnull(empleader,1))) from emp;
+--------------------------------------+
| count(distinct(ifnull(empleader,1))) |
+--------------------------------------+
| 7 |
+--------------------------------------+
5.2.2 sum()
a.sum(exp):返回表达式值得总和
mysql> select sum(salary) as '总月薪' from emp;
+-----------+
| 总月薪 |
+-----------+
| 29025.000 |
+-----------+
b.sum(distinct(exp))返回不重复的表达式exp的总和
mysql> select sum(salary),sum(distinct(salary)) from emp;
+-------------+-----------------------+
| sum(salary) | sum(distinct(salary)) |
+-------------+-----------------------+
| 29025.000 | 24775.000 |
+-------------+-----------------------+
5.2.3 avg()
a.avg(exp):返回表达式值得平均值
例如: select avg(salary) from emp;
mysql> select avg(salary) from emp;
+--------------+
| avg(salary) |
+--------------+
| 2073.2142857 |
+--------------+
b.avg(distinct(exp)):返回不重复的表达式exp的平均值
例如 select avg(distinct(salary)) from emp;
mysql> select avg(distinct(salary)) from emp;
+-----------------------+
| avg(distinct(salary)) |
+-----------------------+
| 2064.5833333 |
+-----------------------
5.2.4 max() min()
max(exp):返回表达式值得最大值
min(exp):返回表达式值得最小值
例如
mysql> select min(salary),max(salary) from emp;
+-------------+-------------+
| min(salary) | max(salary) |
+-------------+-------------+
| 800.000 | 5000.000 |
+-------------+-------------+
1 row in set (0.00 sec)
5.3 分组统计
1.语法:
select 查询内容
from 表名
[where 条件]
[group by 分组字段名1,分组字段名2...]
[order by 字段名 asc|desc]
[limit]
2.使用举例
a.求每个部门的人数
select deptno,count(*) from emp group by deptno;
mysql> select deptno,count(*) from emp group by deptno;
+--------+----------+
| deptno | count(*) |
+--------+----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+----------+
b.求每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
mysql> select deptno,avg(salary) from emp group by deptno;
+--------+--------------+
| deptno | avg(salary) |
+--------+--------------+
| 10 | 2916.6666667 |
| 20 | 2175.0000000 |
| 30 | 1566.6666667 |
+--------+--------------+
c.求每个部门中最高工资和人数
select deptno,max(sal),count(*) from emp group by deptno;
mysql> select deptno, max(salary),count(*) from emp group by deptno;
+--------+-------------+----------+
| deptno | max(salary) | count(*) |
+--------+-------------+----------+
| 10 | 5000.000 | 3 |
| 20 | 3000.000 | 5 |
| 30 | 2850.000 | 6 |
+--------+-------------+----------+
d.求每个岗位的人数
mysql> select empjob,count(*) as '总人数' from emp group by empjob;
+-----------+-----------+
| empjob | 总人数 |
+-----------+-----------+
| analyst | 2 |
| clerk | 4 |
| manager | 3 |
| president | 1 |
| salesman | 4 |
+-----------+-----------+
e.显示每个部门不同岗位的人数
mysql> select deptno,empjob,count(*) as '总人数' from emp group by deptno,empjob;
+--------+-----------+-----------+
| deptno | empjob | 总人数 |
+--------+-----------+-----------+
| 10 | clerk | 1 |
| 10 | manager | 1 |
| 10 | president | 1 |
| 20 | analyst | 2 |
| 20 | clerk | 2 |
| 20 | manager | 1 |
| 30 | clerk | 1 |
| 30 | manager | 1 |
| 30 | salesman | 4 |
+--------+-----------+-----------+
3.注意a.查询字段,如果没有在多行函数中包含,则必须是分组字段 下面查询会报错
select empname,empjob,sum(salary) from emp group by empjob;
b.如果没有group by ,查询字段不能与多行函数一起查询
select sal,empno from emp; 合法
select sum(sal),empno from emp; 不合法
c.不允许在where条件中使用多行函数,若要是用,必须要用having
5.4 having子句
1.语法:
select 查询内容
from 表名
[where 条件]
[group by 分组字段]
[having 条件]
[order by]
[limit]
select from --where过滤—group by–having过滤
2.使用举例
a.每个部门不同岗位的人数,且人数大于2
mysql> select deptno,empjob,count(*) from emp group by deptno,empjob having count(*) >=2;
+--------+----------+----------+
| deptno | empjob | count(*) |
+--------+----------+----------+
| 20 | analyst | 2 |
| 20 | clerk | 2 |
| 30 | salesman | 4 |
+--------+----------+----------+
b.在emp表中列出工资最小值小于2000的职位
先查询每个职位的最低薪资
select empjob,min(salary) from emp group by empjob;
mysql> select empjob,min(salary) from emp group by empjob having min(salary)<2000;
+----------+-------------+
| empjob | min(salary) |
+----------+-------------+
| clerk | 800.000 |
| salesman | 1250.000 |
+----------+-------------+
c.列出平均工资大于1200的部门和职位搭配组合
先求每个部门不同职位的平均工资
select avg(sal) from emp group by deptno,job
mysql> select deptno,empjob,avg(salary) from emp group by deptno,empjob having avg(salary)>12200;
+--------+-----------+--------------+
| deptno | empjob | avg(salary) |
+--------+-----------+--------------+
| 10 | clerk | 1300.0000000 |
| 10 | manager | 2450.0000000 |
| 10 | president | 5000.0000000 |
| 20 | analyst | 3000.0000000 |
| 20 | manager | 2975.0000000 |
| 30 | manager | 2850.0000000 |
| 30 | salesman | 1400.0000000 |
+--------+-----------+--------------+