MySQL语句大全之约束

查询语句:
-- 准备数据
-- 创建db14数据库
CREATE DATABASE db14;

CREATE TABLE student3 (
  id INT,
  NAME VARCHAR(20),
  age INT,
  sex VARCHAR(5),
  address VARCHAR(100),
  math INT,
  english INT
);

INSERT INTO student3(id,NAME,age,sex,address,math,english) 
VALUES 
(1,'马云',55,'男','杭州',66,78),
(2,'马化腾',45,'女','深圳',98,87),
(3,'马景涛',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),
(8,'德玛西亚',18,'男','南京',56,65);


-- 查询math分数大于80分的学生
SELECT * FROM student3 WHERE math > 80;


-- 查询english分数小于或等于80分的学生
SELECT * FROM student3 WHERE english <= 80;

-- 查询age等于20岁的学生
SELECT * FROM student3 WHERE age <= 20;

-- 查询age不等于20岁的学生
SELECT * FROM student3 WHERE age <> 20;


-- 逻辑运算符
-- 查询age大于35且性别为男的学生(两个条件同时满足)
SELECT * FROM student3 WHERE age > 35 AND sex='男';


-- 查询age大于35或性别为男的学生(两个条件其中一个满足)
SELECT * FROM student3 WHERE age > 35 OR sex='男';


-- 查询id是1或3或5的学生
SELECT * FROM student3 WHERE id=1 OR id=3 OR id=5;


-- in: 在...里面,只要是满足()里面的数据都可以
-- 查询id是1或3或5的学生
SELECT * FROM student3 WHERE id IN(1,3,5);


-- 范围: BETWEEN 值1 AND 值2 -- 表示从值1到值2范围,包头又包尾
-- 查询english成绩大于等于75,且小于等于90的学生
SELECT * FROM student3 WHERE english BETWEEN 75 AND 90;


-- 模糊查询like
-- 查询姓马的学生: 第一个是马,后面无所谓
SELECT * FROM student3 WHERE NAME LIKE '马%';


-- 查询姓名中包含'德'字的学生
SELECT * FROM student3 WHERE NAME LIKE '%德%';


-- 查询姓马,且姓名有三个字的学生
SELECT * FROM student3 WHERE NAME LIKE '马__';


-- 查询姓马的或姓柳的
SELECT * FROM student3 WHERE NAME LIKE '马%' OR NAME LIKE '柳%';


-- 排序
-- 单列排序
-- 查询所有数据,使用年龄升序排序
SELECT * FROM student3 ORDER BY age ASC;


-- 查询所有数据,使用年龄降序排序
SELECT * FROM student3 ORDER BY age DESC;


-- 组合排序
-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
SELECT * FROM student3 ORDER BY age DESC,math DESC;


-- 聚合函数
-- SELECT 聚合函数(字段) FROM 表名;

-- 查询学生总数: count统计的时候NULL不算
SELECT COUNT(english) FROM student3;
 

-- 通常是这样使用
SELECT COUNT(*) FROM student3;


-- 查询年龄大于40的总数
SELECT COUNT(*) FROM student3 WHERE age > 40;


-- 查询数学成绩总分
SELECT SUM(math) FROM student3;


-- 查询数学成绩最低分
SELECT MIN(math) FROM student3;


-- 查询数学成绩平均分
SELECT AVG(math) FROM student3;


-- 了解:最大值和最小值的差
SELECT MAX(math) - MIN(math) FROM student3; 


-- 分组查询

-- 按性别分组: 注意,一般分组都会查询出分组的字段


-- 查询男女各多少人
SELECT sex,COUNT(*) FROM student3 GROUP BY sex;



-- 查询年龄大于25岁的人,按性别分组,统计每组的人数
SELECT sex,COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex;



-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
SELECT sex,COUNT(*) FROM student3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) > 2;


-- limit
-- 准备数据
INSERT INTO student3(id,NAME,age,sex,address,math,english) VALUES 
(9,'唐僧',25,'男','长安',87,78),
(10,'孙悟空',18,'男','花果山',100,66),
(11,'猪八戒',22,'男','高老庄',58,78),
(12,'沙僧',50,'男','流沙河',77,88),
(13,'白骨精',22,'女','白虎岭',66,66),
(14,'蜘蛛精',23,'女','盘丝洞',88,88);

SELECT * FROM student3;


-- 查询学生表中数据,跳过前面2条,显示6条
SELECT * FROM student3 LIMIT 2,6;


-- 假设我们一每页显示5条记录的方式来分页,SQL语句如下:
-- 第一页: 跳过0条件, 获取5条
SELECT * FROM student3 LIMIT 0,5;


-- 第二页: 跳过5条件, 获取5条
SELECT * FROM student3 LIMIT 5,5;


-- 第三页: 跳过10条件, 获取5条
SELECT * FROM student3 LIMIT 10,5;

主键约束、唯一约束、非空约束、默认约束
-- 创建表学生表st5, 包含字段(id, name, age)将id做为主键
-- 创建表时添加主键: 字段名 字段类型 PRIMARY KEY
CREATE TABLE st5 (
	id INT PRIMARY KEY,
	NAME VARCHAR(20),
	age INT
);

-- tips: 联合主键的写法,即把两个字段一起作为主键
-- primary key(id,age);


-- 添加数据
INSERT INTO st5 (id, NAME) VALUES (1, '唐伯虎');
INSERT INTO st5 (id, NAME) VALUES (2, '周文宾');
INSERT INTO st5 (id, NAME) VALUES (3, '祝枝山');
INSERT INTO st5 (id, NAME) VALUES (4, '文征明');

-- 添加有问题的数据
-- Duplicate entry '4' for key 'PRIMARY': 主键不能重复
-- insert into st5 (id, name) VALUES (4, '周星驰');

-- Column 'id' cannot be null: 主键不能为null


-- 删除主键
ALTER TABLE st5 DROP PRIMARY KEY;


-- 在已有表中添加主键
ALTER TABLE st5 ADD PRIMARY KEY(id);


-- 主键自动增长
-- 创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长
CREATE TABLE st6(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT
);


-- 主键默认从1开始自动增长
INSERT INTO st6 (NAME, age) VALUES ('唐僧', 22);
INSERT INTO st6 (NAME, age) VALUES ('孙悟空', 26);
INSERT INTO st6 (NAME, age) VALUES ('猪八戒', 25);
INSERT INTO st6 (NAME, age) VALUES ('沙僧', 20);
INSERT INTO st6 (NAME, age) VALUES ('白龙马', 5);

-- 修改自动增长的开始值
ALTER TABLE st6 AUTO_INCREMENT=1000;
INSERT INTO st6 (NAME, age) VALUES ('白晶晶', 18);


-- 扩展delete和truncate的区别
DELETE FROM st6; -- DELETE删除数据就仅仅是删除数据而已,相当于你是房东,把租客赶走,留下房子
TRUNCATE st6; -- 删除整个表,再创建一张表结构一样的表,相当你是房东,你把房子拆了,重新建一样的房子


-- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生
CREATE TABLE st7(
	id INT,
	NAME VARCHAR(20) UNIQUE
);

INSERT INTO st7 VALUES (1, '貂蝉');
INSERT INTO st7 VALUES (2, '西施');
INSERT INTO st7 VALUES (3, '王昭君');
INSERT INTO st7 VALUES (4, '杨玉环');

-- 添加重名的数据: Duplicate entry '杨玉环' for key 'name'
INSERT INTO st7 VALUES(5,'杨玉环');

-- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULL
CREATE TABLE st8 (
	id INT,
	NAME VARCHAR(20) NOT NULL,
	gender CHAR(2)
);

-- 添加一条name为null的数据
-- Column 'name' cannot be null
INSERT INTO st8 VALUES(1,NULL,'男');


-- 一个字段可以同时添加多个约束
CREATE TABLE st88(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20) UNIQUE NOT NULL,
	sex CHAR(2)
);

-- 默认值
-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE st9(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	address VARCHAR(20) DEFAULT '广州'
);

-- 添加一条记录,使用默认地址
INSERT INTO st9(id,NAME) VALUES(1,'唐伯虎');


-- 添加一条记录,不使用默认地址
INSERT INTO st9(id,NAME,address) VALUES(2,'祝枝山','深圳');

外键约束
-- 体会单表的缺点:数据冗余
CREATE TABLE emp (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);

-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');

INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');



-- 创建部门表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(20),
	dep_location VARCHAR(60)
);


-- 创建员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT
);


-- 添加2个部门
INSERT INTO department(dep_name,dep_location) VALUES ('研发部', '广州'), ('销售部', '深圳');

-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee(NAME,age,dep_id) VALUES
('张三', 20, 1), 
('李四', 21, 1), 
('王五', 20, 1), 
('老王', 20, 2),
('大王', 22, 2),
('小王', 18, 2);



-- 删除副表/从表 employee
DROP TABLE employee;


-- 创建从表 employee 并添加外键约束
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT,
	CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id)
);


-- 正常添加数据
INSERT INTO employee VALUES (1, '刘德华', 58, 1);
INSERT INTO employee VALUES (2, '郭富城', 56, 2);


-- 添加不正常的数据
INSERT INTO employee VALUES(3,'马云',55,3);


-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY emp_depid_ref_dep_id_fk;


-- 在已有表添加外键
ALTER TABLE employee ADD CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id);


-- 外键的级联
-- 要把部门表中的id值2,改成5,能不能直接修改呢?
UPDATE department SET id=5 WHERE id=2;


-- 要删除部门id等于1的部门, 能不能直接删除呢?
DELETE FROM department WHERE id=1;


-- 添加级联更新和级联删除
-- 删除employee表
DROP TABLE employee;

-- 重新创建employee表,添加级联更新和级联删除
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT,
	CONSTRAINT emp_depid_ref_dep_id_fk FOREIGN KEY(dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE
);


-- 外键有级联操作后,修改主键将id=2改成id=10
UPDATE department SET id=10 WHERE id=2;


-- 外键有级联操作后,删除主键id=1
DELETE FROM department WHERE id=1;

猜你喜欢

转载自blog.csdn.net/RookiexiaoMu_a/article/details/88908330