一、单表
(一)、创建表 / 删除表
- 创建表:
create table 表名(列名1 类型(size), 列名2 类型(size),...);
create table student( ID int, xingming varchar(10), banji varchar(2), zhuanye varchar(10), xuehao varchar(8) );
- 删除表:
drop table 表名;
drop table student;
(二)、“增” —— 插入数据
- 对 指定列 插入数据:
insert into 表名 (字段 类型,) values(值,);
- 对 所有列 插入数据
insert into 表名 values(值,);
- 所有
串类型
值,都要用''
号或""
号括上.insert into student(ID,xingming,banji,zhuanye,xuehao) values(1,'张三','2','英语','20180220'); insert into student(ID,xingming,banji,zhuanye,xuehao) values(2,'李四','2','英语','20180221'); insert into student(ID,xingming,banji) values(3,'王五','3',null,null); -- 未注明的项,都填null insert into student values(4,'赵六','3','电子工程','20181202'); insert into student values(5,'郑七','4','电子工程','20181201'); insert into student values(6,'胡八','3',null,'20181203');
ID xingming banji zhuanye xuehao 1 张三 2 英语 20180220 2 李四 2 英语 20180221 3 王五 3 null null 4 赵六 3 电子工程 20181202 5 郑七 4 电子工程 20181201 6 胡八 3 null 20181203
(三)、“删” —— 删除数据
- 删除符合条件的数据:
delete from 表名 where 条件;
delete from student where ID = 1; delete from student where xingming = '李四';
ID xingming banji zhuanye xuehao 3 王五 3 null null 4 赵六 3 电子工程 20181202 5 郑七 4 电子工程 20181201 6 胡八 3 null 20181203
(四)、“改” —— 修改数据
- 修改符合条件的数据:
update 表名 set 字段名 = 新值 where 条件;
- 将'王五'的专业名改为'英语': update student set zhuanye = '英语' where xingming = '王五';
ID xingming banji zhuanye xuehao 3 王五 3 英语 null 4 赵六 3 电子工程 20181202 5 郑七 4 电子工程 20181201 6 胡八 3 null 20181203
(五)、“查” —— 查询数据
- 5.1 普通单表查询:
select 内容 form 表名 where 条件;
'''展示表内所有的数据: ''' select * from student;
ID xingming banji zhuanye xuehao 3 王五 3 英语 null 4 赵六 3 电子工程 20181202 5 郑七 4 电子工程 20181201 6 胡八 3 null 20181203 '''展示3班所有学生的数据: ''' select * from student where banji = '3';
ID xingming banji zhuanye xuehao 3 王五 3 英语 null 4 赵六 3 电子工程 20181202 6 胡八 3 null 20181203 '''展示3班、电子工程专业学生的所有信息: ''' select * from student where banji = '3' and zhuanye = '电子工程';
ID xingming banji zhuanye xuehao 4 赵六 3 电子工程 20181202 '''展示3班、电子工程专业学生的姓名: ''' select xingming as 姓名 where banji = '3' and zhuanye = '电子工程';
姓名 赵六
- 5.2 分组查询:
select 字段1, 字段2 from 表名 group by 字段1;
'''查询每个班级有几人(按班级分组, 且分别计算人数, 展示为两列): ''' select banji as 班级,count(*) as 人数 from student group by banji;
班级 人数 3 3 4 1
- 5.3 给分组增加过滤条件:
... group by 字段名 having 函数;
'''对分组查询,增加过滤条件,使用 having + 条件, having 后接函数:(将人数超过2人的班级,以班级分组显示)''' select banji as 班级 from student group by banji having count(*) >= 2;
班级 3 点击查看:常用的函数:例如 “聚合函数”
min()
、max()
、avg()
、count()
...
常用的聚合函数 作用 min()
最小值 max()
最大值 avg()
平均值 count()
总和
- 5.4 结果排序:
order by 字段名 asc/desc;
按照某字段, 正序 / 逆序排列. (默认正序)
步骤: 1. 创建一个表scores: create table scores( ID int, xingming varchar(10), kemu varchar(10), score int ); 2. 插入对应的数据: insert into scores values(1,'赵一','数学',98); insert into scores values(2,'钱二','语文',99); insert into scores values(3,'孙三','数学',99); insert into scores values(4,'李四','数学',98); insert into scores values(5,'周五','语文',99); insert into scores values(6,'吴六','数学',97);
ID xingming kemu score 1 赵一 数学 98 2 钱二 语文 99 3 孙三 数学 99 4 李四 数学 98 5 周五 语文 99 6 吴六 数学 97 3. 查询: 将学生的数学成绩,按照ID由大到小排序(逆序排列): select * from scores where kemu = '数学' order by ID desc;
ID xingming kemu score 6 吴六 数学 97 4 李四 数学 98 3 孙三 数学 99 1 赵一 数学 98
- 5.5 单表综合查询:
1. 建表 + 增加数据:
create table books( id int primary key, shuhao varchar(20), shuming varchar(20) not null, zuozhe varchar(20), yeshu int, chubanshe varchar(20), chubanriqi date, zhuangtai varchar(20) ); insert into books values(1, 001, '高等数学', '张三', 430, '中华书局', 1992-08-01, '上架' ); insert into books values(2, 002, '线性代数', '张三', 380, '华南书局', 1993-08-01, '上架' ); insert into books values(3, 003, '实用英语', '李四', 600, '中华书局', 1992-08-01, '上架' ); insert into books values(4, 004, '商务英语', '李四', 500, '山东书局', 1992-08-01, '上架' ); insert into books values(5, 005, '材料科学', '王五', 800, '华南书局', 1992-08-01, '上架' ); insert into books values(6, 006, '微积分学', '王五', 880, '中华书局', 1992-08-01, '上架' ); insert into books values(7, 007, '化学工业', '王五', 680, '中华书局', 1992-08-01, '上架' );
id shuhao shuming zuozhe yeshu chubanshe chubanriqi zhuangtai 1 001 高等数学 张三 430 中华书局 1991-08-01 上架 2 002 线性代数 张三 380 华南书局 1992-08-01 上架 3 003 实用英语 李四 600 中华书局 1991-08-01 上架 4 004 商务英语 李四 500 山东书局 1993-08-01 上架 5 005 材料科学 王五 800 华南书局 1991-08-01 上架 6 006 微积分学 王五 880 中华书局 1992-08-01 上架 7 007 化学工业 王五 680 中华书局 1993-08-01 上架
2. 查询: 和英语相关的书籍有哪些?
select shuming as 书籍名称 from books where shuming like '%英语%';
书籍名称 实用英语 商务英语
3. 查询: [高等数学]和[实用英语]的书号是多少?
select shuming as 书籍名称,shuhao as 书号 from books where shuming = '高等数学' or shuming = '实用英语';
书籍名称 书号 高等数学 001 实用英语 003
4. 查询: 哪些书的[页数]在300~499之间?
select shuming as 书籍名称,yeshu as 页数 from books where yeshu between 300 and 499;
书籍名称 页数 高等数学 430 线性代数 380
5. 查询: 每个出版社发行图书的数量是多少?
select chubanshe as 出版社,count(*) as 发行的图书数量 from books group by chubanshe;
出版社 发行的图书数量 中华书局 4 华南书局 2 山东书局 1
6. 查询: 哪个出版社至少发行过2本书?
select chubanshe as 出版社,count(*) as 发行图书数 from books group by chubanshe having count(*) >= 2;
出版社 发行图书数 中华书局 4 华南书局 2
7. 计算: 王五比张三多出了几本书?
(嵌套查询)select (select count(*) from books where zuozhe = '王五')- (select count(*) from books where zuozhe = '张三');
3 - 2 = 1(本)
8. 查询: 哪本书的[页数]比线性代数多?
(嵌套查询)select shuming as 书名, yeshu as 页数 from books where yeshu > ( select sum(yeshu) from books where shuming = '线性代数' );
书名 页数 高等数学 430 实用英语 600 商务英语 500 材料科学 800 微积分学 880 化学工业 680
9. 查询: 张三出的两本书的平均页数是多少?
select avg(yeshu) as 平均页数 from books where zuozhe = '张三';
平均页数 405
10. 查询: 和高等数学是相同初版日期的书籍信息?
(嵌套查询)select * from books where chubanriqi = ( select chubanriqi from books where shuming = '高等数学' );
id shuhao shuming zuozhe yeshu chubanshe chubanriqi zhuangtai 1 001 高等数学 张三 430 中华书局 1991-08-01 上架 3 003 实用英语 李四 600 中华书局 1991-08-01 上架 5 005 材料科学 王五 800 华南书局 1991-08-01 上架
11. 查询: 高等数学的[页数]比线性代数多多少?
(嵌套查询)select yeshu - ( select yeshu from books where shuming = '线性代数' ) from books where shuming = '高等数学';
430 - 380 = 50(页)
12. 查询: 每个作者各出版了多少页的书籍?
select zuozhe as 作者,sum(yeshu) as 总页数 from books group by zuozhe;
作者 总页数 张三 810 李四 1100 王五 2360
13. 查询: 哪个作者出版的所有书籍都少于500页?
(嵌套查询)select 作者 as 出版的所有书籍都少于500页的作者 from ( select zuozhe as 作者,max(yeshu) as 最大页数 from books group by zuozhe ) as T where 最大页数 < 500;
出版的所有书籍都少于500页的作者 张三 T表如下:
作者 最大页数 张三 430 李四 600 王五 880
14. 查询: 哪个作者出版的图书最多?
(多层嵌套查询)select 作者 as 出版图书最多的作者 from ( select zuozhe as 作者,count(*) as 出版图书数量 from books group by zuozhe ) as U where 出版图书数量 = ( select max(出版图书数量) from ( select zuozhe as 作者,count(*) as 出版图书数量 from books group by zuozhe ) as U );
出版图书最多的作者 王五 U表:
作者 出版图书数量 张三 2 李四 2 王五 3
15. 查询: 页数最多的书籍是哪本书?
(多层嵌套查询)select 书名 as 页数最多的书籍 from ( select shuming as 书名,yeshu as 页数 from books ) as M where 页数 = ( select max(yeshu) from ( select shuming as 书名,yeshu as 页数 from books ) as M );
页数最多的书籍 微积分学 M表:
书名 页数 高等数学 430 线性代数 380 实用英语 600 商务英语 500 材料科学 800 微积分学 880 化学工业 680
- 6.6 From子表查询
pro表:
产品名称 入库数量 入库时间 烧鸡 10 2010-10-10 烤鸭 12 2014-09-09 榴莲 01 2017-08-08 烧鸡 13 2017-07-07 榴莲 03 2017-05-08 榴莲 06 2017-08-09
问题:哪个产品入库数量最多?
*思路:算出每个产品的入库数量,找到数量最大的即可
1)查询每个产品的入库数量select 产品名称, sum(入库数量) as 总数 from pro group by 产品名称
产品名称 总数 烧鸡 23 烤鸭 12 榴莲 10 把这个查询的结果命名为一个子表
tmp
:(select 产品名称, sum(入库数量) as 总数 from pro group by 产品名称) as tmp
2)从tmp表中,查询最大的总数(23)
select max(总数) from tmp
3)从tmp表中,查询哪个产品总数是23
select * from tmp where 总数 = '23'
4)合并1
select * from tmp where 总数= ( select max(总数) from tmp )
5)合并2
select * from ( select 产品名称, sum(入库数量) as 总数 from pro group by 产品名称 ) as tmp where 总数= ( select max(总数) from ( select 产品名称, sum(入库数量) as 总数 from pro group by 产品名称 ) as tmp )
二、双表查询
【建表约束】
- 创建表
class、xsry_tel2
,对其中的各个列名进行键值的限制:主键(PK)、外键(FK)、非空、唯一...
create table class(
ID int primary key, -- 主键(唯一标识一条记录),缩写为:PK
xingming varchar(20) not null, -- 非空(必填)
cardid varchar(20) unique, -- 唯一(不能重复)
shengao int,
jiguan varchar(10) not null unique -- 非空且唯一
);
create table xsry_tel2(
TEL_ID int,
TEL_XS_ID int not null,
TEL_HAOMA varchar(20) ,
constraint fk_xs_id foreign key(TEL_XS_ID) references xsry(XS_ID), -- 外键约束
constraint pk_TEL_ID PRIMARY KEY(TEL_ID), -- 主键约束
constraint unq_TEL_HAOMA unique(TEL_HAOMA) -- 唯一约束
);
双表查询
1、建表
create table xsry(
XS_ID INT PRIMARY KEY ,
XS_XINGMING VARCHAR(200),
XS_XINGBIE VARCHAR(10)
);
insert INTO xsry values(1,'麦兜','男');
insert INTO xsry values(2,'柯南','男');
insert INTO xsry values(3,'美羊羊','女');
create table xsry_tel(
TEL_ID int ,
TEL_XS_ID int not null,
TEL_HAOMA varchar(20) ,
constraint fk_xs_id foreign key(TEL_XS_ID) references xsry(XS_ID), -- 外键约束
constraint pk_TEL_ID PRIMARY KEY(TEL_ID), -- 主键约束
constraint unq_TEL_HAOMA unique(TEL_HAOMA) -- 唯一约束
);
insert into xsry_tel values(1,1,'222');
insert into xsry_tel values(2,1,'333');
insert into xsry_tel values(3,2,'444');
销售人员信息表xsry
(主表):
XS_ID | XS_XINGMING | XS_ XINGBIE |
---|---|---|
1 | 麦兜 | 男 |
2 | 柯南 | 男 |
3 | 美羊羊 | 女 |
销售人员电话表xsry_tel
(从表):
TEL_ID | TEL_XS_ID | TEL_HAOMA |
---|---|---|
1 | 1 | 222 |
2 | 1 | 333 |
3 | 2 | 444 |
- 查询每个人的个人信息及电话号码:
select xsry.*,xsry_tel.TEL_HAOMA -- xsry表所有列的信息,xsry_tel表的TEL_HAOMA列的信息 from xsry,xsry_tel -- 从两张表查询时,两张表用“,”号连接 where xsry.XS_ID = xsry_tel.TEL_XS_ID -- 条件一定是两张表关联的信息
XS_ID XS_XINGMING XS_XINGBIE TEL_HAOMA 1 麦兜 男 222 1 麦兜 男 333 2 柯南 男 444
- 查询柯南的电话号码
SELECT XS_XINGMING,TEL_HAOMA FROM xsry,xsry_tel WHERE xsry.XS_ID = xsry_tel.TEL_XS_ID AND XS_XINGMING = '柯南'
- 查询每个人有几部电话
SELECT XS_XINGMING,COUNT(*) FROM xsry,xsry_tel WHERE xsry.XS_ID = xsry_tel.TEL_XS_ID -- 如果两张表的字段名有重复的,则必须写明是取自哪张表 GROUP BY XS_XINGMING -- 以姓名分组显示
- 查询哪个人至少有两部电话
select XS_XINGMING, count(*) from xsry,xsry_tel where XS_ID = TEL_XS_ID group by XS_XINGMING -- 以姓名分组显示 having count(*)>=2; -- 电话号码数≥2个
内连接的另一种写法、外连接的写法都不多介绍了,就写这么多吧~