from s left join p on s.pno=p.pno left join m on p.Mno=m.Mno
where m.city='上海市'
group by p.Pno,p.pname,p.city,p.color
b)、先删除Sale表的外键PNO,再删除gds表。
c)联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
数据库,无外乎增删改查:增:
insert into A表 values (value1,value2,value3......)向A表中新增数据
删:
delete from A表 ( where id=1) 删除A表(删除A表id=1的数据)如果删除某个测试数据,记得加where条件,否则整张表的数据都被删除,防止误 *** 作!不过,数据可以回滚找回。
truncate A表:清除表数据,数据无法回滚。
drop A表:整表结构删除,即,这张表不存在了。
改:
update A表 set name='test' where id=1 修改id为1的name值为test
查:
1:左关联和右关联的区别?
答:左关联( left join )左表为主,左表数据全部显示,右表显示关联数据,无关联显示null,右关联( right join )相反。
2:模糊查询?
select * from A表 where name like ' %a% ' (name包含a字母)
查询结果: a , a bc,b a c,bc a
select * from A表 where name like ' a% ' (name值以a字母开头)
查询结果: a , a bc
select * from A表 where name like ' %a ' (name值以a字母结尾)
查询结果: a ,bc a
3:统计:count和sum
count统计表的 记录数 ,sum统计某列数值 总和 。
select count(*) from A表
select count(1) from A表
select count(列名) from A表
区别:
count( * ): 所有记录,包括null值
count( 1 ):所有记录,包括null值
count( 列名 ):列名有值得记录, 不包括null值
执行效率:
以前是count(1)比count(*)快,但现在count(*)底层算法优化,查询更快,所以推荐count(*)
统计有效数据的记录,count(列名)
select sum(列名) from A表 计算列名数值总和。
举例:
查询A表中,姓王的用户量
select count(*) from A where name like '王%'
Plus版
1:去重distinct,查询不重复记录的数据
必须放开头
select distinct 列名 from 表名(查询所有列名数据,去掉重复数据)
举例:
表A,查询考核等级grade,有哪些值
select distinct grade from A
2:分组group by,根据某个字段分组
select 列名 from 表名 group by 列名,一般会配合聚合函数一起使用
举例:
表A中,查询考核等级grade字段,不同值各多少人
select grade,count(*) from A group by grade
3:limit,查询结果返回的数量,多用于分页查询
select * from 表名 limit i,n i代表查询结果的索引值,默认从0开始,n返回查询的结果数。
举例:
订单表A,查询第21条到30条数据
select * from A limit 20,10
可能会问为什么不能直接用id查询?因为id不准确,可能存在id不连续的情况。如果某条数据被物理删除了呢?
何为物理删除和逻辑删除?
物理 删除 ,直接将某条数据,从表中删除。
逻辑 删除,仅通过某个字段标记删除,实际表中还存在。(比如:is_delete=1代表已删除,is_delete=0未删除)
4:排序order by 列名 asc(列名值升序排列)和order by 列名 desc(列名值降序排列)
举例:
用户表A,按照用户id升序(select查询默认根据主键升序,所以升序,不加order by也可以)
select * from A order by id asc同select *from A
用户表A,按照新建时间倒序
select * from A order by create_time desc
5:in和between查询某个范围的数值
举例:
in:查询指定数值的数据
between:查询某个范围内的数据
举例:
查询表A中,id=1和id=10的数据
select * from A where id in(1,10)
查询表A中,1月份新增的数据
select * from A where create_time between '2022-01-01' and '2022-01-31 23:59:59'
已知有如下4张表:
学生表:student(学号,学生姓名,出生年月,性别)
课程表:course(课程号,课程名称,教师号)
教师表:teacher(教师号,教师姓名)
准备练习数据
1)创建学生表(student)
2)创建成绩表(score)
3)创建课程表(course)
4)教师表(teacher)
1)学生表添加数据
2)成绩表添加数据
3)课程表添加数据
4)教师表添加数据
简单查询
查询姓“猴”的学生名单
查询姓名中最后一个字是“猴”字的学生名单
查询姓名中带“猴”字的学生名单
查询姓“孟”老师的个数
汇总分析
1.汇总分析
查询课程编号为“0002”的总成绩
查询选了课程的学生人数
2.分组
查询各科成绩的最高分和最低分, 以如下的形式显示:课程号,最高分,最低分
查询每门课程选修的学生数
3.分组结果的条件
查询至少选修两门课程的学生学号
查询同名同姓学生名单并统计同名人数
分析:条件:怎么算姓名相同?按姓名分组后人数大于等于2,因为同名的人数大于等于2,分析出这一点很重要
查询不及格的课程并按课程号从大到小排列
查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
检索课程编号为“0004”且分数小于60的学生学号,结果按按分数降序排列
统计每门课程的学生选修人数(超过2人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
查询两门以上不及格课程的同学的学号及其平均成绩
第2步:再加上限制条件:
1)不及格课程
2)两门以上[不及格课程]
4.查询结构排序,分组的指定条件
查询学生的总成绩并进行排名
查询平均成绩大于60分的学生的学号和平均成绩
复杂查询
查询课程成绩小于60分学生的学号、姓名
【知识点】子查询
1.翻译成大白话
1)查询结果:学生学号,姓名
2)查询条件:所有课程成绩 <60 的学生,需要从成绩表里查找,用到子查询
第1步,写子查询(所有课程成绩 <60 的学生)
第2步,查询结果:学生学号,姓名,条件是前面1步查到的学号
查询没有学全所有课的学生的学号、姓名
查询出只选修了两门课程的全部学生的学号和姓名
查找1990年出生的学生名单
查询本月过生日的学生
工作中会经常遇到这样的业务问题:
如何找到每个类别下用户最喜欢的产品是哪个?
如果找到每个类别下用户点击最多的5个商品是什么?
这类问题其实就是常见的:分组取每组最大值、最小值,每组最大的N条(top N)记录。
分组取每组最大值,按课程号分组取成绩最大值所在行的数据
分组取每组最小值,按课程号分组取成绩最小值所在行的数据
每组最大的N条记录,查询各科成绩前两名的记录
第1步,查出有哪些组
我们可以按课程号分组,查询出有哪些组,对应这个问题里就是有哪些课程号
第2步:先使用order by子句按成绩降序排序(desc),然后使用limt子句返回topN(对应这个问题返回的成绩前两名)
第3步,使用union all 将每组选出的数据合并到一起
多表查询
查询所有学生的学号、姓名、选课数、总成绩
查询平均成绩大于85的所有学生的学号、姓名和平均成绩
查询学生的选课情况:学号,姓名,课程号,课程名称
Student(Sid,Sname,Sage,Ssex)学生表Sid:学号
Sname:学生姓名
Sage:学生年龄
Ssex:学生性别
Course(Cid,Cname,Tid)课程表
Cid:课程编号
Cname:课程名称
Tid:教师编号
SC(Sid,Cid,score)成绩表
Sid:学号
Cid:课程编号
score:成绩
Teacher(Tid,Tname)教师表
Tid:教师编号:
Tname:教师名字
1、插入数据
2、删除课程表所有数据
3、将学生表中的姓名 张三修改为张大山
或者
4、查询姓’李’的老师的个数:
5、查询所有课程成绩小于60的同学的学号、姓名:
6、查询没有学全所有课的同学的学号、姓名
7、查询平均成绩大于60分的同学的学号和平均成绩
8、查询学过“100”并且也学过编号“101”课程的同学的学号、姓名
9、查询“100”课程比“101”课程成绩高的所有学生的学号
10、查询课程编号“100”的成绩比课程编号“101”课程高的所有同学的学号、姓名
11、查询学过“鲁迅”老师所教的所有课的同学的学号、姓名
12、查询所有同学的学号、姓名、选课数、总成绩
13、查询至少有一门课与学号为“1”同学所学相同的同学的学号和姓名
14、把“SC”表中“鲁迅”老师教的课的成绩都更改为此课程的平均成绩,
错误
15、查询和“2”学号的同学学习的课程完全相同的其他同学学号和姓名
16、删除学习“鲁迅”老师课的SC表记录
17、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、002号课的平均成绩
18、查询各科成绩最高和最低的分:以如下的形式显示:课程ID,最高分,最低分
19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 数学(100),语文(101),英语(102)
22、查询不同老师所教不同课程平均分从高到低显示
23、查询如下课程成绩第3名到第6名的学生成绩单:数学(100),语文(101),英语(102)
23、统计下列各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ 小于60]
24、查询学生平均成绩及其名次
25、查询各科成绩前三名的记录(不考虑成绩并列情况)
26、查询每门课程被选修的学生数
27、查询出只选修一门课程的全部学生的学号和姓名
28、查询男生、女生人数
29、查询姓“张”的学生名单
30、查询同名同姓的学生名单,并统计同名人数
31、1981年出生的学生名单(注:student表中sage列的类型是datetime)
32、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
33、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
34、查询课程名称为“英语”,且分数低于60的学生名字和分数
35、查询所有学生的选课情况
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
37、查询不及格的课程,并按课程号从大到小的排列
38、查询课程编号为“101”且课程成绩在80分以上的学生的学号和姓名
39、求选了课程的学生人数:
40、查询选修“鲁迅”老师所授课程的学生中,成绩最高的学生姓名及其成绩
41、检索至少选修两门课程的学生学号
42、查询全部学生都选修的课程的课程号和课程名(1.一个课程被全部的学生选修,2.所有的学生选择的所有课程)
43、查询没学过“鲁迅”老师讲授的任一门课程的学生姓名
44、查询两门以上不及格课程的同学的学号及其平均成绩
45、检索“101”课程分数小于60,按分数降序排列的同学学号
46、删除“2”同学的“101”课程的成绩
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)