赞
踩
目录
- SELECT [ALL|DISTINCT]<目标列表达式>[,<目标表达式>]……
- FROM <表名或视图名>[,<表名或视图名>]|(<SELECT语句>)[AS]<别名>
- [WHERE<条件表达式>]
- [GROUP BY <列名1>[HAVING<条件表达式>]]
- [GROUP BY <列名2>[ASC|DESC]];
仅涉及一张表的查询
确定查询的表:首先确定要查询的表,可以使用SELECT语句来指定要查询的表。
选择要查询的列:使用SELECT语句中的列名或通配符(*)来选择要返回的列。可以使用逗号分隔多个列。
添加过滤条件:使用WHERE子句来添加过滤条件,以限制查询结果。可以使用比较运算符(如等于、大于、小于等)和逻辑运算符(如AND、OR)来组合多个条件。
指定排序方式:使用ORDER BY子句来指定查询结果的排序方式。可以按照一个或多个列进行排序,并可以指定升序(ASC)或降序(DESC)。
执行查询:执行SELECT语句,数据库会根据指定的表、列、过滤条件和排序方式来执行查询,并返回符合条件的结果集。
处理查询结果:根据需要对查询结果进行处理,可以使用聚合函数(如SUM、COUNT、AVG等)进行统计,使用GROUP BY子句进行分组,使用HAVING子句进行条件过滤等。
获取查询结果:获取查询结果集,可以使用FETCH或者LIMIT子句来限制返回的记录数。
WHERE子句是用于在SQL查询中添加条件表达式来过滤结果集的子句。它可以根据指定的条件表达式筛选出符合条件的行。
一般语法
- SELECT <目标列表达式>
- FROM <表名>
- WHERE <条件表达式>;
以下是一些常见的条件表达式的示例:
column = value
column <> value
column > value
column < value
column >= value
column <= value
column BETWEEN value1 AND value2
column IN (value1, value2, ...)
column NOT IN (value1, value2, ...)
column LIKE 'value%'
可以使用多个条件表达式结合使用,并使用逻辑运算符连接它们,例如:
- WHERE condition1 AND condition2
- WHERE condition1 OR condition2
- WHERE NOT condition
聚集函数是用于对一组数据进行计算并返回单个结果的函数。它们可以对数据进行汇总、计数、平均值、最大值、最小值等操作。
常见的聚集函数包括:
COUNT(*) | 统计元组的个数 |
COUNT([DISTINCT|ALL]<列名>) | 统计一列中值的个数 |
SUM([DISTINCT|ALL]<列名>) | 计算一列的总和(此列必须是数值型) |
AVG([DISTINCT|ALL]<列名>) | 计算一列的平均值(此列必须是数值型) |
MAX([DISTINCT|ALL]<列名>) | 求一列值中的最大值 |
MIN([DISTINCT|ALL]<列名>) | 求一列中的最小值 |
注意:
GROUP BY语句是用于将查询结果按照指定的列进行分组的语句。它可以将相同值的行分组在一起,并对每个分组进行聚合计算。
GROUP BY语句的一般语法如下:
- SELECT <列1>, <列2>, ...
- FROM <表名>
- GROUP BY <列1>, <列2>, ...;
GROUP BY子句将查询结果按照指定的列进行分组,将具有相同值的行分为一组。然后,可以使用聚集函数对每个分组进行计算,例如COUNT、SUM、AVG、MAX、MIN等。
GROUP BY语句可以与其他子句一起使用,如WHERE子句用于添加条件表达式进行筛选,HAVING子句用于对分组结果进行筛选。
同时对两个及以上的表进行查询,称为连接查询
连接查询可以使用以下几种方式进行:
内连接(INNER JOIN):返回两个表中满足连接条件的数据行。内连接只返回两个表中共有的匹配行。
左连接(LEFT JOIN):返回左表中的所有行以及满足连接条件的右表中的匹配行。如果右表中没有匹配的行,则返回NULL值。
右连接(RIGHT JOIN):返回右表中的所有行以及满足连接条件的左表中的匹配行。如果左表中没有匹配的行,则返回NULL值。
全外连接(FULL OUTER JOIN):返回左表和右表中的所有行,并将它们根据连接条件进行匹配。如果某个表中没有匹配的行,则返回NULL值。
连接查询的一般语法如下:
- SELECT <列1>, <列2>, ...
- FROM <表1>
- JOIN <表2> ON <连接条件>;
其中,<列1>, <列2>, ...
表示要查询的列,<表1>
和<表2>
表示要连接的表,<连接条件>
表示连接两个表的条件。
等值连接是基于两个表中的列的相等条件进行连接的。它使用"="操作符来比较连接列的值,并返回满足条件的数据行。
- /*
- 例如,假设有一个"customers"表和一个"orders"表,它们都有一个"customer_id"列。我们可以使用等值连接查询获取每个客户的订单信息:
- */
- SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date
- FROM customers
- INNER JOIN orders ON customers.customer_id = orders.customer_id;
- /*
- 这个查询将返回每个客户的ID、姓名以及他们的订单ID和订单日期。
- */
非等值连接是基于两个表中的列的不等条件进行连接的。它使用"<", ">", "<=", ">="等操作符来比较连接列的值,并返回满足条件的数据行。
- /*
- 例如,假设有一个"products"表和一个"orders"表,它们都有一个"unit_price"列。我们可以使用非等值连接查询获取每个订单中购买价格高于平均价格的产品信息:
- */
- SELECT orders.order_id, orders.order_date, products.product_name, products.unit_price
- FROM orders
- INNER JOIN products ON orders.unit_price > products.unit_price;
- /*
- 这个查询将返回每个订单的ID、日期以及购买价格高于平均价格的产品名称和价格。
- */
连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,称为表的自身连接
自身连接可以用于解决一些特定的问题,比如层级结构的查询、查找相邻记录等。
- /*
- 以下是一个示例,假设有一个"employees"表,其中包含员工的ID、姓名和上级的ID。我们可以使用自身连接查询每个员工的上级姓名:
- */
- SELECT e.employee_id, e.employee_name, m.employee_name AS manager_name
- FROM employees e
- INNER JOIN employees m ON e.manager_id = m.employee_id;
- /*
- 在这个查询中,我们为"employees"表使用了两个不同的别名:"e"表示员工表的实例,"m"表示上级表的实例。通过连接条件"e.manager_id = m.employee_id",我们将员工表中的每个员工与其对应的上级进行关联,并获取其上级的姓名。
- */
自身连接是一种强大的技术,可以帮助我们解决一些复杂的查询问题。但需要注意,在进行自身连接时,要确保连接条件的正确性,避免形成无限循环或产生错误的结果。
外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)和全外连接(FULL JOIN)三种类型。
左外连接返回左表中的所有记录,以及与右表匹配的记录。如果右表中没有匹配的记录,则返回NULL值。
- /*
- 例如,假设有一个"customers"表和一个"orders"表,我们可以使用左外连接查询获取每个客户以及他们的订单信息:
- */
- SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date
- FROM customers
- LEFT JOIN orders ON customers.customer_id = orders.customer_id;
- /*
- 这个查询将返回每个客户的ID、姓名以及他们的订单ID和订单日期。如果某个客户没有订单,相应的订单ID和订单日期将为NULL。
- */
右外连接返回右表中的所有记录,以及与左表匹配的记录。如果左表中没有匹配的记录,则返回NULL值。
- /*
- 例如,假设有一个"customers"表和一个"orders"表,我们可以使用右外连接查询获取每个订单以及对应的客户信息:
- */
- SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date
- FROM customers
- RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
- /*
- 这个查询将返回每个订单的ID、日期以及对应的客户ID和姓名。如果某个订单没有对应的客户,相应的客户ID和姓名将为NULL。
- */
全外连接返回左表和右表中的所有记录,包括左表和右表中没有匹配的记录。如果某个表中没有匹配的记录,则返回NULL值。
- /*
- 例如,假设有一个"customers"表和一个"orders"表,我们可以使用全外连接查询获取所有客户和订单的信息:
- */
- SELECT customers.customer_id, customers.customer_name, orders.order_id, orders.order_date
- FROM customers
- FULL JOIN orders ON customers.customer_id = orders.customer_id;
- /*
- 这个查询将返回所有客户和订单的ID、姓名、订单ID和订单日期。如果某个客户没有订单,相应的订单ID和订单日期将为NULL;如果某个订单没有对应的客户,相应的客户ID和姓名将为NULL。
- */
在SQL语言中,一个SELECT- FROM - WHERE语句为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。
以下是一些常见的嵌套查询的示例:
1.使用嵌套查询作为条件:
- SELECT column1, column2, ...
- FROM table1
- WHERE column1 IN (SELECT column1 FROM table2);
在这个例子中,内部查询(SELECT column1 FROM table2)将返回一个结果集,然后外部查询将根据这个结果集中的值来筛选table1中的记录。
2.使用嵌套查询作为子查询:
- SELECT column1, column2, ...
- FROM table1
- WHERE column1 = (SELECT column1 FROM table2 WHERE condition);
在这个例子中,内部查询(SELECT column1 FROM table2 WHERE condition)将返回一个结果集,然后外部查询将根据这个结果集中的值来筛选table1中的记录。
3.使用嵌套查询作为表达式:
- SELECT column1, column2, ..., (SELECT column1 FROM table2) AS column3
- FROM table1;
在这个例子中,内部查询(SELECT column1 FROM table2)将返回一个值,然后外部查询将使用这个值作为一个新的列(column3)。
用于连接外层查询和子查询
常用谓词:
等于(Equal):使用 "=" 运算符来比较两个值是否相等。 示例:WHERE column1 = (SELECT column1 FROM table2);
不等于(Not Equal):使用 "<>", "!=", "NOT" 运算符来比较两个值是否不相等。 示例:WHERE column1 <> (SELECT column1 FROM table2);
大于(Greater Than):使用 ">" 运算符来比较一个值是否大于另一个值。 示例:WHERE column1 > (SELECT column1 FROM table2);
小于(Less Than):使用 "<" 运算符来比较一个值是否小于另一个值。 示例:WHERE column1 < (SELECT column1 FROM table2);
大于等于(Greater Than or Equal To):使用 ">=" 运算符来比较一个值是否大于或等于另一个值。 示例:WHERE column1 >= (SELECT column1 FROM table2);
小于等于(Less Than or Equal To):使用 "<=" 运算符来比较一个值是否小于或等于另一个值。 示例:WHERE column1 <= (SELECT column1 FROM table2);
存在(Exists):使用 "EXISTS" 关键字来检查子查询是否返回任何结果。 示例:WHERE EXISTS (SELECT column1 FROM table2 WHERE condition);
不存在(Not Exists):使用 "NOT EXISTS" 关键字来检查子查询是否不返回任何结果。 示例:WHERE NOT EXISTS (SELECT column1 FROM table2 WHERE condition);
ANY(SOME)子查询:使用ANY(SOME)关键字来比较子查询的结果与多个值中的任意一个是否满足条件。
示例:
SELECT column1, column2, ... FROM table1 WHERE column1 > ANY (SELECT column1 FROM table2);
在这个例子中,子查询(SELECT column1 FROM table2)返回一个结果集,然后外部查询将检查table1中的column1是否大于子查询结果集中的任意一个值。
ALL子查询:使用ALL关键字来比较子查询的结果与多个值中的所有值是否都满足条件。
示例:
SELECT column1, column2, ... FROM table1 WHERE column1 > ALL (SELECT column1 FROM table2);
在这个例子中,子查询(SELECT column1 FROM table2)返回一个结果集,然后外部查询将检查table1中的column1是否大于子查询结果集中的所有值。
ANY(SOME)和ALL子查询提供了一种灵活的方式来进行多个值的比较,并可以与各种比较运算符(如大于、小于、等于等)结合使用。需要根据具体的需求和查询条件来选择使用哪种形式的子查询。
集合查询是指在数据库中使用集合运算符(如UNION、INTERSECT和EXCEPT)来组合和操作多个查询结果集的查询操作。
UNION操作符:将两个或多个查询的结果集合并为一个结果集,去除重复的行。
示例:
SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2;
在这个例子中,两个查询的结果集将被合并为一个结果集,并且重复的行将被去除。
INTERSECT操作符:返回两个查询结果集的交集,即同时存在于两个结果集中的行。
示例:
SELECT column1, column2, ... FROM table1 INTERSECT SELECT column1, column2, ... FROM table2;
在这个例子中,两个查询的结果集将被比较,返回同时存在于两个结果集中的行。
EXCEPT操作符:返回第一个查询结果集中存在但在第二个查询结果集中不存在的行。
示例:
- SELECT column1, column2, ... FROM table1 EXCEPT SELECT column1, column2, ... FROM table2;
-
在这个例子中,第一个查询的结果集将被比较,返回在第一个结果集中存在但在第二个结果集中不存在的行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。