欢迎光临散文网 会员登陆 & 注册

MySQL个人总结,学习笔记和题目:子查询,让列名内容不重复,多表查询【诗书画唱】

2020-08-15 20:56 作者:诗书画唱  | 我要投稿

(一)




登录Mysql

mysql -uroot -proot

查看数据库

show databases;



数据库:

按照数据结构来组织、存储管理数据的仓库

为什么要使用数据库?

1.查找数据方便

2.节省空间





卸载mysql没有卸载完成

1.控制面板卸载mysql服务

2.文件保存目录删掉

3.隐藏mysql目录也要删



mysql的数据类型:

int:整形 

varchar():字符串

boolean:是否

text:大文本

timestamp:时间戳

bolb:二进制




mysql约束:  

唯一:unique  

自增约束:auto_increments  

主外键:foreign key 

外键也称为参照完整性,外键表的信息参照着主键表的信息进行设置,主键表没有的信息外键表示不能使用的非空约束:notnull  

主键约束:primary key

默认值约束:default




on delete cascade:在设置外键的时候设置级联删除

——————————————————————————————————

mysql增删改查语法:

————————

增:

增加数据:insert into 表名(列名1,列名2) values(值1,值2)


————————

删:

删除语法:delete from 表名 条件表达式


删除表:drop table 表名


清空表:truncate table sss

——————————————————————————————

改:

修改语法:update 表名 set 列名1=值1 where 条件表达式


——————————

查:



基本查询:select * from 表名


查询指定的内容:select 列名 from 表名



列名起别名:select 列名 as 名称(即自己取的列名的别名) from 表名


或省略as简写为:


   select 列名   名称(即自己取的列名的别名) from 表名






去除重复(列名下的内容的查询):select distinct name,typename from sss

简单多表查询:select * from 表1,表2 where 表1.id=表2.id


__________________________________________

子查询分为3中子句: where后当条件

将查询结果当做比较条件



select * from  表名 where 列名>(select 列名 from 表名)


  from后当数据源

  exists后当条件



where子句:后跟一个表达式,表达式返回一个true或者false的数据

表达式可以是

>,<,=,!=,>=,<=

between...and....

in(内容1,内容2)

like:%(匹配0到任意个字符数据)    _(代表一个字符)

&&,||,and,or,is not null,is null 

order by:

排序....默认是升序(ASC) 倒序(DESC)


select top 3 from sp



limit后可以跟1个或者两个数字

跟1个的时候是从0到第几条数据

跟两个的时候就是从第一个参数开始的位置查询第二个参数的个数


——————————

题目:

16.查询商品编号为为5的商品信息
17.查询商品价格在100-500之间的商品信息
18.查询用户名包含a开头的用户信息
19.查询超出商品保质期的商品
20.查询商品编号为2,5,7的商品信息
21.根据商品的价格进行排序,要求倒序
22.查询商品表前3条数据
23.查询商品表销售价格大于进货价200的商品
24.查询商品表所有商品的总价格
25.查询商品名称2个字的商品,按照价格倒序排序,取前三条
26.查询每个人购买的商品总价格
27.查询编号为3的商品一共卖了多少件
28.查询销售量最高的是哪件商品
29.查询每件商品的平均销售数量

30.查询销售数量比平均销售数量高的商品有哪些


答案:

16.查询商品编号为为5的商品信息
select * from sp where spid=5
17.查询商品价格在100-500之间的商品信息
select * from sp where sp_chushoujia between 100 and 500
select * from sp where sp_chushoujia>100 and sp_chushoujia<500
18.查询用户名包含a开头的用户信息
select * from yonghu where yhuname like 'a%'
19.查询超出商品保质期的商品
select * from sp where spbaozhiqi<current_timestamp
20.查询商品编号为2,5,7的商品信息
select * from sp where spid in(2,5,7)
21.根据商品的价格进行排序,要求倒序
select * from sp order by sp.sp_chushoujia
22.查询商品表前3条数据
select * from sp limit 0,3
23.查询商品表销售价格大于进货价200的商品
select * from sp where sp_chushoujia-spjinhuojia>20
24.查询商品表所有商品的总价格
select sum(sp_chushoujia) from sp
25.查询商品名称2个字的商品,按照价格倒序排序,取前三条
select * from sp where spname like '__' order by sp_chushoujia desc limit 3


————

【关键词出现的先后顺序:


where    group by    having   order by   limit

——————



where子句
order by子句
limit子句
group by子句
having子句】


————————



26.查询每个人购买的商品总价格

————

【5个聚合函数:
sum()  avg()   max()   min()   count()】


——————
select sum(sp_chushoujia) from sp
select c.yhid '每个人',c.yhname,sum(a.spbuynum)*b.sp_chushoujia as '每个人买的多少钱'
 from dingdan a inner join sp b on a.spid=b.spid inner join yonghu c on a.yhid =c.yhid
group by c.yhid 
27.查询编号为3的商品一共卖了多少件
select sum(dingdan.spbuynum) from dingdan where spid=3
28.查询销售量最高的是哪件商品
select  spid,sum(spbuynum) from dingdan group by spid  limit 1
29.查询每件商品的平均销售数量
select  spid,avg(spbuynum) from dingdan  group by spid
select * from dingdan
30.查询销售数量比平均销售数量高的商品有哪些
 select * from dingdan where spbuynum>(select avg(spbuynum) from dingdan)


————————————————————————————

————————————————————————————————————————


(二)

————


下面是常用的语句:

drop table dingdan

drop table sp


drop table yonghu

select * from  sp

select * from  yonghu

select * from  dingdan

————



1.使用sql语句创建以上三张表

create table sp(

spid int primary key auto_increment,

spname varchar(100) not null unique,

spjinhuojia float default 0,

sp_chushoujia float default 0,

spshengchanriqi timestamp default current_timestamp,

spbaozhiqi datetime,

spshuliang int default 0,

spbeizhu varchar(1000)

);



create table yonghu(

yhid int primary key auto_increment,

yhuname varchar(100) not null unique,

yhpwd varchar(100) not null ,

yhname varchar(100) not null unique

);

create table dingdan(

did int primary key auto_increment,

spid int,

yhid int,

spbuynum int,

foreign key(spid) references sp(spid) on delete cascade,

foreign key(yhid) references yonghu(yhid)on delete cascade

)

2.使用insert语句给以上表分别插入10条数据


insert into sp (spname,spjinhuojia,sp_chushoujia,spshengchanriqi,spbaozhiqi,spshuliang,spbeizhu) values('雪碧',3,4,now(),'2020-10-11',10,'hhh'),

('雪花',2,3,now(),'2020-9-8',10,'hhhssss'),('热狗',2,3,now(),'2020-6-11',15,'hhh防守打法'),('乌龙茶',4,5,now(),'2019-10-11',22,'hhh'),

('菠萝啤',1,2,now(),'2020-2-11',110,'hh防守打法h'),('白沙',8,10,now(),'2022-10-11',100,'hhh防守打法'),('牛肉',35,42,now(),'2020-8-21',19,'hh防守打法h'),

('红茶',3,4,now(),'2020-12-11',11,'h大声道hh')



insert into yonghu(yhuname,yhpwd,yhname)values('admin','admin','GM'),('qwe','qwe','gggg'),('ewq','ewq','sssss'),('asd','asd','fsdfsdf'),

('赵云','zhaoyun','常山赵子龙'),('刘备','liubei','大哥'),('关羽','guanyu','二弟'),('张飞','zhangfei','三弟')


insert into dingdan(spid,yhid,spbuynum) values(3,1,10),(3,2,4),(3,3,7),(1,2,6),(3,2,8),(5,6,10),

(7,1,9),(6,2,6),(8,4,3),(2,2,10),(7,2,5),(3,4,10),(8,1,10),(6,6,6),(7,7,7)

3.修改商品表商品编号为3的商品名称为可口可乐

update sp set spname='可口可乐' where spid=3

4.修改用户表用户编号为5的用户姓名为“钟无艳”

update yonghu set yhname='钟无艳' where yhid=5

5.修改购物车表商品订单编号为3的数量为10

update dingdan set spbuynum=10 where did=3

6.添加钟无艳购买可口可的记录,购买数量为5

insert into dingdan (yhid,spid,spbuynum) values((select yhid from yonghu where yhname='钟无艳'),

(select spid from sp where spname='可口可乐'),5)

7.修改钟无艳购买可口可乐的数量为10

update dingdan set spbuynum=10 where spid=(select spid from sp where spname='可口可乐')

and yhid=(select yhid from yonghu where yhname='钟无艳')

8.修改购买数量大于5的商品为可口可乐

update dingdan set spid=(select spid from sp where spname='可口可乐')

where spbuynum>10

9.修改用户编号为3的用户购买商品为可口可乐的数量为5

update dingdan set spbuynum=5 where yhid=3 and 

spid=(select spid from sp where spname='可口可乐')


————————————————————————————


重要部分(和我之前做的答案不一样部分):

10.修改商品剩余数量为0的购买数量为0

update dingdan inner join sp on dingdan.spid=sp.spid

set dingdan.spbuynum=0 where sp.spshuliang=0

11.删除商品可口可乐,要求级联删除

delete from sp where spname='可口可乐'

12.删除商品剩余数量等于为0的商品购买记录

先查商品表,看看商品的剩余数量,如果商品的商品数量为0,就看谁买了这件商品

如果有人买了这件商品就将这件商品的购买记录删除掉

delete dingdan

FROM dingdan inner join sp on dingdan.spid=sp.spid

where sp.spshuliang=0

13.删除用户编号为3的用户信息,购买记录

delete from yonghu where yhid=3

14.联合查询3张表

select * from sp inner join dingdan on sp.spid=dingdan.spid inner join

 yonghu on dingdan.yhid=yonghu.yhid

15.查询3张表显示购买记录编号,购买的名称,商品价格,购买的用户姓名,

购买数量和单件商品总价格

select did as '订单编号',sp.spname as '商品名称',

sp.sp_chushoujia as '商品价格', yonghu.yhname as '用户名',dingdan.spbuynum as '购买数量',

(sp.sp_chushoujia*dingdan.spbuynum) as '单件商品总价格'

from sp inner join 

dingdan on sp.spid=dingdan.spid inner join

 yonghu on dingdan.yhid=yonghu.yhid






————


下面是常用的语句:

drop table cj

drop table stu

drop table zy



select * from  cj

select * from  stu

select * from  zy

————


create table stu(

xuehao int primary key auto_increment,

xingming varchar(100) not null unique,

sex varchar(10) default '男',

chushengriqi timestamp default current_timestamp,

beizhu text

);

create table zy(

zhuanyeid int primary key auto_increment,

zhuanyename varchar(100) not null

);

create table cj(

chengjiid int primary key auto_increment,

xuehao int,

zhuanyeid int,

chengji float,

foreign key (xuehao) references stu(xuehao) on delete cascade,

foreign key(zhuanyeid) references zy(zhuanyeid) on delete cascade

);

insert into stu (chushengriqi,xingming,beizhu,sex) values('1990-08-14','张三17','呵呵','女'),('1990-08-14','张三16','呵呵','女')

insert into stu (chushengriqi,xingming,beizhu) values('1990-08-14','张三15','呵呵'),('2000-08-14','张三14','呵呵')

insert into stu (xingming,beizhu) values('张三10','呵呵'),('张三11','呵呵'),('张三12','呵呵'),('张三13','呵呵'),('张三','呵呵'),

('李四','呵呵1'),('王五','呵呵2'),('马六','呵呵3'),('刘备','呵呵4'),

('关羽','呵呵5'),('张飞','呵呵6'),('黄忠','呵呵7'),('马超','呵呵')

insert into zy(zhuanyename) values('计算机'),('Java'),('C#'),

('mysql'),('sqlserver'),('javascript')



insert into cj (xuehao,zhuanyeid,chengji) values(16,1,40),(17,2,60),(1,1,88),(1,1,66),(1,2,99),(11,2,33),(3,2,33),(1,2,33),

(2,3,44),(4,3,55),(2,4,66),(6,2,77),(7,3,88),(6,4,99)


11.查询编号在3-7之间的所有学生信息


select * from stu where xuehao>=3  and xuehao<7

12.查询名称包含张的学生的成绩


select * from stu where xingming like '%张%'

13.查询性别为男的学生的成绩

--【不好用子查询的,就会用多表查询】

select chengji  as'男的学生的成绩'   from cj  inner  join  stu  on  cj.xuehao=stu.xuehao   where sex='男'

14.查询编号在2,5,6的学生的信息

select *  from stu   where xuehao in (2,5,6)

15.查询名称包含王的学生的专业


select zhuanyename   as'包含王的学生的专业'   from zy  inner  join  cj  on  zy.zhuanyeid=cj.zhuanyeid

 inner  join  stu  on  stu.xuehao=cj.xuehao  where stu.xingming like '%王%'

16.查询学生id为11的所有课程的成绩,显示学生姓名,专业名称,成绩,使用别名

select xingming  as '学生姓名' ,zhuanyename   as'专业名称'  ,chengji as '成绩'  from zy  inner  join  cj  on  zy.zhuanyeid=cj.zhuanyeid

 inner  join  stu  on  stu.xuehao=cj.xuehao  where stu.xuehao=11

17.查询以王开头的学生并且名称长度为2的学生的信息


select * from stu where xingming like '%王_%'


18.查询年龄小于20岁的学生信息


select * from stu  where (year(now())-year(chushengriqi))<20

19.查询每个学生的年龄,按照倒序排序

select   xingming as '学生的姓名',(year(now())-year(chushengriqi)) as '年龄'  from stu order by (year(now())-year(chushengriqi)) desc

  

20.查询每个学生的总分

select xingming as '每个学生的姓名', sum(chengji) as '每个学生的总分' from stu  inner join  cj on stu.xuehao=cj.xuehao group by  xingming


21.查询张三的所有科目的总成绩


select  sum(chengji) as '张三的所有科目的总成绩' from stu  inner join  cj on stu.xuehao=cj.xuehao   

inner join  zy on zy.zhuanyeid=cj.zhuanyeid where  xingming='张三'

22.查询张三的所有科目的平均成绩



select    zhuanyename as'专业科目名',  avg(chengji) as '张三这门科目的平均成绩' from stu  inner join  cj on stu.xuehao=cj.xuehao   

inner join  zy on zy.zhuanyeid=cj.zhuanyeid    where  xingming='张三'  group by  zhuanyename

23.查询所有学生的最高分,最低分


select    zhuanyename as'专业科目名',  avg(chengji) as '张三这门科目的平均成绩' from stu  inner join  cj on stu.xuehao=cj.xuehao   

inner join  zy on zy.zhuanyeid=cj.zhuanyeid    where  xingming='张三'  group by  zhuanyename

24.查询张三有多少个科目

--去除重复:select distinct name,typename from sss【distinct 放在不想重复的列名处】

select  count(distinct zhuanyeid) as'张三有的科目数'  from  cj where xuehao =(select  xuehao from stu where xingming='张三'  )



--select  zhuanyename  as'张三考过的科目', count(zhuanyename) as'张三考过的次数'  from stu  inner join  cj on stu.xuehao=cj.xuehao   

--inner join  zy on zy.zhuanyeid=cj.zhuanyeid    where  xingming='张三'  group by  zhuanyename  

25.查询每个人的最高分,最低分


select  xingming as '姓名',  max(chengji) as'最高分',  min(chengji) as'最低分'  from stu  inner join  cj on stu.xuehao=cj.xuehao   

inner join  zy on zy.zhuanyeid=cj.zhuanyeid    group by  xingming

26.查询每个人的总成绩,平均成绩

【个人总结:就算别的表中没对应的内容,left  join也会显示stu 这个left  join前(左)表中的所有列名中有的内容(right join也类似,

就算别的表中没对应的内容,right join也会显示stu 这个right join后(右)表中的所有列名中有的内容),

而inner join只会显示都有对应内容的列名中的内容等】

select  xingming as '姓名',  sum(chengji) as'总成绩',  avg(chengji) as'平均成绩'  from stu  left  join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid    group by  xingming

27.查询每个人有多少个科目


select  xingming as '姓名',  count(distinct zhuanyename) as'有的科目数'  from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid    group by  xingming


28.查询平均成绩大于60的人的平均成绩


【having avg(chengji )>60是group by  xingming后面加的限制条件】


select  xingming as '姓名',  sum(chengji) as'总成绩',  avg(chengji ) as'平均成绩'  ,  

count(distinct zhuanyename) as'有的科目数' from stu  inner join  cj on stu.xuehao=cj.xuehao   

inner join  zy on zy.zhuanyeid=cj.zhuanyeid     group by  xingming  having avg(chengji )>60

--select  xingming as '姓名',  avg(chengji) as'平均成绩'  from stu  inner join  cj on stu.xuehao=cj.xuehao   

--inner join  zy on zy.zhuanyeid=cj.zhuanyeid  where   avg(chengji)>60   group by  xingming  

29.查询低于班级平均成绩的学生姓名和成绩

select  xingming as '姓名',  sum(chengji) as'总成绩',  avg(chengji ) as'平均成绩'  , 

count(distinct zhuanyename) as'有的科目数'   ,   (select   sum(chengji)/count(chengjiid)

from stu  left join  cj on stu.xuehao=cj.xuehao     

left join  zy on zy.zhuanyeid=cj.zhuanyeid)  as '班级平均成绩' from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid     group by  xingming  having avg(chengji )<(select   sum(chengji)/count(chengjiid)

from stu  left join  cj on stu.xuehao=cj.xuehao     

left join  zy on zy.zhuanyeid=cj.zhuanyeid)

个人的总结:

select   sum(chengji)/count(chengjiid)

from stu  left join  cj on stu.xuehao=cj.xuehao     

left join  zy on zy.zhuanyeid=cj.zhuanyeid  求的是总成绩和除以总人数=班级总平均成绩=68.9333333333333,

如果显示8.9333333333333,就是显示不完整,鼠标左键选中后,向左移动,就可以看到"8.9333333333333"前面的"6",

或者出现箭头,把表格拉长。

--select  

--sum(chengji)/(count(distinct  zhuanyename)*count(distinct xingming))  from stu  left  join  cj on stu.xuehao=cj.xuehao   

--left join  zy on zy.zhuanyeid=cj.zhuanyeid


30.查询男同学的平均成绩比女同学的平均成绩多多少


select  ( (select  avg(chengji) from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid  where sex='男')-(select  avg(chengji) from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid  where sex='女')) as'男同学的平均成绩比女同学的平均成绩多的分数' 

select   distinct( (select  avg(chengji) from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid  where sex='男')-(select  avg(chengji) from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid  where sex='女')) as'男同学的平均成绩比女同学的平均成绩多的分数'  from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid  】 

31.查询至少拥有两门课程及以上的学生


select  xingming as '姓名',  count(distinct zhuanyename) as'有的科目数'  from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid    group by  xingming  having count(distinct zhuanyename)>=2


32.查询拥有两门课程以上的学生的平均分

select  xingming as '姓名',  count(distinct zhuanyename) as'有的科目数'  ,  avg(chengji) as'平均分'   from stu  left join  cj on stu.xuehao=cj.xuehao   

left join  zy on zy.zhuanyeid=cj.zhuanyeid    group by  xingming  having count(distinct zhuanyename)>=2




MySQL个人总结,学习笔记和题目:子查询,让列名内容不重复,多表查询【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律