文章目录

  • 一、单表查询
    • 1.1 创建数据库
    • 1.2 单表查询
      • 1.2.1 查询所有字段
      • 1.2.2 使用通配符*查询所有字段
      • 1.2.3 查询指定字段
      • 1.2.4 去重distinct的使用
      • 1.2.5 查询中使用算术运算符
      • 1.2.6.给字段起别名
      • 1.2.7 concat使用
  • 二、对查询结果排序
    • 2.1 在单个字段中排序
    • 2.2 在多个字段中使用排序
  • 三、条件查询
    • 3.1 比较运算符的使用
    • 3.2. [not]between and的使用
    • 3.3. [not] in
    • 3.4 is null或者 is not null (不区分大小写null Null)
    • 3.5 模糊查询
    • 3.6 条件中的逻辑运算符
      • 3.6.1 and
      • 3.6.2 or
  • 四、分页查询
  • 五、函数的使用
    • 5.1 单行函数
      • 5.1.1 字符函数
        • 5.1.1.1 concat() 拼接字符串
        • 5.1.1.2 length()计算字符串的长度
        • 5.1.1.3 lower() upper()转换大小写
        • 5.1.1.4 replace()
        • 5.1.1.5 substring()截取子串
      • 5.1.2 .数值函数
        • 5.1.2.1 abs()
        • 5.1.2.2 pi()
        • 5.1.2.3 mod()
        • 5.1.2.4 pow()
        • 5.1.2.5 ceil() floor()
        • 5.1.2.6 round()
        • 5.1.2.7 truncate() 截取
        • 5.1.2.8 rand()
      • 5.1.3 日期时间函数
        • 5.1.3.1 now()
        • 5.1.3.2 curdate()
        • 5.1.3.3 curtime()
        • 5.1.3.4 sysdate()、now()
        • 5.1.3.5 dayofyear()、week()
        • 5.1.3.6 datediff()
        • 5.1.3.7 date_add() date_sub() 实现日期的加减运算
      • 5.1.4 流程控制函数
        • 5.1.4.1 if(条件,t,f) 如果条件成立返回t,否则返回f
        • 5.1.4.2 ifnull(值1,值2)
        • 5.1.4.3 nullif(值1,值2)
        • 5.1.4.4 case 值
        • 5.1.4.5 case 条件
    • 5.2 多行函数
      • 5.2.1 count()
      • 5.2.2 sum()
      • 5.2.3 avg()
      • 5.2.4 max() min()
    • 5.3 分组统计
    • 5.4 having子句

一、单表查询

查询:用户根据不同的方式从数据库表中获取自己所需要的数据
是数据库操作中非常重要且非常频繁的

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|desclimit 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  结果1when 条件  then  结果2.....else 其他结果end

例如:查询雇员薪资 如果薪资>=3000返回 ‘高薪’ 否则’低薪’

select salary,casewhen 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 |
+--------+-----------+--------------+

mysql单表查询详解相关推荐

  1. mysql多表查询详解_MySQL多表查询详解上

    时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...

  2. Mysql 多表查询详解

    Mysql 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  3. mysql多表查询详解

    在mysql中把查询结果去除重复记录[distinct] 如:select distinct job from emp;// 去除员工表工作字段中的重复记录 需要注意的是distinct只能出现在所有 ...

  4. 七、MySQL 多表查询详解(附练习题及答案----超详细)

    文章目录 一.笛卡尔积(或交叉连接)的理解 二.多表查询分类讲解 2.1 分类1:等值连接 vs 非等值连接 2.2 分类2:自连接 vs 非自连接 2.3 分类3:内连接 vs 外连接 2.4 SQ ...

  5. mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...

    超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...

  6. Mysql 单表查询where初识

    Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...

  7. 运维高级学习(三):MySQL单表查询作业

    MySQL第三次作业 MySQL单表查询作业 素材如下: DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cs_id` int(11) ...

  8. MySQL单表查询基础卷(A)

    MySQL单表查询基础卷(A) 第一章 数据准备 第二章 数据展示 第三章 题目说明 第四章 参考答案 第一章 数据准备 -- 创建数据库,指定字符集 utf8 CREATE DATABASE IF ...

  9. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

最新文章

  1. Windows下Eclipse配置基于MinGW的C/C++开发环境
  2. PYTHON编程导论群问题汇总(二)
  3. 30天python开发_30天解锁Python量化开发——初探交易接口
  4. 最短路径的Dijkstra算法(邻接表)
  5. 2.3.2 进程互斥的软件实现方法
  6. suma在c语言中表示什么变量,C语言题
  7. 2021高考文科成绩怎样查询,2021年本科分数线是多少?如何查询分数
  8. 《程序设计技术基础》第1-5章例程
  9. Til the Cows Come Home POJ - 2387
  10. android 画爱心进度条_android自定义圆形进度条,实现动态画圆效果
  11. Deepin系统安装docker
  12. uva 12325(宝箱, 枚举问题);
  13. c语言炉石传说算法设计,CCF-CSP题解 201609-3 炉石传说
  14. c语言json如何遍历数组,JavaScript怎么遍历这样的一个Json的对象数组?用递归or循环?...
  15. 学习笔记-用PLAN法提高执行力
  16. 《数据通信与网络》笔记--无线局域网
  17. 如何带领好新的员工?
  18. js ES6 ${}字符串拼接变量
  19. Android网络编程面试题集
  20. 项目管理pmp考试要多少费用?

热门文章

  1. android水电工具softonic,Softonic
  2. 抖音短视频内容该如何创作
  3. defaultdict用法详解
  4. Android6.0通讯录权限问题
  5. HarmonyOS开发17:案例——相亲APP
  6. 从 Debian 10 (Buster) 升级到 Debian 11 (Bullseye)
  7. EPICS设备支持的简单示例
  8. Kali忘记root密码强制更改办法
  9. win10-gvim安装vim-airline后状态栏乱码,而且箭头显示不出来
  10. SUMO与matlab联合仿真