数据库学习 数据查询DQL

SQL中查询语句只有SELECT一条

SELECT[DISTINCT]*|<目标列表达式[别名]清单>
FROM <关系名[别名]或视图名清单>
[WHERE <查询条件表达式>]
[GROUP BY 列名清单
[HAVING <组条件表达式>]]
[ORDER BY 列名[ASC|DESC],…]
整个语句的执行过程如下:
1、读取FROM子句中基本表、视图的数据,执行笛卡尔积操作。
2、选取满足WHERE子句中给出的条件表达式的元组。
3、按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些组。
4、按SELECT子句中给出的列名或列表达式求值输出。
5、ORDER子句对输出的目标表进行排序,按附加说明ASC升序排列 ,或按DESC降序排列。

在WHERE子句的行条件表达式中可使用下列运算符:
算术比较运算符:<,<=,>,>=,=,<>或!=;
逻辑运算符:AND,OR,NOT;
集合成员资格运算符:IN,NOT IN
谓词:EXISTS,ALL,SOME,UNIQUE;
聚合函数:AVG,MIN,MAX,SUM,COUNT
集合运算符:UNION,INTERSECT,EXCEPT。

单表查询

选择表中的若干列

SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1'

SELECT后面的DISTINCT表示要在结果中去掉重复的

SELECT *
FROM J;

如果要查询FROM子句后面指定的基本表的全体属性时,可以用*来表示

SELECT SNAME
FROM S
WHERE SADDR LIKE '上海%'

LIKE是字符串匹配操作符,一般形式是:<列名> LIKE <字符串常数>
%:表示可以与任意长度的字符串匹配
_:表示可以与任意单个字符匹配

多表查询

实现多表查询时,如果要引用不同表中同名属性,则在属性名前加关系名,即关系名.属性名

SELECT DISTINGCT JNAME
FROM J,SPJ
WHERE SPJ.JNO=J.JNO AND PNO='P3'

可以通过在FROM后面写上执行操作的表名,然后在WHERE子句中写上连接条件来将几个表进行联接操作

SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1'
AND PNO IN(SELECT PNO FROM P WHERE COLOR='红');

嵌套子查询时先求出内层查询的结果,再求外层查询的结果
还可以写成

SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1'
AND '红' IN(SELECT COLOR FROM P WHERE P.PNO=SPJ.PNO)

这个称为相关子查询,子查询中查询条件依赖于外层查询中的值,因此子查询要反复求值供外层查询使用。相关子查询的一般处理过程是:首先取外层查询关系的第一个元组,根据它的值与内层查询相关的属性值处理内层查询,若结果为真则将这个结果取出,然后查询下一个元组。重复这个过程,直至整个表全部检查完为止
第三种写法

扫描二维码关注公众号,回复: 1641566 查看本文章
SELECT DISTINCT SNO
FROM SPJ
WHERE JNO='J1'
AND EXISTS(SELECT * FROM P WHERE SPJ.PNO=P.PNO AND COLOR='红')

EXISTS是存在量词,一般地,EXISTS(SELECT语句)为真,当且仅当内层SELECT语句的查询结果非空(即至少存在一行),EXISTS和IN类似,但是EXISTS效率比IN高。IN是先执行内查询再到外判断,而EXISTS是从外到内来判断是否满足条件
典型:求至少用了供应商编号为S1所供应的全部零件的工程编号JNO

SELECT DISTINCT JNO
FROM SPJ X
WHERE NOT EXISTS
(SELECT *FROM SPJ Y
WHERE Y.SNO='S1'
AND NOT EXISTS
(SELECT * FROM SPJ,Z
WHERE Z.JNO=X.JNO
AND Z.PNO=Y.PNO));

这里用两个NOT EXISTS是根据离散数学中蕴含关系式所得

联接操作

联接条件可以在WHERE中指定,也可以在FROM子句中指定。如果在FROM子句中指定,SQL2将联接操作符分为联接类型和联接条件两部分

联接类型 说明
INNER JOIN 内连接:结果为两个联接表中匹配行的联接
LEFT OUTER JOIN 左外联接:结果包括左表(出现在JOIN子句最左边)中的所有行,不包括右表中的不匹配行
RIGHT OUTER JOIN 右外联接:结果包括右表(出现在JOIN子句最右边)中的所有行,不包括左表中的不匹配行
FULL OUTER JOIN 完全外联接:结果包括所有联接表中的所有行,不论他们是否匹配
CROSS JOIN 交叉联接:结果包括两个联接表中所有可能出现的行组合。交叉联接返回的是两个表的笛卡尔积

例:

SELECT DISTINCT X.JON
FROM SPJ X INNER JOIN
SPJ Y ON X.JNO=Y.JNO
WHERE (X.PNO='P3') AND (Y.PNO='P5')

猜你喜欢

转载自blog.csdn.net/q418030645/article/details/78937274