表2:商品表1
表3:商品表2
表4:教师
1)查询所有学生的详细信息
SELECT*from学生;2)查询学生的学生号,姓名与专业
select学生号,姓名,专业from学生;3)从商品表1中查询出每一种商品的价值
SELECT商品代号,单价,数量,单价*数量as总价from商品表1;4)查询本商品表1中商品的种类
SELECTdistinct分类名from商品表1;5)从商品表1中查询出分类名为"电视机"的所有商品
select*from商品表1where分类名='电视机';6)从商品表1中查询出单价低于2000元的每一种商品代号,分类名和单价
select商品代号,分类名,单价from`商品表1`where单价<=2000;7)从商品表2中查询出产地为北京、山西、无锡的所有商品
SELECT*from商品表2where产地in('北京','山西','无锡');8)从商品表1中查询出商品代号以字符串"dsj"开头的所有商品(考察like模糊查询及通配符%)
select*from商品表1where商品代号like'DSJ%'MySQL中的通配符;%,_(下划线),
9)从商品表1中查询单价在1000到2000之间的所有商品
select*from商品表1where单价between1000and2000;10)查询所有姓张的学生的详细信息
select*from学生where姓名like'张_';11)从商品表1中查询出单价大于1500,同时数量大于等于10的商品
select*from选课orderby课程号asc,成绩desc;14)从学生表中查询各个专业的人数
select专业,count(*)as人数from学生groupby专业15)从学生表中查询出专业的学生数多于1人的专业名及人数
select专业,count(*)as人数from学生groupby专业havingcount(*)>1select专业,count(*)as人数from学生groupby专业having人数>116)从选课表中查询成绩最高前三位
select*from选课orderby成绩desclimit317)查询各个专业男女人数各是多少
select专业,性别,count(*)as人数from学生groupby专业,性别18)从商品表1中查询出所有商品的最大数量、最小数量、平均数量及数量总和
selectmax(数量)as最大数量,min(数量)as最小数量,avg(数量)as平均数量,sum(数量)as数量总和from商品表119)从商品表1中查询出分类名为“电视机”的商品的种数、最高价、最低价及平均价
select分类名,count(分类名)as种数,max(单价)as最高价,min(单价)as最低价,avg(单价)as平均价from商品表1where分类名='电视机'20)查询出产地为南京或无锡的所有商品的商品代号、分类名、产地和品牌
selecta.商品代号,b.分类名,a.产地,a.品牌from商品表2ainnerjoin商品表1bona.商品代号=b.商品代号wherea.产地in('南京','无锡')或
selecta.商品代号,b.分类名,a.产地,a.品牌from商品表2a,商品表1bwherea.商品代号=b.商品代号anda.产地in('南京','无锡')21)从教学库中查询出选修了课程名为“操作系统”课程的每个学生的姓名
selectb.姓名,c.课程名from选课ainnerjoin学生bona.学生号=b.学生号innerjoin课程cona.课程号=c.课程号wherec.课程名='操作系统'orb.姓名或
select姓名,课程名from选课a,学生b,课程cwherea.学生号=b.学生号anda.课程号=c.课程号andc.课程名='操作系统'22)从教学库中查询出所有学生的选课情况,要求没选修任何课程的学生信息也要反映出来(左,右连接)
select*from学生aleftjoin选课bona.学生号=b.学生号select*from选课arightjoin学生bona.学生号=b.学生号23)从教学库中查询出选修了课程名为“操作系统”的所有学生(带in的子查询)
select*from学生where选修了课程名为“操作系统”的所有学生进一步分析:select*from学生where学生号in(所有选修了操作系统的学生号名单)所有选修了操作系统的学生号名单?selecta.学生号from选课a,课程bwherea.课程号=b.课程号and课程名='操作系统'最终的代码:select*from学生where学生号in(selecta.学生号from选课a,课程bwherea.课程号=b.课程号and课程名='操作系统')24)查询出比所有商品单价的平均值要高的全部商品(比较运算符)
select*from商品表1where单价>(selectavg(单价)from商品表1)25)从教学库中查询出选修至少一门课程的所有学生(带exists(的子查询)
select*from学生whereexists(select*from选课where选课.学生号=学生.学生号)或
select*from学生where学生号in(selectdistinct学生号from选课)26)从教学库中查询出选修了课程名为“C++语言“的所有学生的姓名和成绩(any子查询)
selectb.姓名,c.课程名,a.成绩from选课ainnerjoin学生bona.学生号=b.学生号innerjoin课程cona.课程号=c.课程号wherec.课程名='C++语言'select姓名,成绩from学生join选课on学生.学生号=选课.学生号where课程号=any(select课程号from课程where课程名='C++语言')27)从商品表1中查询出单价比分类名为“洗衣机”的所有商品单价都高的商品
select*from商品表1where单价>all(select单价from商品表1where分类名='洗衣机')select*from商品表1where单价>(selectmax(单价)from商品表1where分类名='洗衣机')28)从商品表1中查询出单价比分类名为“洗衣机”的所有商品的单价其中一种高的商品
select*from商品表1where单价>any(select单价from商品表1where分类名='洗衣机')and分类名<>'洗衣机'29)查询出每种商品的总价值,并按降序排列
select分类名,sum(单价*数量)as总价from商品表1groupby分类名orderby总价desc30)查询至少选修了王明所选修的所有课程的学生
--王明选修的课程selecta.姓名,b.课程号from学生a,选课bwherea.学生号=b.学生号and姓名='王明'--终极答案select*from学生where姓名!='王明'and学生号in(select学生号from选课where课程号in(select课程号from选课,学生where选课.学生号=学生.学生号and姓名='王明')groupby学生号havingcount(*)=(selectcount(*)from选课,学生where选课.学生号=学生.学生号and姓名='王明'))--终极答案2select*from学生where姓名!='王明'and学生号=any(select学生号from选课where课程号in(select课程号from选课,学生where选课.学生号=学生.学生号and姓名='王明')groupby学生号havingcount(*)=(selectcount(*)from选课,学生where选课.学生号=学生.学生号and姓名='王明'))31)查找选择了课程编号为101和102的学生,把其学号显示出来
select*from选课成绩where课程编号in(101,102)select*from选课成绩where课程编号='101'unionselect*from选课成绩where课程编号='102'unionselect*from选课成绩where课程编号='103'如果希望上述结果中显示课程名称,sql语句如下:
selecta.*,b.课程名称from选课成绩a,课程2bwherea.课程编号=b.课程编号anda.课程编号='101'unionselecta.*,b.课程名称from选课成绩a,课程2bwherea.课程编号=b.课程编号anda.课程编号='102'32)把test1和test2表的数据合并在一起
三、其他补充
33)创建如下表并插入测试数据
要求对此表查询,显示如下结果:
显示结果:姓名语文高数英语李勇907080刘晨607796
34)在SQL中使用正则示例
查询以DS开头的产品select*from商品表1where商品代号regexp'^DS'查询以冰箱结尾的select*from商品表1where分类名regexp'冰箱$'查询商品代号中包含B字符的产品select*from商品表1where商品代号regexp'B.'查询商品代号中包含XTselect*from商品表1where商品代号REGEXP'[XT]'查询商品代号中不包含XT的select*from商品表1where商品代号REGEXP'[^XT]'查询test表中id不包含a-h之间任意一个字符的学员select*fromtestwhereidREGEXP'[^a-h]'查询出商品表1中商品代号包含DB,XY,AHselect*from商品表1where商品代号REGEXP'DB|XY|AH'查询商品表中至少有1个X的商品select*from商品表1where商品代号REGEXP'X{1}'查询商品表1中商品代号中,XY最少出现1次,XY最多出现3次select*from商品表1where商品代号REGEXP'XY{1,3}'35)高级插入语句
insertintotest1(id,name,age)selectid,name,agefromtest2whereid=10636)replace语句用replace插入一条记录时,如果不重复,replace就和insert的功能一样,如果有重复记录,replace就使用新记录的值来替换原来的记录值。语法:
replacetablename(列名...)VALUES(列值);或replacetablenameSETcolumn_namel=value1,column_name2=value2,..;示例:
replacetest1(id,name,age)values(104,'陈阳',22)37)将电子专业的所有学生各门课成绩加5分(techdb成绩表)
update选课set成绩=成绩+5where学生号in(select学生号from学生where专业='电子')13、将员工表中工龄大于30年的工资全部上调20%(northwind)
select姓名,部门,year(now())-year(雇佣日期)as工龄from员工whereyear(now())-year(雇佣日期)>30update员工set目前薪资=目前薪资*1.2whereyear(now())-year(雇佣日期)>3014、将比生产制造部员工最高工资还要高的员工工资下调20%以下这种写法是错误的:
以下代码是错误的:select姓名,部门,目前薪资from员工where目前薪资>(selectmax(目前薪资)from员工where部门='生产制造部')正确的写法是:update员工set目前薪资=目前薪资*0.8where目前薪资>(selectt.最高工资from(selectmax(目前薪资)as最高工资from员工where部门='生产制造部')t)14、将比生产制部中工资排名前三的员工工资任意一个高的员工工资下调10%
select姓名,部门,目前薪资from员工where目前薪资>any(select目前薪资from员工where部门='生产制造部'orderby目前薪资desclimit3)and部门<>'生产制造部'正确的代码是:update员工set目前薪资=目前薪资*0.9where目前薪资>any(selectt.目前薪资from(select目前薪资from员工where部门='生产制造部'orderby目前薪资desclimit3)t)and部门<>'生产制造部'