常用SQL查询实例
在数据库管理和数据分析中,SQL(结构化查询语言)是最常用和最重要的工具之一,它允许用户执行各种操作,如数据查询、插入、更新和删除,以下是一些常用的SQL查询实例,涵盖了从基础到高级的多种应用场景。
一、基础查询
查询所有列和记录
SELECT * FROM table_name;
这个查询会返回指定表中的所有列和所有记录。
id | name | age |
1 | Alice | 30 |
2 | Bob | 25 |
查询特定列
SELECT column1, column2 FROM table_name;
此查询只返回指定的列。
id | name |
1 | Alice |
2 | Bob |
使用条件查询
3.1 简单条件
SELECT * FROM table_name WHERE condition;
查询年龄大于25的记录:
id | name | age |
1 | Alice | 30 |
3.2 多条件(与条件)
SELECT * FROM table_name WHERE condition1 AND condition2;
查询年龄大于20且小于40的记录:
id | name | age |
1 | Alice | 30 |
2 | Bob | 25 |
3.3 多条件(或条件)
SELECT * FROM table_name WHERE condition1 OR condition2;
查询年龄小于20或大于30的记录:
id | name | age |
2 | Bob | 25 |
1 | Alice | 30 |
二、排序和分组
按某列排序
SELECT * FROM table_name ORDER BY column_name;
升序排列:
id | name | age |
2 | Bob | 25 |
1 | Alice | 30 |
降序排列:
SELECT * FROM table_name ORDER BY column_name DESC;
id | name | age |
1 | Alice | 30 |
2 | Bob | 25 |
分组查询
2.1 基本分组
SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name;
按名字分组并统计每个名字出现的次数:
name | count |
Alice | 1 |
Bob | 1 |
2.2 分组后排序
SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY count DESC;
name | count |
Alice | 1 |
Bob | 1 |
三、连接查询
内连接(INNER JOIN)
SELECT a.column1, b.column2 FROM table1 a INNER JOIN table2 b ON a.common_field = b.common_field;
有两个表employees
和departments
,通过department_id
进行连接:
employee_id | name | department_id | department_name |
1 | Alice | 1 | HR |
2 | Bob | 2 | Engineering |
左连接(LEFT JOIN)
SELECT a.column1, b.column2 FROM table1 a LEFT JOIN table2 b ON a.common_field = b.common_field;
查询所有员工及其部门信息,即使某些员工没有对应的部门信息:
employee_id | name | department_id | department_name |
1 | Alice | 1 | HR |
3 | Carol | NULL | NULL |
右连接(RIGHT JOIN)
SELECT a.column1, b.column2 FROM table1 a RIGHT JOIN table2 b ON a.common_field = b.common_field;
查询所有部门及其员工信息,即使某些部门没有对应的员工信息:
employee_id | name | department_id | department_name |
1 | Alice | 1 | HR |
NULL | NULL | 2 | Engineering |
四、聚合函数
求和(SUM)
SELECT SUM(column_name) FROM table_name;
计算所有员工的年龄总和:
sum_age |
55 |
平均值(AVG)
SELECT AVG(column_name) FROM table_name;
计算所有员工的平均年龄:
avg_age |
27.5 |
最大值(MAX)和最小值(MIN)
SELECT MAX(column_name) FROM table_name; SELECT MIN(column_name) FROM table_name;
查询年龄最大和最小的员工:
max_age | min_age |
30 | 25 |
五、子查询
单行子查询
SELECT column1 FROM table1 WHERE column2 = (SELECT column2 FROM table2);
查询与table2
中第一个员工相同部门的所有员工:
name | department_id |
Alice | 1 |
多行子查询(IN)
SELECT * FROM table1 WHERE column1 IN (SELECT column1 FROM table2);
查询在table2
中出现的所有员工:
id | name | department_id |
1 | Alice | 1 |
六、问题与解答栏目
问题1:什么是内连接(INNER JOIN)?它与左连接(LEFT JOIN)有什么区别?
解答:内连接(INNER JOIN)返回两个表中满足连接条件的记录,只有当两个表中的记录都满足连接条件时,才会出现在结果集中,而左连接(LEFT JOIN)返回左表中的所有记录,以及右表中满足连接条件的记录,如果右表中没有满足连接条件的记录,结果集中对应的右表字段将为NULL,内连接是取交集,左连接是以左表为基础取并集。
问题2:如何计算一个表中某一列的最大值和最小值之间的差值?
解答:可以使用以下SQL语句来计算差值:SELECT (MAX(column_name) MIN(column_name)) AS difference FROM table_name;
,这个查询首先分别计算出指定列的最大值和最小值,然后通过减法运算得到它们之间的差值,并将结果命名为difference
。