mysql学习录(二) 数据的增删改查操做(最全select查询总结)

总结一点小知识:

最常用的几个字段类型:
int:整型
double:浮点型
char:固定长度字符串类型,中文汉字属于字符串类型
varchar:可变长度字符串类型,中文汉字属于字符串类型
text:字符串类型,存储超大文本
date:日期类型,格式为:yyyy-MM-dd
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳

表的约束 :
这里的约束是指在创建表的时候,对表的字段所设置的约束条件,用来限制该列的数据类型和内容

default:默认值
not null :非空约束,其值不能为空,不是 0,也不是空字符串 ” ”,可以是 null
unique:唯一性约束,强调该字段所有的值都是唯一的,不允许重复,但允许空值,且可以有多个空值
primary key:主键约束,要求该字段数值不能为空,而且数值唯一
auto_increment:自增约束,要求该字段不能为空,数值唯一,类型为整型,并根据前一条数据自动加 1

对表的操作:
对表的列进行 字段增加,字段删除,修改字段名,修改字段类型,修改表名,删除 、增加主键
alter table 表名 add 字段名 类型;
alter table 表名 drop 字段名;
alter table 表名 change 旧字段名 新字段名 类型;
alter table 表名 modify 字段名 新类型;
rename table 旧表名 to 新表名
alter table 表名drop primary key;
alter table 表名 add primary key(字段);

注意 add 添加列不会影响数据,更改表的名称也不会影响到数据,而 modify 修改列类型,change 修改列名都会影响到数据,所以当表中有数据的时候,修改列名和列类型的时候要格外注意

CRUD的操作(主要是高级查询)

对表里面数据的增删改查操作

INSERT

插入数据

全列插入
语法:

注意:符号是英文 ,如果类型是字符记得单引号引起来 一行的数据都要写上 包括 自增约束的字段

INSERT INTO 表名 VALUES(字段1的值, ... , 字段n的值);
例子:
mysql> INSERT INTO t_cats VALUES ( 1 , 'Tom' , 'male' , '2021-08-12' );
多行值插入:
语法:
-- 同时插入多条数据:
insert into 表名 values(1,2,...), (1,2,...),...;
缺省插入:

注意:not null 和 primary key字段必须赋值,其他字段可以省略。字段和后面的赋值位置和顺序要对应

语法:

表名后面指定插入的字段, values 里面是插入值,顺序一定要对应。

-- 一行插入
insert into 表名(1,2, ...) values(1,2, ...);

-- 多行插入
insert into 表名(1,2, ...) values(1,2, ...),
								values(1,2, ...)...
								values(1,2, ...);
例子:
mysql> select * from product;
+-----------+--------------+-------+
| productid | productname  | price |
+-----------+--------------+-------+
|         1 | HP1200打印机 |  2000 |
|         2 | LX360兼容机  |  4800 |
|         3 | IBM350笔记本 | 11000 |
|         4 | IBM360笔记本 | 12000 |
+-----------+--------------+-------+
4 rows in set (0.00 sec)

mysql> insert into product values(5, 'HUAWEI mate30 pro', 5999), (6, 'XIAOMI MAX4', 4999);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from product;
+-----------+-------------------+-------+
| productid | productname       | price |
+-----------+-------------------+-------+
|         1 | HP1200打印机      |  2000 |
|         2 | LX360兼容机       |  4800 |
|         3 | IBM350笔记本      | 11000 |
|         4 | IBM360笔记本      | 12000 |
|         5 | HUAWEI mate30 pro |  5999 |
|         6 | XIAOMI MAX4       |  4999 |
+-----------+-------------------+-------+
6 rows in set (0.00 sec)

mysql> insert into product(productname, price) values('HUAWEI mate40 pro', 6499), ('XIAOMI 11', 3999);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from product;
+-----------+-------------------+-------+
| productid | productname       | price |
+-----------+-------------------+-------+
|         1 | HP1200打印机      |  2000 |
|         2 | LX360兼容机       |  4800 |
|         3 | IBM350笔记本      | 11000 |
|         4 | IBM360笔记本      | 12000 |
|         5 | HUAWEI mate30 pro |  5999 |
|         6 | XIAOMI MAX4       |  4999 |
|         7 | HUAWEI mate40 pro |  6499 |
|         8 | XIAOMI 11         |  3999 |
+-----------+-------------------+-------+
8 rows in set (0.00 sec)

mysql>

UPDATE

语法:

可以一次修改多个列的值,但要注意带上条件

update 表名 set1=1,2=2,... where 条件;
例如:
update student set name="GPB" where name="GU";

DELETE

语法:

注意:一定要注意条件,删除一定要小心,最好做好备份

delete from 表名 where 条件;
例如:
delete from student where id=20210901;

SELECT

简单查询
1.查询所有列(字段)

一般不使用该种查询方式

select * from table_name;
2.查询指定列(字段)(可以取别名)

用关键字 AS 可以给查询的字段取别名,
AS 可以省略,列名和别名之间使用空格隔开即可

select 字段1 as 别名1, 字段2 as 别名2 ... from table_name;
3.使用 DISTINCT 剔除重复行

关键字 distinct 必须紧跟在 select 之后。

select  distinct 字段 from table_name;
4.空值的处理

使用 IFNULL( 字段 , 替代值) 表达式来替换空值。【表达式一般会给别名来显示】
需求:查询该表的字段1 、2、3,并且将字段3为空的部分显示为无:

select 字段1 , 字段2 , IFNULL( 字段3, '无') as 别名 from table_name;
5.查询语句使用算数表达式

可以在数字类型的字段进行算术运算。
需求:给注册员工临时增加奖金 500 元

select ename as 员工姓名 , (comm + 500) as 奖金 from emp; 
综合示例:

表结构和表的数据:
dept部门表和emp员工表

mysql> use kaifamiao;
Database changed
mysql> desc dept;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| DEPTNO   | int         | NO   | PRI | NULL    |       |
| DNAME    | varchar(14) | YES  |     | NULL    |       |
| LOCATION | varchar(13) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME      | LOCATION |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.02 sec)

mysql>
mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| EMPNO    | int         | NO   | PRI | NULL    |       |
| ENAME    | varchar(10) | YES  |     | NULL    |       |
| JOB      | varchar(9)  | YES  |     | NULL    |       |
| MANAGER  | int         | YES  |     | NULL    |       |
| HIREDATE | date        | YES  |     | NULL    |       |
| SAL      | double(7,2) | YES  |     | NULL    |       |
| COMM     | double(7,2) | YES  |     | NULL    |       |
| DEPTNO   | int         | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
8 rows in set (0.01 sec)

mysql> select * from emp;
+-------+-----------+-----------+---------+------------+---------+---------+--------+
| EMPNO | ENAME     | JOB       | MANAGER | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
|  7369 | SMITH     | CLERK     |    7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN     | SALESMAN  |    7698 | 1981-02-20 | 1600.00 |  300.00 |
    30 |
|  7521 | WARD      | SALESMAN  |    7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES     | MANAGER   |    7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN    | SALESMAN  |    7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE     | MANAGER   |    7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK     | MANAGER   |    7839 | 1981-06-02 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT     | ANALYST   |    7566 | 1982-12-09 | 3000.00 |    NULL |     20 |
|  7839 | KING      | PRESIDENT |    NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER    | SALESMAN  |    7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS     | CLERK     |    7788 | 1983-06-12 | 1100.00 |    NULL |     20 |
|  7900 | JAMES     | CLERK     |    7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD      | ANALYST   |    7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER    | CLERK     |    7782 | 1982-06-23 | 1300.00 |    NULL |     10 |
|  8256 | QIU'XIANG | ANALYST   |    7839 | 1986-05-04 | 1400.00 |    NULL |   NULL |
|  9527 | HUA'AN    | CLERK     |    7839 | 1985-01-23 | 1300.00 |    NULL |   NULL |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
16 rows in set (0.00 sec)

查询员工工号、姓名、入职日期和年薪【(sal月薪 + 不为空的提成)* 12】

mysql> select empno 工号, ename 姓名, hiredate 入职日期, (sal + ifnull( comm, 0)) * 12 as 年薪 from emp;
+------+-----------+------------+----------+
| 工号 | 姓名      | 入职日期   | 年薪     |
+------+-----------+------------+----------+
| 7369 | SMITH     | 1980-12-17 |  9600.00 |
| 7499 | ALLEN     | 1981-02-20 | 22800.00 |
| 7521 | WARD      | 1981-02-22 | 21000.00 |
| 7566 | JONES     | 1981-04-02 | 35700.00 |
| 7654 | MARTIN    | 1981-09-28 | 31800.00 |
| 7698 | BLAKE     | 1981-05-01 | 34200.00 |
| 7782 | CLARK     | 1981-06-02 | 29400.00 |
| 7788 | SCOTT     | 1982-12-09 | 36000.00 |
| 7839 | KING      | 1981-11-17 | 60000.00 |
| 7844 | TURNER    | 1981-09-08 | 18000.00 |
| 7876 | ADAMS     | 1983-06-12 | 13200.00 |
| 7900 | JAMES     | 1981-12-03 | 11400.00 |
| 7902 | FORD      | 1981-12-03 | 36000.00 |
| 7934 | MILLER    | 1982-06-23 | 15600.00 |
| 8256 | QIU'XIANG | 1986-05-04 | 16800.00 |
| 9527 | HUA'AN    | 1985-01-23 | 15600.00 |
+------+-----------+------------+----------+
16 rows in set (0.00 sec)
条件查询 where 语句

条件查询 where,可以把它看成 当... 时候

1.比较运算符:

可以在 where 子句中使用 > 、< 、= 、<= 、>= 、!=或者(<>) 比较运算符

注: “ --空格” 在mysql命令行界面下可以当注释用

-- 统计月薪大于2000的员工工号、姓名、岗位
mysql> select empno 工号, ename 姓名, job 岗位 from emp where sal > 2000;
+------+-------+-----------+
| 工号 | 姓名  | 岗位      |
+------+-------+-----------+
| 7566 | JONES | MANAGER   |
| 7698 | BLAKE | MANAGER   |
| 7782 | CLARK | MANAGER   |
| 7788 | SCOTT | ANALYST   |
| 7839 | KING  | PRESIDENT |
| 7902 | FORD  | ANALYST   |
+------+-------+-----------+
6 rows in set (0.00 sec)
mysql>-- 查询不在10部门工作的员工信息
mysql> select * from emp where deptno != 10;
+-------+--------+----------+---------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB      | MANAGER | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+----------+---------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK    |    7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN |    7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN |    7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER  |    7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN |    7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER  |    7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7788 | SCOTT  | ANALYST  |    7566 | 1982-12-09 | 3000.00 |    NULL |     20 |
|  7844 | TURNER | SALESMAN |    7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK    |    7788 | 1983-06-12 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK    |    7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST  |    7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
+-------+--------+----------+---------+------------+---------+---------+--------+
11 rows in set (0.00 sec)

mysql> SELECT empno , ename , job , deptno FROM emp WHERE deptno <> 10 ;
+-------+--------+----------+--------+
| empno | ename  | job      | deptno |
+-------+--------+----------+--------+
|  7369 | SMITH  | CLERK    |     20 |
|  7499 | ALLEN  | SALESMAN |     30 |
|  7521 | WARD   | SALESMAN |     30 |
|  7566 | JONES  | MANAGER  |     20 |
|  7654 | MARTIN | SALESMAN |     30 |
|  7698 | BLAKE  | MANAGER  |     30 |
|  7788 | SCOTT  | ANALYST  |     20 |
|  7844 | TURNER | SALESMAN |     30 |
|  7876 | ADAMS  | CLERK    |     20 |
|  7900 | JAMES  | CLERK    |     30 |
|  7902 | FORD   | ANALYST  |     20 |
+-------+--------+----------+--------+
11 rows in set (0.00 sec)
2.逻辑运算符

即常用的 and 、 or

mysql> -- 查询在 10 或 20 或 30 部门工作的员工信息
mysql> SELECT empno, ename, deptno FROM emp WHERE deptno = 10 OR deptno = 20 OR deptno = 30;
+-------+--------+--------+
| empno | ename  | deptno |
+-------+--------+--------+
|  7369 | SMITH  |     20 |
|  7499 | ALLEN  |     30 |
|  7521 | WARD   |     30 |
|  7566 | JONES  |     20 |
|  7654 | MARTIN |     30 |
|  7698 | BLAKE  |     30 |
|  7782 | CLARK  |     10 |
|  7788 | SCOTT  |     20 |
|  7839 | KING   |     10 |
|  7844 | TURNER |     30 |
|  7876 | ADAMS  |     20 |
|  7900 | JAMES  |     30 |
|  7902 | FORD   |     20 |
|  7934 | MILLER |     10 |
+-------+--------+--------+
14 rows in set (0.00 sec)

mysql>

SQL运算符 (3、4、5、6)

3.BETWEEN…AND…

between a to b 是一个[a,b] 的闭区间

between...and... 表示在什么和什么之间,类似于 >=多少 and <= 多少

mysql> -- 查询月薪不低于1500 、不高于2000的员工信息
mysql> SELECT empno, ename, deptno FROM emp WHERE sal BETWEEN 1500 AND 2000;
+-------+--------+--------+
| empno | ename  | deptno |
+-------+--------+--------+
|  7499 | ALLEN  |     30 |
|  7844 | TURNER |     30 |
+-------+--------+--------+
2 rows in set (0.00 sec)

mysql> SELECT empno, ename, deptno FROM emp WHERE sal >= 1500 AND sal <= 2000;
+-------+--------+--------+
| empno | ename  | deptno |
+-------+--------+--------+
|  7499 | ALLEN  |     30 |
|  7844 | TURNER |     30 |
+-------+--------+--------+
2 rows in set (0.00 sec)
4.IN查询

IN 查询用于没有规律的范围查询,相当于 多个 or 查询组合

mysql> -- 与上面查询 10 或 20 或 30部门工作人信息 是相同结果
mysql> SELECT empno, ename, deptno FROM emp WHERE deptno IN (10, 20, 30);
5.NULL 值判断查询

IS NULL 和 NOT IS NULL 来在WHERE子句条件中判断值是否为 NULL并做相应符合条件的查询

不可用 = NULL 来做判断 这里面 is null 与 not is null 判断是否为空来做where子句条件

mysql> -- 查询提成为空的员工信息
mysql> SELECT empno, ename, deptno ,comm FROM emp WHERE comm IS NULL;
+-------+-----------+--------+------+
| empno | ename     | deptno | comm |
+-------+-----------+--------+------+
|  7369 | SMITH     |     20 | NULL |
|  7566 | JONES     |     20 | NULL |
|  7698 | BLAKE     |     30 | NULL |
|  7782 | CLARK     |     10 | NULL |
|  7788 | SCOTT     |     20 | NULL |
|  7839 | KING      |     10 | NULL |
|  7876 | ADAMS     |     20 | NULL |
|  7900 | JAMES     |     30 | NULL |
|  7902 | FORD      |     20 | NULL |
|  7934 | MILLER    |     10 | NULL |
|  8256 | QIU'XIANG |   NULL | NULL |
|  9527 | HUA'AN    |   NULL | NULL |
+-------+-----------+--------+------+
12 rows in set (0.00 sec)
MYSQL> -- 那些员工的信息不为空
mysql> SELECT * FROM emp WHERE comm IS NOT NULL;
+-------+--------+----------+---------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB      | MANAGER | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+----------+---------+------------+---------+---------+--------+
|  7499 | ALLEN  | SALESMAN |    7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN |    7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MARTIN | SALESMAN |    7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7844 | TURNER | SALESMAN |    7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
+-------+--------+----------+---------+------------+---------+---------+--------+
4 rows in set (0.00 sec)

注意: 0.0 和 NULL 是两会事,一定要注意。

6.LIKE 模糊查询

默认采用 % 匹配任意多个字符;默认采用 _ 匹配任意一个字符

mysql> -- 查询 ename 中包含字母 o 的员工编号和名字
mysql> SELECT empno, ename FROM emp WHERE ename LIKE '%o%';
+-------+-------+
| empno | ename |
+-------+-------+
|  7566 | JONES |
|  7788 | SCOTT |
|  7902 | FORD  |
+-------+-------+
3 rows in set (0.00 sec)

mysql> SELECT empno, ename FROM emp WHERE ename = '%o%';
Empty set (0.00 sec)

mysql>

注意:千万不可使用 = 号来做

mysql> -- 查询 ename 的第三个字母是 o 的员工编号与姓名
mysql> SELECT empno, ename FROM emp WHERE ename LIKE '__o%';
+-------+-------+
| empno | ename |
+-------+-------+
|  7788 | SCOTT |
+-------+-------+
1 row in set (0.00 sec)

mysql>

如果 要查询的内容里面有下划线,我们可以用 \ 转义字符 来做 或者 用 ESCAPE 显示定义转义符来做

查表 并插入测试数据

mysql> -- 插入ename 为 H_W 的一行数据
mysql> INSERT INTO emp(ename) VALUES('H_W');
ERROR 1364 (HY000): Field 'EMPNO' doesn't have a default value
mysql> INSERT INTO emp(empno, ename) VALUES(9500, 'H_W');
Query OK, 1 row affected (0.01 sec)

mysql> select * from emp;
+-------+-----------+-----------+---------+------------+---------+---------+--------+
| EMPNO | ENAME     | JOB       | MANAGER | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
|  7369 | SMITH     | CLERK     |    7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN     | SALESMAN  |    7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD      | SALESMAN  |    7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES     | MANAGER   |    7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN    | SALESMAN  |    7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE     | MANAGER   |    7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK     | MANAGER   |    7839 | 1981-06-02 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT     | ANALYST   |    7566 | 1982-12-09 | 3000.00 |    NULL |     20 |
|  7839 | KING      | PRESIDENT |    NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER    | SALESMAN  |    7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS     | CLERK     |    7788 | 1983-06-12 | 1100.00 |    NULL |     20 |
|  7900 | JAMES     | CLERK     |    7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD      | ANALYST   |    7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER    | CLERK     |    7782 | 1982-06-23 | 1300.00 |    NULL |     10 |
|  8256 | QIU'XIANG | ANALYST   |    7839 | 1986-05-04 | 1400.00 |    NULL |   NULL |
|  9500 | H_W       | NULL      |    NULL | NULL       |    NULL |    NULL |   NULL |
|  9527 | HUA'AN    | CLERK     |    7839 | 1985-01-23 | 1300.00 |    NULL |   NULL |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
17 rows in set (0.00 sec)

进行查询

mysql> -- 查询 ename 第二个位置是 _ 的员工信息
mysql> SELECT empno, ename FROM emp WHERE ename LIKE '_\_%';-- 注意 \_ 是把匹配任意一个字符的 _ 转换成字符 _
+-------+-------+
| empno | ename |
+-------+-------+
|  9500 | H_W   |
+-------+-------+
1 row in set (0.00 sec)

mysql> SELECT empno, ename FROM emp WHERE ename LIKE '_$_%' ESCAPE $;-- 使用escape定义显示转义字符
ERROR 1054 (42S22): Unknown column '$' in 'where clause'
mysql> SELECT empno, ename FROM emp WHERE ename LIKE '_$_%' ESCAPE '$';-- 使用escape定义显示转义字符
+-------+-------+
| empno | ename |
+-------+-------+
|  9500 | H_W   |
+-------+-------+
1 row in set (0.00 sec)
排序 ORDER BY子句

使用 ORDER BY 子句将查询数据排序后再返回数据,默认ASC是升序,DESC是降序。

mysql> -- 查询 em 表中所有员工的工号、姓名、岗位、薪水,按照工号升序排列
mysql> select empno 工号, ename 姓名, job 岗位, sal 薪水 from emp order by empno asc;
+------+-----------+-----------+---------+
| 工号 | 姓名      | 岗位      | 薪水    |
+------+-----------+-----------+---------+
| 7369 | SMITH     | CLERK     |  800.00 |
| 7499 | ALLEN     | SALESMAN  | 1600.00 |
| 7521 | WARD      | SALESMAN  | 1250.00 |
| 7566 | JONES     | MANAGER   | 2975.00 |
| 7654 | MARTIN    | SALESMAN  | 1250.00 |
| 7698 | BLAKE     | MANAGER   | 2850.00 |
| 7782 | CLARK     | MANAGER   | 2450.00 |
| 7788 | SCOTT     | ANALYST   | 3000.00 |
| 7839 | KING      | PRESIDENT | 5000.00 |
| 7844 | TURNER    | SALESMAN  | 1500.00 |
| 7876 | ADAMS     | CLERK     | 1100.00 |
| 7900 | JAMES     | CLERK     |  950.00 |
| 7902 | FORD      | ANALYST   | 3000.00 |
| 7934 | MILLER    | CLERK     | 1300.00 |
| 8256 | QIU'XIANG | ANALYST   | 1400.00 |
| 9500 | H_W       | NULL      |    NULL |
| 9527 | HUA'AN    | CLERK     | 1300.00 |
+------+-----------+-----------+---------+
17 rows in set (0.00 sec)

如果一组排完序有相同的还需要按别的字段排,可以再写一个字段

mysql> -- 查询emp表中所有员工的信息,按照月薪降序排列,如果月薪相同,则按照部门号再排序
mysql> SELECT * FROM emp ORDER BY sal DESC, deptno DESC ;
+-------+-----------+-----------+---------+------------+---------+---------+--------+
| EMPNO | ENAME     | JOB       | MANAGER | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
|  7839 | KING      | PRESIDENT |    NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7788 | SCOTT     | ANALYST   |    7566 | 1982-12-09 | 3000.00 |    NULL |     20 |
|  7902 | FORD      | ANALYST   |    7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7566 | JONES     | MANAGER   |    7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7698 | BLAKE     | MANAGER   |    7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK     | MANAGER   |    7839 | 1981-06-02 | 2450.00 |    NULL |     10 |
|  7499 | ALLEN     | SALESMAN  |    7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7844 | TURNER    | SALESMAN  |    7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  8256 | QIU'XIANG | ANALYST   |    7839 | 1986-05-04 | 1400.00 |    NULL |   NULL |
|  7934 | MILLER    | CLERK     |    7782 | 1982-06-23 | 1300.00 |    NULL |     10 |
|  9527 | HUA'AN    | CLERK     |    7839 | 1985-01-23 | 1300.00 |    NULL |   NULL |
|  7521 | WARD      | SALESMAN  |    7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MARTIN    | SALESMAN  |    7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7876 | ADAMS     | CLERK     |    7788 | 1983-06-12 | 1100.00 |    NULL |     20 |
|  7900 | JAMES     | CLERK     |    7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7369 | SMITH     | CLERK     |    7902 | 1980-12-17 |  800.00 |    NULL |     20 |
+-------+-----------+-----------+---------+------------+---------+---------+--------+
16 rows in set (0.00 sec)

order by 后面的字段可以用 别名 、字段名、 字段序号

聚合函数(组函数)查询

count()、max()、min()、avg()、sum():总计、最大、最小、平均、求和
常搭配别的子句来使用

mysql> select min(sal), max(sal), avg(sal), sum(sal),count(*) from emp;
+----------+----------+-------------+----------+----------+
| min(sal) | max(sal) | avg(sal)    | sum(sal) | count(*) |
+----------+----------+-------------+----------+----------+
|   800.00 |  5000.00 | 1982.812500 | 31725.00 |       17 |
+----------+----------+-------------+----------+----------+
1 row in set (0.00 sec)
分组 GROUP BY子句

根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

注意:在 select 语句之后出现的列,除非使用了组函数处理,否则它必须出现在 group by 之后,不然8.0版本之上会报错的,但是 group by 之后出现的列不时必须要书写在 select 之后

mysql> -- 统计emp表中各部门的最低工资、最高工资、平均工资
mysql> select deptno ,min(sal), max(sal),avg(sal) from emp group by deptno;
+--------+----------+----------+-------------+
| deptno | min(sal) | max(sal) | avg(sal)    |
+--------+----------+----------+-------------+
|     20 |   800.00 |  3000.00 | 2175.000000 |
|     30 |   950.00 |  2850.00 | 1566.666667 |
|     10 |  1300.00 |  5000.00 | 2916.666667 |
|   NULL |  1300.00 |  1400.00 | 1350.000000 |
+--------+----------+----------+-------------+
4 rows in set (0.00 sec)

测试注意点:

mysql> select min(sal), max(sal),avg(sal) from emp group by deptno;
+----------+----------+-------------+
| min(sal) | max(sal) | avg(sal)    |
+----------+----------+-------------+
|   800.00 |  3000.00 | 2175.000000 |
|   950.00 |  2850.00 | 1566.666667 |
|  1300.00 |  5000.00 | 2916.666667 |
|  1300.00 |  1400.00 | 1350.000000 |
+----------+----------+-------------+
4 rows in set (0.00 sec)

mysql> select deptno , sal, min(sal), max(sal),avg(sal) from emp group by deptno;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'kaifamiao.emp.SAL' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mysql> select deptno , sal, min(sal), max(sal),avg(sal) from emp group by deptno, sal;
+--------+---------+----------+----------+-------------+
| deptno | sal     | min(sal) | max(sal) | avg(sal)    |
+--------+---------+----------+----------+-------------+
|     20 |  800.00 |   800.00 |   800.00 |  800.000000 |
|     30 | 1600.00 |  1600.00 |  1600.00 | 1600.000000 |
|     30 | 1250.00 |  1250.00 |  1250.00 | 1250.000000 |
|     20 | 2975.00 |  2975.00 |  2975.00 | 2975.000000 |
|     30 | 2850.00 |  2850.00 |  2850.00 | 2850.000000 |
|     10 | 2450.00 |  2450.00 |  2450.00 | 2450.000000 |
|     20 | 3000.00 |  3000.00 |  3000.00 | 3000.000000 |
|     10 | 5000.00 |  5000.00 |  5000.00 | 5000.000000 |
|     30 | 1500.00 |  1500.00 |  1500.00 | 1500.000000 |
|     20 | 1100.00 |  1100.00 |  1100.00 | 1100.000000 |
|     30 |  950.00 |   950.00 |   950.00 |  950.000000 |
|     10 | 1300.00 |  1300.00 |  1300.00 | 1300.000000 |
|   NULL | 1400.00 |  1400.00 |  1400.00 | 1400.000000 |
|   NULL |    NULL |     NULL |     NULL |        NULL |
|   NULL | 1300.00 |  1300.00 |  1300.00 | 1300.000000 |
+--------+---------+----------+----------+-------------+
15 rows in set (0.00 sec)

mysql>
注意执行顺序

先执行 from之后的,然后才是where子句及表达式,最后才是 sql 表达式 最后才是select查询字段。

mysql> -- 求每个部门各岗位的平均工资
mysql> select deptno 部门编号, job 岗位, avg(sal) 平均工资 from emp group by deptno, job;
+----------+-----------+-------------+
| 部门编号 | 岗位      | 平均工资    |
+----------+-----------+-------------+
|       20 | CLERK     |  950.000000 |
|       30 | SALESMAN  | 1400.000000 |
|       20 | MANAGER   | 2975.000000 |
|       30 | MANAGER   | 2850.000000 |
|       10 | MANAGER   | 2450.000000 |
|       20 | ANALYST   | 3000.000000 |
|       10 | PRESIDENT | 5000.000000 |
|       30 | CLERK     |  950.000000 |
|       10 | CLERK     | 1300.000000 |
|     NULL | ANALYST   | 1400.000000 |
|     NULL | CLERK     | 1300.000000 |
+----------+-----------+-------------+
11 rows in set (0.00 sec)

加入 where 子句变换位置

mysql> SELECT deptno , job , avg(sal)
    -> FROM emp
    -> GROUP BY deptno , job
    -> WHERE deptno IS NOT NULL ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE deptno IS NOT NULL' at line 4
mysql> SELECT deptno , job , avg(sal)
    -> FROM emp
    -> WHERE deptno IS NOT NULL
    -> GROUP BY deptno , job ;
+--------+-----------+-------------+
| deptno | job       | avg(sal)    |
+--------+-----------+-------------+
|     20 | CLERK     |  950.000000 |
|     30 | SALESMAN  | 1400.000000 |
|     20 | MANAGER   | 2975.000000 |
|     30 | MANAGER   | 2850.000000 |
|     10 | MANAGER   | 2450.000000 |
|     20 | ANALYST   | 3000.000000 |
|     10 | PRESIDENT | 5000.000000 |
|     30 | CLERK     |  950.000000 |
|     10 | CLERK     | 1300.000000 |
+--------+-----------+-------------+
9 rows in set (0.00 sec)
分组后筛选 HAVING 子句

顾名思义,having 做的是分组后的数据的筛选。相对于 where 子句是在分组前进行筛选。

一定要搞清楚 where子句是在 sql表达式(group by, order by)之前就运行了的。

mysql> -- 统计平均工资高于 2000 的 部门号和平均月薪
mysql> select deptno, avg(sal) as salavg from emp where deptno is not null group by deptno having salavg > 2000;
+--------+-------------+
| deptno | salavg      |
+--------+-------------+
|     20 | 2175.000000 |
|     10 | 2916.666667 |
+--------+-------------+
2 rows in set (0.00 sec)

mysql> select deptno, avg(sal) as salavg from emp where deptno is not null group by deptno having 2 > 2000;
Empty set (0.00 sec)

mysql> select deptno, avg(sal) as salavg from emp where deptno is not null group by deptno having avg(sal )> 2000;
+--------+-------------+
| deptno | salavg      |
+--------+-------------+
|     20 | 2175.000000 |
|     10 | 2916.666667 |
+--------+-------------+
2 rows in set (0.00 sec)
mysql> select deptno as 部门编号, avg(sal) as salavg from emp where 部门编号 is not null group by deptno having salavg > 2000;
ERROR 1054 (42S22): Unknown column '部门编号' in 'where clause'
mysql> select deptno as 部门编号, avg(sal) as salavg from emp where 1 is not null group by deptno having salavg > 2000;
+----------+-------------+
| 部门编号 | salavg      |
+----------+-------------+
|       20 | 2175.000000 |
|       10 | 2916.666667 |
+----------+-------------+
2 rows in set (0.00 sec)

having 之后的条件中 字段 可以用组函数 别名但不能用查询的字段序号
在 where 字句中 不可以使用组函数 不可以用别名 但可以用查询的字段序号

在 where 字句中可以使用单行函数

sql语句的书写和执行
书写顺序
1SELECT ....      确定结果集中包含哪些列
2FROM ....        确定查询哪张表
3JOIN ... ON .... 确定与哪张表连接以及连接条件是什么
4WHERE ...        对数据进行过滤(有连接查询时表示过滤连接后的结果)
5GROUP BY ...     确定数据分组条件
6HAVING ...       对分组后的数据进行筛选
7ORDER BY ...     对数据进行排序
执行顺序
2FROM ...
3JOIN ... ON ...
4WHERE ...
5GROUP BY ...
6HAVING ...
1SELECT ...
7ORDER BY ...
特殊:

DISTINCTSELECT 执行时执行。

在 MySQL 中,书写时LIMITORDER BY 语句之后,执行时也在ORDER BY之后执行。

Oracle数据库中不支持 LIMIT 语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值