SQL查询语句教程
目录
1、[SQL简介](#sql简介)
2、[基本查询语法](#基本查询语法)
简单查询
条件查询
去重查询
排序查询
分组查询
分组过滤
分页查询
3、[联表查询](#联表查询)
内连接
左连接
右连接
全连接
4、[注意事项](#注意事项)
5、[综合案例](#综合案例)
6、[相关问题与解答](#相关问题与解答)
SQL简介
SQL,即结构化查询语言,是用于管理和操作关系数据库的标准语言,SQL不仅能够进行数据查询,还能够完成插入、更新、删除等操作,本文将重点介绍SQL的查询功能,包括各种类型的查询及其用法。
基本查询语法
简单查询
SELECT column1, column2, ... FROM table_name;
解释: 查询表中的指定列。
示例:
SELECT name, age FROM users;
解释: 查询users
表中的name
和age
列。
条件查询
SELECT column1, column2, ... FROM table_name WHERE condition;
解释: 通过WHERE
子句筛选满足条件的数据。
示例:
SELECT name, age FROM users WHERE age > 25 AND city = 'New York';
解释: 查询users
表中年龄大于25且城市为‘New York’的记录。
去重查询
SELECT DISTINCT column_name(s) FROM table_name;
解释: 使用DISTINCT
去掉重复数据。
示例:
SELECT DISTINCT city FROM users;
解释: 查询users
表中所有不重复的城市。
排序查询
SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];
解释: 通过ORDER BY
子句对查询结果排序,默认升序(ASC),可指定降序(DESC)。
示例:
SELECT name, age FROM users ORDER BY age DESC;
解释: 查询users
表中的name
和age
,并按年龄从大到小排序。
分组查询
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name;
解释: 通过GROUP BY
子句对数据分组。
示例:
SELECT city, COUNT(*) AS user_count FROM users GROUP BY city;
解释: 统计users
表中每个城市的用户数量。
分组过滤
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition;
解释: 通过HAVING
子句筛选分组后的数据。
示例:
SELECT city, COUNT(*) AS user_count FROM users GROUP BY city HAVING user_count > 10;
解释: 只显示用户数量大于10的城市及其统计值。
分页查询
SELECT column1, column2, ... FROM table_name ORDER BY column_name LIMIT number;
解释: 使用LIMIT
实现分页。
示例:
SELECT name, age FROM users ORDER BY age DESC LIMIT 5;
解释: 查询年龄最大的前5个用户。
联表查询
内连接
SELECT a.column1, b.column2, ... FROM table1 a INNER JOIN table2 b ON a.common_column = b.common_column;
解释: 查询两个表中匹配的数据。
示例:
SELECT u.name, o.order_id, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;
解释: 查询用户及其订单信息。
左连接
SELECT a.column1, b.column2, ... FROM table1 a LEFT JOIN table2 b ON a.common_column = b.common_column;
解释: 查询左表中的所有数据及右表中匹配的数据,无匹配时右表列为NULL。
示例:
SELECT u.name, o.order_id FROM users u LEFT JOIN orders o ON u.id = o.user_id;
解释: 查询所有用户及其对应订单(无订单的用户也会显示)。
右连接
SELECT a.column1, b.column2, ... FROM table1 a RIGHT JOIN table2 b ON a.common_column = b.common_column;
解释: 查询右表中的所有数据及左表中匹配的数据,无匹配时左表列为NULL。
示例:
SELECT u.name, o.order_id FROM users u RIGHT JOIN orders o ON u.id = o.user_id;
解释: 查询所有订单及其对应用户(无用户的订单也会显示)。
全连接(部分数据库支持)
SELECT a.column1, b.column2, ... FROM table1 a FULL JOIN table2 b ON a.common_column = b.common_column;
解释: 显示所有用户和订单信息,包括不匹配的记录。
示例:
SELECT u.name, o.order_id FROM users u FULL JOIN orders o ON u.id = o.user_id;
解释: 显示所有用户和订单信息,包括不匹配的记录。
注意事项
1、SQL区分大小写:SQL关键字对大小写不敏感(如SELECT
和select
等效),表名、列名是否区分大小写,取决于数据库设置。
2、NULL值处理:NULL不等于0或空字符串,使用IS NULL
或IS NOT NULL
检查 NULL 值。SELECT name FROM users WHERE phone_number IS NULL;
。
3、防止SQL注入:永远不要将用户输入直接拼接到SQL查询中,使用参数化查询代替拼接字符串,使用预处理语句。
4、性能优化:避免SELECT
,只查询需要的列,对经常查询的列添加索引(如主键、外键、条件列),使用EXPLAIN
分析查询性能。
5、表别名的使用:使用别名使SQL更简洁易读,特别是在联表查询时。SELECT u.name, o.amount FROM users AS u JOIN orders AS o ON u.id = o.user_id;
。
6、分组和排序的顺序:如果使用了GROUP BY
,ORDER BY
应作用于分组后的数据,注意不要混淆两者的顺序。
7、避免笛卡尔积:联表时如果忘记指定ON
条件,可能会导致笛卡尔积,查询结果数据量急剧膨胀,确保联表查询包含正确的连接条件。
综合案例
需求:查询年龄大于30岁的用户,统计每个城市的用户数量,按用户数量降序排序,只显示用户数量大于5的城市前3个。
SQL实现:
SELECT city, COUNT(*) AS user_count FROM users WHERE age > 30 GROUP BY city HAVING user_count > 5 ORDER BY user_count DESC LIMIT 3;
解释:1.WHERE
筛选年龄大于30的用户,2.GROUP BY
按城市分组,3.HAVING
筛选用户数量大于5的城市,4.ORDER BY
按用户数量降序排序,5.LIMIT
返回前3个结果,掌握这些基础语法后,可以根据需求组合使用不同语句,完成复杂的查询任务。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/88359.html