跳至主要內容

数据查询语句


数据查询语句

DQL(Data Query Language),数据查询语句。

查询语句

SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]...
    FROM <表名或视图名>[,<名或视图名>]
    [WHERE<条件表达式>]
    [GROUP BY<列名1>[HAVING<条件表达式>]
    [ORDER BY<列名2>[ASC|DESC]...]

连接查询

内连接

内连接又称等值连接,使用 INNER JOIN 关键字。

SELECT A.value, B.value
FROM tablea AS A INNER JOIN tableb AS B
ON A.key = B.key;

可以不明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中要连接的列用等值方法连接起来。

SELECT A.value, B.value
FROM tablea AS A, tableb AS B
WHERE A.key = B.key;

自连接

自连接可以看成内连接的一种,只是连接的表是自身而已。

举例:一张员工表,包含员工姓名和员工所属部门,要找出与 Jim 处在同一部门的所有员工姓名。

-- 子查询版本
SELECT name
FROM employee
WHERE department = (
      SELECT department
      FROM employee
      WHERE name = "Jim")
-- 自连接版本
SELECT e1.name
FROM employee AS e1 INNER JOIN employee AS e2
ON e1.department = e2.department
      AND e2.name = "Jim";

自然连接

自然连接是把同名列通过等值测试连接起来的,同名列可以有多个。

内连接和自然连接的区别: 内连接提供连接的列,而自然连接自动连接所有同名列。

SELECT A.value, B.value
FROM tablea AS A NATURAL JOIN tableb AS B;

外连接

外连接保留了没有关联的那些行。分为左外连接,右外连接以及全外连接,左外连接就是保留左表没有关联的行。

示例:检索所有顾客的订单信息,包括还没有订单信息的顾客。

SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;

子查询

子查询中只能返回一个字段的数据。

可以将子查询的结果作为 WHRER 语句的过滤条件:

SELECT *
FROM mytable1
WHERE col1 IN (SELECT col2
               FROM mytable2);

分组查询

  • GROUPT BY子句:在WHERE子句后面加上GROUP BY子句可以对元组进行分组,保留字GROUP BY后面跟着一个分组属性列表。最简单的情况是FROM子句后面只有一个关系,根据分组属性对它的元组进行分组。SELECT子句中使用的聚集操作符仅用在每个分组上。

  • HAVING子句:假设元组在分组前按照某种方式加上限制,使得不需要的分组为空,在GROUP BY子句后面跟一个HAVING子句即可。当元组含有空值时应注意以下两点:

    1. 控制在任何聚集操作中被忽略。
    2. NULL值又可以在分组属性中看作是一个一般的值。
上次编辑于:
贡献者: Neil