数据库Oracle Review SectionⅣ 基本SQL查询

简单查询(单表)

查询表的所有信息

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的顺序,如果我们不主动控制,那么联接顺序是从左到右。

查询步骤

  1. 根据列名确定需要查询的表
  2. 找出各表的共有字段作为联接条件
  3. 列名列表中若有共有字段须指出该字段取自哪表:表名.字段名

分组聚合

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

猜你喜欢

转载自blog.csdn.net/Altr1aPendrag0n/article/details/82084436