0
点赞
收藏
分享

微信扫一扫

MySQL数据库(分组和分页,约束)

朱小落 2022-02-19 阅读 50

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)
);
举报

相关推荐

0 条评论