-- 准备数据-- 创建db14数据库CREATEDATABASE db14;CREATETABLE student3 (
id INT,
NAME VARCHAR(20),
age INT,
sex VARCHAR(5),
address VARCHAR(100),
math INT,
english INT);INSERTINTO 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 >35AND sex='男';-- 查询age大于35或性别为男的学生(两个条件其中一个满足)SELECT*FROM student3 WHERE age >35OR sex='男';-- 查询id是1或3或5的学生SELECT*FROM student3 WHERE id=1OR id=3OR 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 BETWEEN75AND90;-- 模糊查询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 ORDERBY age ASC;-- 查询所有数据,使用年龄降序排序SELECT*FROM student3 ORDERBY age DESC;-- 组合排序-- 查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序SELECT*FROM student3 ORDERBY age DESC,math DESC;-- 聚合函数-- SELECT 聚合函数(字段) FROM 表名;-- 查询学生总数: count统计的时候NULL不算SELECTCOUNT(english)FROM student3;-- 通常是这样使用SELECTCOUNT(*)FROM student3;-- 查询年龄大于40的总数SELECTCOUNT(*)FROM student3 WHERE age >40;-- 查询数学成绩总分SELECTSUM(math)FROM student3;-- 查询数学成绩最低分SELECTMIN(math)FROM student3;-- 查询数学成绩平均分SELECTAVG(math)FROM student3;-- 了解:最大值和最小值的差SELECTMAX(math)-MIN(math)FROM student3;-- 分组查询-- 按性别分组: 注意,一般分组都会查询出分组的字段-- 查询男女各多少人SELECT sex,COUNT(*)FROM student3 GROUPBY sex;-- 查询年龄大于25岁的人,按性别分组,统计每组的人数SELECT sex,COUNT(*)FROM student3 WHERE age >25GROUPBY sex;-- 查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据SELECT sex,COUNT(*)FROM student3 WHERE age >25GROUPBY sex HAVINGCOUNT(*)>2;-- limit-- 准备数据INSERTINTO 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 LIMIT2,6;-- 假设我们一每页显示5条记录的方式来分页,SQL语句如下:-- 第一页: 跳过0条件, 获取5条SELECT*FROM student3 LIMIT0,5;-- 第二页: 跳过5条件, 获取5条SELECT*FROM student3 LIMIT5,5;-- 第三页: 跳过10条件, 获取5条SELECT*FROM student3 LIMIT10,5;
主键约束、唯一约束、非空约束、默认约束
-- 创建表学生表st5, 包含字段(id, name, age)将id做为主键-- 创建表时添加主键: 字段名 字段类型 PRIMARY KEYCREATETABLE st5 (
id INTPRIMARYKEY,
NAME VARCHAR(20),
age INT);-- tips: 联合主键的写法,即把两个字段一起作为主键-- primary key(id,age);-- 添加数据INSERTINTO st5 (id, NAME)VALUES(1,'唐伯虎');INSERTINTO st5 (id, NAME)VALUES(2,'周文宾');INSERTINTO st5 (id, NAME)VALUES(3,'祝枝山');INSERTINTO st5 (id, NAME)VALUES(4,'文征明');-- 添加有问题的数据-- Duplicate entry '4' for key 'PRIMARY': 主键不能重复-- insert into st5 (id, name) VALUES (4, '周星驰');-- Column 'id' cannot be null: 主键不能为null-- 删除主键ALTERTABLE st5 DROPPRIMARYKEY;-- 在已有表中添加主键ALTERTABLE st5 ADDPRIMARYKEY(id);-- 主键自动增长-- 创建学生表st6, 包含字段(id, name, age)将id做为主键并自动增长CREATETABLE st6(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20),
age INT);-- 主键默认从1开始自动增长INSERTINTO st6 (NAME, age)VALUES('唐僧',22);INSERTINTO st6 (NAME, age)VALUES('孙悟空',26);INSERTINTO st6 (NAME, age)VALUES('猪八戒',25);INSERTINTO st6 (NAME, age)VALUES('沙僧',20);INSERTINTO st6 (NAME, age)VALUES('白龙马',5);-- 修改自动增长的开始值ALTERTABLE st6 AUTO_INCREMENT=1000;INSERTINTO st6 (NAME, age)VALUES('白晶晶',18);-- 扩展delete和truncate的区别DELETEFROM st6;-- DELETE删除数据就仅仅是删除数据而已,相当于你是房东,把租客赶走,留下房子TRUNCATE st6;-- 删除整个表,再创建一张表结构一样的表,相当你是房东,你把房子拆了,重新建一样的房子-- 创建学生表st7, 包含字段(id, name),name这一列设置唯一约束,不能出现同名的学生CREATETABLE st7(
id INT,
NAME VARCHAR(20)UNIQUE);INSERTINTO st7 VALUES(1,'貂蝉');INSERTINTO st7 VALUES(2,'西施');INSERTINTO st7 VALUES(3,'王昭君');INSERTINTO st7 VALUES(4,'杨玉环');-- 添加重名的数据: Duplicate entry '杨玉环' for key 'name'INSERTINTO st7 VALUES(5,'杨玉环');-- 创建表学生表st8, 包含字段(id,name,gender)其中name不能为NULLCREATETABLE st8 (
id INT,
NAME VARCHAR(20)NOTNULL,
gender CHAR(2));-- 添加一条name为null的数据-- Column 'name' cannot be nullINSERTINTO st8 VALUES(1,NULL,'男');-- 一个字段可以同时添加多个约束CREATETABLE st88(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20)UNIQUENOTNULL,
sex CHAR(2));-- 默认值-- 创建一个学生表 st9,包含字段(id,name,address), 地址默认值是广州CREATETABLE st9(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20),
address VARCHAR(20)DEFAULT'广州');-- 添加一条记录,使用默认地址INSERTINTO st9(id,NAME)VALUES(1,'唐伯虎');-- 添加一条记录,不使用默认地址INSERTINTO st9(id,NAME,address)VALUES(2,'祝枝山','深圳');
外键约束
-- 体会单表的缺点:数据冗余CREATETABLE emp (
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(30),
age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30));-- 添加数据INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('张三',20,'研发部','广州');INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('李四',21,'研发部','广州');INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('王五',20,'研发部','广州');INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('老王',20,'销售部','深圳');INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('大王',22,'销售部','深圳');INSERTINTO emp (NAME, age, dep_name, dep_location)VALUES('小王',18,'销售部','深圳');-- 创建部门表CREATETABLE department(
id INTPRIMARYKEYAUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(60));-- 创建员工表CREATETABLE employee(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT);-- 添加2个部门INSERTINTO department(dep_name,dep_location)VALUES('研发部','广州'),('销售部','深圳');-- 添加员工,dep_id表示员工所在的部门INSERTINTO employee(NAME,age,dep_id)VALUES('张三',20,1),('李四',21,1),('王五',20,1),('老王',20,2),('大王',22,2),('小王',18,2);-- 删除副表/从表 employeeDROPTABLE employee;-- 创建从表 employee 并添加外键约束CREATETABLE employee(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,CONSTRAINT emp_depid_ref_dep_id_fk FOREIGNKEY(dep_id)REFERENCES department(id));-- 正常添加数据INSERTINTO employee VALUES(1,'刘德华',58,1);INSERTINTO employee VALUES(2,'郭富城',56,2);-- 添加不正常的数据INSERTINTO employee VALUES(3,'马云',55,3);-- 删除外键ALTERTABLE employee DROPFOREIGNKEY emp_depid_ref_dep_id_fk;-- 在已有表添加外键ALTERTABLE employee ADDCONSTRAINT emp_depid_ref_dep_id_fk FOREIGNKEY(dep_id)REFERENCES department(id);-- 外键的级联-- 要把部门表中的id值2,改成5,能不能直接修改呢?UPDATE department SET id=5WHERE id=2;-- 要删除部门id等于1的部门, 能不能直接删除呢?DELETEFROM department WHERE id=1;-- 添加级联更新和级联删除-- 删除employee表DROPTABLE employee;-- 重新创建employee表,添加级联更新和级联删除CREATETABLE employee(
id INTPRIMARYKEYAUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,CONSTRAINT emp_depid_ref_dep_id_fk FOREIGNKEY(dep_id)REFERENCES department(id)ONUPDATECASCADEONDELETECASCADE);-- 外键有级联操作后,修改主键将id=2改成id=10UPDATE department SET id=10WHERE id=2;-- 外键有级联操作后,删除主键id=1DELETEFROM department WHERE id=1;