【SQL学习】查询命令:从基础到进阶的全面指南
【SQL学习】查询命令:从基础到进阶的全面指南
ZhangCurry【SQL学习】查询命令:从基础到进阶的全面指南
一、SQL基础查询命令
1. 连接与选择数据库
列出所有数据库:
在开始查询之前,我们常常需要知道数据库服务器中都有哪些数据库可供使用。使用 SHOW DATABASES; 命令,例如,当你在MySQL环境中执行此命令时,会看到类似 information_schema 、 mysql 、 test 等数据库名称(具体显示因环境而异) 。
选择数据库:
确定目标数据库后,我们使用 USE database_name; 命令进入该数据库比如 USE my_project_db; ,这样后续的操作就都在 my_project_db 这个数据库中进行了。
2. 查看数据库结构
显示表:
进入数据库后,我们可以使用 SHOW TABLES; 命令查看该数据库中包含的所有表。例如,执行该命令后,可能会看到 users (用户表)、 orders (订单表)、 products (产品表)等。
显示表结构:
想要了解表的具体结构,使用 DESCRIBE table_name; 或 SHOW COLUMNS FROM table_name; 命令。以 users 表为例,执行 DESCRIBE users; 后,会展示出每列的名称、数据类型、是否允许为空、是否为主键等详细信息,如 id (整数类型,主键,不为空)、 name (字符串类型,可为空)、 email (字符串类型,唯一,可为空)等 。
3. 基本数据查询
选择特定列:
SELECT column1, column2 FROM table_name; 这是最基本的查询形式。例如 SELECT name, age FROM users; ,会从 users 表中提取出 name 和 age 这两列的数据,展示出每个用户的姓名和年龄 。
选择所有列:
当需要获取表中所有数据时,使用 SELECT * FROM table_name; 。例如 SELECT * FROM orders; ,会返回 orders 表中的所有列数据,包括订单编号、用户ID、订单金额、下单时间等 。
去除重复值:
在数据中,有时会存在重复的记录,使用 SELECT DISTINCT column1 FROM table_name; 可以去除这些重复值。比如在 users 表中,可能存在重复的城市记录,执行 SELECT DISTINCT city FROM users; ,就只会返回不同的城市名称,避免冗余信息 。
4. 条件查询(WHERE子句)
简单条件筛选:
SELECT * FROM table_name WHERE condition; 例如 SELECT * FROM products WHERE price > 100; ,会从 products 表中筛选出价格大于100的所有产品记录,展示这些产品的详细信息 。
多条件组合:
使用逻辑运算符 AND 、 OR 、 NOT 可以组合多个条件。比如 SELECT * FROM users WHERE age > 20 AND city = ‘Beijing’; ,会筛选出年龄大于20且居住在北京的用户记录 。再如 SELECT * FROM orders WHERE NOT status = ‘completed’; ,会返回状态不为“completed”(已完成)的订单记录 。
5. 数据排序(ORDER BY子句)
SELECT * FROM table_name ORDER BY column1 [ASC|DESC]; ORDER BY子句用于对查询结果进行排序。例如 SELECT * FROM products ORDER BY price ASC; ,会将 products 表中的产品按照价格升序排列,价格低的产品排在前面;而 SELECT * FROM users ORDER BY registration_date DESC; ,会将用户按照注册日期降序排列,最新注册的用户排在前面 。
6. 限制结果数量(LIMIT子句)
获取指定数量的记录:
SELECT * FROM table_name LIMIT number; LIMIT子句用于限制查询结果返回的行数。比如 SELECT * FROM orders LIMIT 10; ,会只返回 orders 表中的前10条订单记录,常用于获取最新的几条数据或抽样数据 。
分页查询:
SELECT * FROM table_name LIMIT offset, number; 可以实现分页功能。其中 offset 表示偏移量, number 表示每页返回的记录数。例如 SELECT * FROM products LIMIT 10, 20; ,会从 products 表的第11条记录开始,返回20条记录,相当于获取第二页的数据(假设每页20条) 。
二、SQL高级查询命令
1. 聚合函数与分组查询
聚合函数:
SQL提供了一系列聚合函数,如 SUM (求和)、 AVG (求平均值)、 COUNT (计数)、 MAX (求最大值)、 MIN (求最小值)。例如 SELECT SUM(price) FROM products; ,会计算出 products 表中所有产品价格的总和 ; SELECT AVG(score) FROM students; 会计算学生表中所有学生成绩的平均值 。
分组查询(GROUP BY子句):
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1; GROUP BY子句用于将数据按照某一列进行分组,然后对每个组应用聚合函数。例如 SELECT category, AVG(price) FROM products GROUP BY category; ,会将 products 表中的产品按照类别分组,并计算每个类别的平均价格 。
分组后的条件筛选(HAVING子句):
HAVING子句用于对分组后的结果进行筛选,与WHERE子句类似,但WHERE子句用于对单个记录进行筛选,而HAVING子句用于对分组后的结果进行筛选。例如 SELECT category, AVG(price) FROM products GROUP BY category HAVING AVG(price) > 200; ,会先按照类别分组计算平均价格,然后只返回平均价格大于200的类别及其平均价格 。
2. 连接查询(JOIN)
在实际应用中,数据往往分散在多个表中,连接查询可以将这些表中的数据关联起来。
内连接(INNER JOIN):
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; INNER JOIN会返回两个表中满足连接条件的所有行。例如有 users 表和 orders 表,通过 user_id 关联, SELECT * FROM users INNER JOIN orders ON users.user_id = orders.user_id; 会返回所有有订单的用户及其订单信息 。
左连接(LEFT JOIN):
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column; LEFT JOIN会返回左表( table1 )中的所有行,以及右表( table2 )中满足连接条件的行。如果右表中没有匹配的行,则用NULL填充。例如 SELECT * FROM users LEFT JOIN orders ON users.user_id = orders.user_id; ,会返回所有用户,包括没有订单的用户,对于没有订单的用户,其订单相关列会显示为NULL 。
右连接(RIGHT JOIN):
与左连接相反, RIGHT JOIN 会返回右表中的所有行以及左表中满足连接条件的行。例如 SELECT * FROM users RIGHT JOIN orders ON users.user_id = orders.user_id; ,会返回所有订单,以及下单用户的信息,如果某个订单没有对应的用户(理论上很少见,但在数据不完整时可能出现),则用户相关列显示为NULL 。
3. 子查询
子查询是指在一个查询中嵌套另一个查询。
作为条件的子查询:
例如 SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products); ,先计算出产品的平均价格,然后筛选出价格高于平均价格的产品记录 。
作为结果集的子查询:
SELECT * FROM (SELECT column1, column2 FROM table1 WHERE condition) AS subquery; 子查询作为一个临时表,外层查询可以对其进行进一步处理。例如 SELECT * FROM (SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id) AS subquery WHERE order_count > 5; ,先统计每个用户的订单数量,然后筛选出订单数量大于5的用户及其订单数量 。
4. 联合查询(UNION)
SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2; UNION用于将多个SELECT语句的结果合并成一个结果集。需要注意的是,UNION会去除重复的记录,如果要保留重复记录,可以使用 UNION ALL 。例如有 table1 和 table2 两个结构相同的表, SELECT name FROM table1 UNION SELECT name FROM table2; 会将两个表中的 name 列合并,并去除重复的名字 。
SQL查询命令是数据库操作的核心,通过基础查询命令,我们可以实现数据的基本检索和筛选;而高级查询命令则让我们能够处理更复杂的业务逻辑和数据分析需求。



