1.分组查询
-- 比如我按部分编号分组 比如有三个部门 然后我求每个部门的平均工资 那展示出来的数据应该有三条
-- 一般聚合函数会配合分组来用
SELECT deptno AS 部门编号,AVG(sal) AS 平均工资 FROM emp GROUP BY deptno;
-- 查询每个部门多少人
SELECT deptno AS 部门编号,COUNT(*) AS 部门人数 FROM emp GROUP BY deptno;
-- 找一个合理的字段来分组 根据性别来分
-- 按照工资高低来分 大于1500的一组,小于1500的 一组
SELECT COUNT(*) AS 人数 FROM emp GROUP BY sal>=1500;
-- 1.例如查询 每个部门的部门编号 以及每个部门工资大于1500的人数
-- 我们在分组之前,也进行一个条件的筛选,符合条件的参与分组,不符合条件的不参与分组
SELECT deptno AS 部门编号,COUNT(*) AS 部门人数 FROM emp WHERE sal>1500 GROUP BY deptno;
-- 分组之后还可以进行排序
SELECT deptno AS 部门编号,COUNT(*) AS 部门人数 FROM emp WHERE sal>1500 GROUP BY deptno ORDER BY 部门人数;
-- 2.例如 我要查询 各个部门平均工资 大于2000 的部门
-- 我们需要对分组之后,产生的结果集进行再次筛选 使用 having
SELECT deptno AS 部门编号,AVG(sal) AS 平均工资 FROM emp GROUP BY deptno HAVING 平均工资>2000 ORDER BY 平均工资;
-- 3. 例如我要查询 各个部门 员工工资大于1500 的平均工资 并且平均工资 大于2000的部门
-- 分组之前也进行条件的筛选 员工工资大于1500 参与分组 分完组之后还要筛选 平均工资 大于2000的部门
SELECT deptno AS 部门编号,AVG(sal) AS 平均工资 FROM emp WHERE sal>1500 GROUP BY deptno HAVING 平均工资>2000;
-- having和where的区别?
-- * where:在分组之前对条件进行限定。不满足条件,就不会参与分组
-- * having:在分组之后,对结果集的筛选
2.分页查询
-- 分页 LIMIT
SELECT * FROM emp;
-- 查询第一页的数据,每页展示3条
SELECT * FROM emp LIMIT 0,3;
-- 查询第二页的数据,每页展示3条
SELECT * FROM emp LIMIT 3,3;
-- 查询第三页的数据,每页展示3条
SELECT * FROM emp LIMIT 6,3;
-- 查询第四页的数据,每页展示3条
SELECT * FROM emp LIMIT 9,3;
-- 查询第五页的数据,每页展示3条
SELECT * FROM emp LIMIT 12,3;
起始索引=(页码-1)*每页的条数
-- 查询第一页的数据,每页展示3条
SELECT * FROM emp WHERE sal>1500 LIMIT 0,3;
SELECT * FROM emp WHERE sal>1500 ORDER BY sal DESC LIMIT 0,3;
3.子查询和定义变量
-- 查询最高工资
SELECT MAX(sal) FROM emp;
-- 查询最高工资的员工姓名
-- 用子查询:一条主查询的条件的值,来自于另一条子查询
SELECT ename,sal FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
-- 方式2:
SELECT ename,sal,MAX(sal) FROM emp WHERE sal=5000;
-- 定义一个变量,保存一下聚合函数的结果,使用这个变量作为条件
SELECT ename,sal,@gz:=MAX(sal) AS 最高工资 FROM emp;
SELECT @gz;
-- 变量的使用
-- 使用一个变量,来保存一下这个最高工资, 注意赋值的语法 使用 := 来赋值
SELECT @gz:=MAX(sal) AS 最高工资 FROM emp;
-- 查看变量的值
SELECT @gz;
SELECT * FROM emp WHERE sal=@gz;
4.case when then end 语句
-- -- 给不同职位的员工加不同的工资,使用 case when then end 语句来完成
SELECT ename,job,sal AS 原来的工资,
CASE job
WHEN 'PRESIDENT' THEN sal+1000
WHEN 'MANAGER' THEN sal+800
ELSE sal+300
END AS 涨后的工资
FROM emp;
5.约束
6.主键约束
-- 添加主键约束的语法
-- 方式1 建表的时候,给某个字段添加主键约束
CREATE TABLE test(
id INT,
username VARCHAR(20) PRIMARY KEY -- 给这个字段添加主键约束
);
INSERT INTO test VALUES(1,'tom');-- 成功
INSERT INTO test VALUES(2,'tom');-- 失败
INSERT INTO test VALUES(2,'jery');-- 成功
INSERT INTO test VALUES(2,NULL); -- 失败
-- 方式2 建表的时候,给某个字段添加主键约束
CREATE TABLE test2(
id INT,
username VARCHAR(20),
PRIMARY KEY(id) -- 在这里指定主键字段
);
INSERT INTO test2 VALUES(1,'tom');-- 成功
INSERT INTO test2 VALUES(1,'tom2');-- 失败
-- 方式3 表建好之后,再添加主键约束
CREATE TABLE test3(
id INT,
username VARCHAR(20)
);
-- 采用修改表的方式,来添加主键
ALTER TABLE test3 ADD PRIMARY KEY(username);
INSERT INTO test3 VALUES(1,'tom');-- 成功
INSERT INTO test3 VALUES(2,'tom');-- 失败
-- 联合主键:把多个字段作为一个整体,来添加主键约束
CREATE TABLE test4(
id INT,
username VARCHAR(20)
);
-- 把 id 和 username 看做一个整体,添加联合主键
ALTER TABLE test4 ADD PRIMARY KEY(id,username);
INSERT INTO test4 VALUES(1,'tom');-- 成功
INSERT INTO test4 VALUES(1,'jery');-- 成功
INSERT INTO test4 VALUES(1,NULL);-- 失败
INSERT INTO test4 VALUES(NULL,'tom');-- 失败
-- 我们也强烈的建议,建表的时候,要有一个主键,一般建议建表的时候,给个 id 整数型字段,把这个id字段作为主键,
7.唯一约束
CREATE TABLE test5(
id INT,
username VARCHAR(20) UNIQUE -- 添加唯一约束
);
INSERT INTO test5 VALUES(1,'tom');-- 成功
CREATE TABLE test6(
id INT,
username VARCHAR(20),
UNIQUE(id) -- 唯一约束
);
INSERT INTO test6 VALUES(1,'tom');-- 成功
INSERT INTO test6 VALUES(1,'jery');
CREATE TABLE test7(
id INT,
username VARCHAR(20)
);
ALTER TABLE test7 ADD UNIQUE(username);
INSERT INTO test7 VALUES(1,'tom');-- 成功
INSERT INTO test7 VALUES(1,NULL);-- 成功
INSERT INTO test7 VALUES(1,NULL);-- 成功
8.非空约束
CREATE TABLE test8(
id INT,
username VARCHAR(20) NOT NULL -- 非空约束
);
INSERT INTO test8 VALUES(1,NULL);-- 成功
-- UNIQUE NOT NULL, 组合起来,给表中多个字段加,但他不等同于 主键约束,主键约束一个表中只能有一个。
CREATE TABLE test9(
id INT UNIQUE NOT NULL,
username VARCHAR(20) UNIQUE NOT NULL -- 唯一 非空约束
);
9.枚举类型
CREATE TABLE test91 (
username VARCHAR (20) PRIMARY KEY,
age INT UNIQUE NOT NULL, -- 唯一约束
sex ENUM('男','女') -- 字段的数据类型是枚举类型,可以起到约束 的作用
);
INSERT INTO test91 VALUES('aaa',10,'男');
INSERT INTO test91 VALUES('bbb',20,'女');
INSERT INTO test91 VALUES('ccc',30,'妖');
10.非负约束
UNSIGNED
INSERT INTO test92 VALUES('ccc',-1);
CREATE TABLE test93 (
username VARCHAR (20) PRIMARY KEY,
age TINYINT UNSIGNED -- 非负约束
);
TINYINT 1个字节 -128---127
TINYINT UNSIGNED 0---255
INSERT INTO test93 VALUES('ccc',1);
INSERT INTO test93 VALUES('ddd',255);
11.自增长约束
CREATE TABLE test94 (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长
username VARCHAR (20),
age TINYINT UNSIGNED -- 非负约束
);
INSERT INTO test94(username,age) VALUES('ddd',255);
INSERT INTO test94(username,age) VALUES('bbb',255);
12.实体与实体之间的关系
13.ER图
14.外键约束
-- 创建用户表
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20)
);
-- 创建订单表
CREATE TABLE orders(
id INT PRIMARY KEY AUTO_INCREMENT,
totalprice DOUBLE,
user_id INT -- 这个字段的意思是 这个订单属于哪个用户,也就是说同个这个字段让表和表之前存在对应关系
);
-- 通过修改表来添加外键约束
-- alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES USER(id);
CREATE TABLE zhu(
zid INT PRIMARY KEY AUTO_INCREMENT, -- 主键
zname VARCHAR(20)
);
CREATE TABLE cong(
zid INT PRIMARY KEY AUTO_INCREMENT,
zscore INT,
zzid INT, -- 外键
-- 方式2:建表的时候就加上了外键约束
FOREIGN KEY(zzid) REFERENCES zhu(zid)
);