3.4 数据查询

目录

3.4.1 单表查询

1.选择表中的若干列

(1)查询指定列

(2)查询全部列

(3)查询经计算的值

2.选择表中的若干元组

(1)消除取值重复的行 distinct

(2)查询满足条件的元组 

3.ORDER BY子句

4.聚集函数 count sum avg max min

3.4.2 连接查询

1.等值与非等值连接查询 =

2.自身连接

3.外连接

4.多表查询 两个以上的表

3.4.3 嵌套查询

1.带有IN谓词的子查询

2.带有比较运算符的子查询

3.带有ANY(SOME)或ALL谓词的子查询

4.带有EXISTS谓词的子查询

3.4.4 集合查询

3.4.5 基于派生表的查询


3.4.1 单表查询

1.选择表中的若干列

(1)查询指定列

SELECT Sno,Sname
FROM Student;

(2)查询全部列

SELECT *
FROM Student;

(3)查询经计算的值

SELECT Sname,2014-Sage /*查询结果的第2列是一个算数表达式*/
FROM Student;

指定别名来改变查询结果的列标题。

SELECT Sname NAME,'Year of Birth;' BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student; 

2.选择表中的若干元组

(1)消除取值重复的行

SELECT DISTINCT Sno
FROM SC;

如果没有指定DISTINCT关键字,则默认为ALL。

(2)查询满足条件的元组

通过WHERE子句实现

①比较大小

SELECT Sname,Sage
FROM Student
WHERE Sage<20;

②确定范围

BETWEEN...AND...

NOT BETWEEN...AND...

BETWEEN后面是范围的下限(即低值),AND后面是范围的上限(即高值)

SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23

③确定集合

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');

④字符匹配

[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']
  • %(百分号)代表任意长度(长度可为0)的字符串。
  • _(下横线)代表任意单个字符串。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';

"_"转义为普通的"_"。

⑤涉及空值的查询

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL; /*分数Grade是空值*/

⑥多重条件查询

逻辑运算符ANDOR可以用来连接多个查询条件。AND的优先级高于OR,但是可以用括号改变优先级。

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

3.ORDER BY子句

升序(ASC)降序(DESC),默认为升序(下小上大)。

SELECT Sco,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC;

4.聚集函数

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于,从中选择满足条件的组。

3.4.2 连接查询

1.等值与非等值连接查询

SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno; /*将Student与SC中同一学生的元组连接起来*/

2.自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。

SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;

3.外连接

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);
/*也可以使用USING来去掉结果中的重复值:FROM Student LEFT OUTER JOIN SC USING(Sno); */

4.多表查询

两个以上的表进行连接。

3.4.3 嵌套查询

将一个查询块(SELECT-FROM-WHERE)嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。

1.带有IN谓词的子查询

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
    (SELECT Sdept
     FROM Student
     WHERE Sname='刘晨');

子查询的查询条件不依赖于父查询,称为不相关查询

子查询的查询条件依赖于父查询,称为相关查询

2.带有比较运算符的子查询

SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)    /*某学生的平均成绩*/
              FROM SC y
              WHERE y.Sno=x.Sno);

内层查询返回的是单个值时,可以用比较运算符代替IN。

3.带有ANY(SOME)或ALL谓词的子查询

4.带有EXISTS谓词的子查询

SELECT Sname
FROM Student
WHERE EXISTS
    (SELECT *
     FROM SC
     WHERE Sno=Student.Sno AND Cno='1');

3.4.4 集合查询

并操作(UNION)、交操作(INTERSECT)和差操作(EXCEPT

SELECT *
FROM Student
WHERE Sdept='CS'
UNION
SELECT *
FROM Student
WHERE Sage<=19;

3.4.5 基于派生表的查询

SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno='1')AS SC1
WHERE Student.Sno=SC1.Sno;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值