distinct:去重,去掉表中重复的字段 例:select distinct name from student;
order by … asc:按从小到大排序分组
order by … desc:按从大到小分组
order by:分组排序,默认按照升序对记录进行排序
asc,desc:排序
group by:用于结合合计函数,根据一个或多个列对结果集进行分组
Having:where关键字无法与合计函数一起使用,所以having常常合group by一起使用
union操作符用于合并两个或多个select语句的结果集
count():返回数值匹配指定条件的函数
min():返回一列中最小的值,null值不包含在计算中
max():返回一列中最大的值,null值不包含在计算中
avg():avg函数返回数值列的平均值。Null值不包含在计算中
sum():返回数值列的总数
between and :寻找在…之间的值
not between and:寻找不在…之间的值
(not) Like 模糊查询, like’%11’:查询含有11的值
not like’%11’:查询不含11的值
in(val1,val2):在where语句中查询列中包含的值
not in(val1,val2):在where语句中查询列中不包含的值
is null:查询列值为空的行
is(not) null:查询某列值不为空的行
all():满足子查询中所有值的记录
any()/some():满足集合中任意一值
in():字段内容是否是结果集合或者子查询中的内容
exists():当子查询结果不为空集(存在)时,返回逻辑真,否则返回逻辑假
=、<、>、<=、>=、
查询当前的年月日:select year(curdate()),month(curdate()),day(curdate())
1.join...on...实现连接查询
select s.sno,sname,cname,grade from s join sc on sc.sno=s.sno join c on sc.cno=c.cno;
2.嵌套查询 in/not in
select sno,cno,grade from sc where cno in(select cno from c where cname='数据库' or cname='电子技术');
3.嵌套查询all
select sno,grade from sc where cno='D001' and grade>all(select grade from sc where cno='D002');
4.嵌套查询 any/some
select sno,grade from sc where cno='D001' and grade>any(select grade from sc where cno='D002');
5.嵌套查询 exists
select sno,sname from s where exists(select * from sc where sc.sno=s,sno);
6.between...and...
select sno,degree from sc where degree between 60 and 70;
7.查询前10条记录
select * from student limit 10;
8.查询11条后的5条记录
select * from student limit 10,5;
9.模糊查询 %
select * from student where saddree not like '%山东省%';
10.模糊查询 _
select sname,sno, from student where sname like '_阳%';(查询第二个字为阳的学生)
11.去重
select distinct departmentID from employee;
1、查询每个学生的学号、姓名、出生日期信息
select Sno,Sname,Sbirth from s;
2、根据学号查询你的姓名和出生日期
select Sname,Sbirth from s where Sno='22207';
3、将学生按出生日期由大到小排序
select Sno,Sname from s order by Sbirth desc;
4、查询所有姓’张’的学生的学号和姓名
select Sno,Sname from s where Sname like '张%';
5、查找分数在‘85~96’范围内的学生的学号和分数
select Sno,Grade from sc where Grade between 65 and 96;
6、查询课程号为’002’的学生的平均分和总成绩
select avg(Grade),sum(Grade) from sc where Cno='002';
7、查询学习各门课程的人数
select Cno,count(*) from sc group by Cno;
8、查询课程号为’002’的成绩排前3的学生的学号和成绩。(先排序,再用limit实现)
select Sno,Grade from sc group by Cno having Cno='002' limit 0,3;
9、使用GROUP BY查询子句,列出平均分大于等于90的学生的学号
select Sno from sc group by Sno having avg(Grade)>=90;
(1)查询分数在80~90范围内的学生的学号、姓名、课程号和分数。[用WHERE连接查询]
select s.Sno,Sname,Cno,Grade from s,sc where s.Sno = sc.Sno;
(2)查询学习“数据库系统”课程的学生的学号、姓名、分数。 [用 JOIN ON连接查询]
select s.Sno,Sname,Grade,Cname from s join sc on s.Sno=sc.Sno join c on c.Cno=sc.Cno where Cname='数据库系统';
(3)查询所有计算机系学生的选课情况,要求列出学号、姓名、课程名称、分数
select s.Sno,Sname,Cname,Grade from sc join s on sc.Sno=s.Sno join c on sc.Cno=c.Cno where Sdept='计算机';
(4)查询所有学生的总成绩,要求列出学号、总成绩,没有选修课程的学生的总成绩为空。[使用左外连接]
select s.Sno,sum(Grade) as 总成绩 from s left join sc on sc.Sno=s.Sno group by s.Sno;
(5)查询所有课程的选修情况,要求列出课程编号、选修人数,课程表中没有的课程列值为空。[使用右外连接。]
select c.Cno,count(sc.cno) as 选修人数 from c right join sc on c.Cno=sc.Cno group by c.Cno;
(1)使用IN子查询,查询选修 001 课程的学生的姓名和所在系
select Sname,Sdept from s,sc where s.Sno=sc.Sno and Cno in ('001');
(2)查询软件工程系成绩75分以上的学生的学号和姓名
select s.Sno,Sname from s,sc where s.Sno=sc.Sno and Sdept='软件系' and Grade>75;
(3)查询001 课程的考试成绩高于该课程平均成绩的学生的学号和成绩
select Sno,Grade from sc where Grade>(select avg(Grade) from sc) and Cno='001';
(4)找出学号为’202201’的学生的分数比学号为’202203’的学生的最高成绩还要高的课程编号和分数
select Cno,Grade from sc where Sno='202201' and Grade>all(select Grade from sc where Sno='202203');
(5)在学生表中查找与“王毅”同一系的所有学生的学号、姓名、出生日期、系别
select Sno,Sname from s where Sdept = (select Sdept from s where Sname='王毅');
(6)使用SQL语句嵌套查询方式查询“21Web应用软件开发3班”和“21Web应用软件开发4班”的学生信息(用IN子句)
select * from student where class_no in (select class_no from classes where class_name='21Web应用软件开发3班' and class_name='21Web应用软件开发4班')
问题:在连接查询中,述说内连接,外连接,交叉连接特点。
1、内连接:只有两个元素表相进行匹配的才能在结果集中显示。使用INNER JOIN关键词进行连接。
语法:SELECT * FROM type type INNER JOIN brand brand ON type.id = brand.id
2、 左外连接: 左边为主表,主表的数据全部显示,匹配表的不匹配的不会显示。使用LEFT JOIN关键词进行连接
语法:SELECT * FROM type type LEFT JOIN brand brand ON type.id = brand.id
3、右外连接:右边为主表,主表的数据全部显示,匹配表的不匹配的不会显示。 使用 RIGHT JOIN关键词进行连接
语法:SELECT * FROM brand brand RIGHT JOIN type type ON type.id = brand.id
4、全外连接:连接的表中不匹配的数据全部会显示出来。 mysql中似乎不支持FULL JOIN,故mysql使用UNION关键词进行连接
语法:SELECT * FROM type type FULL JOIN brand brand ON type.id = brand.id
语法:SELECT * FROM type type LEFT JOIN brand brand ON type.id = brand.id
UNION
SELECT * FROM type type RIGHT JOIN brand brand ON type.id = brand.id
5、交叉连接: 显示的结果是链接表数的乘积数。使用CROSS JOIN关键词进行连接
语法:SELECT * FROM type CROSS JOIN brand