简单查询(单表)
查询表的所有信息
Select * from t_student;
Select * from t_course;
Select * from t_score;
从学生表中检索出2班性别为女性的学生的姓名和电话
Select Sname,Stel from t_student Where Sclass = 2 and Ssex =‘f’;
几种特殊用法:
选择无重复的行——在SELECT子句,使用DISTINCT关键字
SELECT DISTINCT Sclass FROM t_student;
给列指定别名——列别名:为列表达式提供不同的名称
Select CID AS 课程号 , Cname AS 课程名, Ctype AS 必修/选修 Chours AS 课时 from t_course;
对查询结果进行排序——order by 排序字段 排序方式
SELECT * FROM t_score where sid = ‘10002’ order by score desc;
模糊查询——字段 like 匹配表达式、
- % :0个或多个字符,每个字符可以任意
- _ :有且只有一个字符,这个字符可以任意
select * from t_student where sname like '张%';
利用现有的表创建表
语法: CREATE TABLE <new_table_name> AS SELECT column_names FROM <old_table_name>;
CREATE TABLE t_stubak AS SELECT * FROM t_student;
CREATE TABLE t_stuclass1 AS SELECT * FROM t_student where Sclass = 1;
CREATE TABLE t_stutemp AS SELECT * FROM t_student WHERE 1 = 2;
连(联?)接查询
联接查询(多表)
- 内联接
- 外联接
- 交叉联接
- 自连接
内联接查询(等值联接)
查询学生总体学习情况:学生姓名,课程名,成绩
SELECT Sname, Cname, Score FROM t_student join t_score On t_student.SID = t_score.SID Join t_course On t_course.CID = t_score.CID;
内联接还可以使用以下方式
SELECT Sname, Cname, Score FROM t_student, t_course, t_score WHERE t_student.SID = t_score.SID and t_course.CID = t_score.CID;
内联接查询注意事项
若查询列出现共有字段则必须指定该字段取自哪个表。格式是:表名.列名。
SELECT t_student.SID, Sname, t_course.CID,Cname, Score FROM t_student join t_score On t_student.SID = t_score.SID Join t_course On t_course.CID = t_score.CID;
查询时可以给表指定别名
SELECT stu.SID,Sname, cus.CID,Cname, Score FROM t_student stu ,t_course cus,t_score sco WHERE stu.SID=sco.SID and cus.CID= sco.CID;
外联接查询
在内联接操作中,只有满足条件的记录才能在结果集中出现。例如在内联接查询中查询教师和课程的对应情况:
Select * from t_teacher join t_teachcourse on t_teacher.tid = t_teachcourse.tid;
如果要查看所有教师的工作分配情况,即没有课程的教师 也出现在查询结果中,此时就需要用到外联接:
- 左外联接:左外联接就是将左表作为主表,结果集中除了满足联接条件的记录外,还有主表中不满足条件的记录
select * from t_teacher left join t_teachcourse on t_teacher.tid = t_teachcourse.tid;
- 右外联接:右外联接就是将右表作为主表,结果集中除了满 足联接条件的记录外,还有主表中不满足条件的记录(和左 外联接相对)
Select * from t_teachcourse right join t_teacher On t_teachcourse.tid = t_teacher.tid;
- 全联接:全联接就是结果集中除了满足联接条件的记录外, 还有左、右表中不满足条件的记录
Select * from t_teacher full join _teachcourse on t_teacher.tid = t_teachcourse.tid;
交叉联接(cross join)
语法:
select 列名列表 from T1 cross join T2
说明:
一个交叉联接(CROSS JOIN)接收两个分别有 N行和M行的表T1和T2,然后返回一个包含交叉乘积 N×M 条记录的联接表;
我们想知道学生和课程有多少可能的组合:
select * from t_student cross join t_course;
也可以不使用join:
select * from t_student , t_course;
自联接
当我们需要的信息是来自一个表中的,并且需要将这个表跟它自己进行连接时用。
例如:要查询scott.emp 表中的员工编号、姓名、和 上级领导名称:
select p1.empno,p1.ename,p1.mgr,p2.ename from emp p1 left join emp p2 on p1.mgr=p2.empno;
注意:连接时要给表起别名。
联接查询小结
所有类型的JOIN都可以链接在一起或者嵌套在一起,这时T1和T2都可以是联接生成的表。我们可以使用圆括弧控制JOIN的顺序,如果我们不主动控制,那么联接顺序是从左到右。
查询步骤 :
- 根据列名确定需要查询的表
- 找出各表的共有字段作为联接条件
- 列名列表中若有共有字段须指出该字段取自哪表:表名.字段名
分组聚合
SQL中提供的聚合函数:
- Min :最小值
- Max :最大值
- Sum :求和
- Avg :求平均值
- Count:计数
查询课程表中最多(少)课时数:
select max(chours) as max_chours from t_course;
查询当前的学生数(教师数):
Select count(*) as stutotal_amount from t_student;
上面聚合函数是对于所有记录进行聚合的,有时候我们需要 先对记录分组再进行聚合,比如查询成绩表中每位同学的最 高分,最低分,总分,平均分等 。
分组聚合——GROUP BY
对记录的分组是通过关键字GROUP BY实现的。
select sid, max(score) as maxscore,
min(score) as minscore,
sum(score) as totalscore,
avg(score) as avgscore
from t_score group by sid;
分组聚合——Having子句
HAVING子句主要用于聚集查询中,在GROUP之后过滤掉那些不符合条件的组。
统计平均成绩超过75分的学生的学号和平均成绩。
select sid,avg(score) as avgscore from t_score select sid,avg(score) as avgscore from t_score group by sid having avg(score)>=75;
思考:与where 子句的区别?
子查询
问题:查询比张老师年龄大的教师信息
- 分析查询字段:教师表所有信息
Select * from t_teacher;
- 分析查询条件:年龄大于大山的年龄
Where tage > (张老师的年龄)
- 解决问题:查询出张老师的年龄
Select tage from t_teacher Where tname = ‘张老师’;
- 结论:张老师的年龄查询作为中间结果提供给上一层查询 而不输出,该类查询称为子查询
带有比较运算符的子查询:子查询只能为外层查询提供一 个单一值作为外层查询的比较对象
SELECT 列名 FROM 表名 WHERE 表达式 比较运算符(子查询)
查询参加过课程编号为1的考试的学员:
select * from t_student where sid = ( select * from t_score where cid=1);
查询所有已经安排教师上课的课程信息:
select * from t_course where cid in (select cid from t_teachcourse);
exists子查询:存在查询,子查询不反回任何结果,只产生逻辑真TRUE或逻辑假FALSE
SELECT 列名别表 FROM 表名 WHERE [NOT] EXISTS(子查询)
查询所有已经安排教师上课的课程信息:
select * from t_course where exists (select * from t_teachcourse where t_teachcourse.cid = t_course.cid );
在FROM里面的子查询:
当子查询返回一个结果集时,那么它就相当于一个普通的表,因此,在FROM子句我们同样可以使用子查询。
在成绩表中查询出所有学生中平均分最高的是多少?
select max(avgscore) from (select avg(score) as avgscore from t_score (select avg(score) as avgscore from t_score group by sid);
分页查询:rownum伪列
select * from (select rownum as num,sid,sname,ssex,sclass from t_student) where num>=11 and num<=20;
本章总结
- 掌握并熟练应用简单查询(单表)
- 掌握并熟练应用联接查询(多表)
交叉联接
内联接
外联接
- 掌握并熟练应用分组聚合语法
- 掌握并熟练应用分组聚合语法
- 理解并熟练应用子查询语法
单值
多值
多行多列
2018.8.27