查询数据的 SQL 语句
SQL(Structured Query Language)是一种用于访问和操作关系数据库的标准语言,在数据查询方面,SQL 提供了强大的功能来获取、过滤、排序和汇总数据,以下是一些常见的查询数据 SQL 语句及其示例:
一、基本查询
选择特定列
语法:SELECT column1, column2, ... FROM table_name;
示例:从名为employees
的表中选择员工编号和姓名。
SQL 语句 | 说明 |
SELECT employee_id, first_name FROM employees; | 查询employees 表中的employee_id 和first_name 列,获取员工的编号和名字信息。 |
选择所有列
语法:SELECT * FROM table_name;
示例:查询products
表的所有列数据。
SQL 语句 | 说明 |
SELECT * FROM products; | 获取products 表中所有列的数据,包括产品的各种属性如产品 ID、名称、价格等。 |
使用别名
语法:SELECT column1 AS alias1, column2 AS alias2, ... FROM table_name;
示例:对students
表中的姓名和年龄列进行查询并设置别名。
SQL 语句 | 说明 |
SELECT first_name AS Name, age AS Age FROM students; | 将查询结果中的first_name 列显示为Name ,age 列显示为Age ,使结果更具可读性。 |
二、条件查询
简单条件查询
语法:SELECT column1, column2, ... FROM table_name WHERE condition;
示例:查询工资大于 5000 的员工信息。
SQL 语句 | 说明 |
SELECT employee_id, first_name, salary FROM employees WHERE salary > 5000; | 筛选出salary (工资)大于 5000 的员工的编号、姓名和工资信息。 |
多条件查询 AND
语法:SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2;
示例:查询部门为“Sales”且工资在 4000 到 6000 之间的员工。
SQL 语句 | 说明 |
SELECT employee_id, first_name, department FROM employees WHERE department = 'Sales' AND salary BETWEEN 4000 AND 6000; | 找出既属于“Sales”部门,工资又在 4000 到 6000 区间内的员工相关信息。 |
多条件查询 OR
语法:SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2;
示例:查询职位是“Manager”或“Engineer”的员工。
SQL 语句 | 说明 |
SELECT employee_id, first_name, position FROM employees WHERE position = 'Manager' OR position = 'Engineer'; | 获取职位为“Manager”或者“Engineer”的员工的编号、姓名和职位信息。 |
模糊查询
a. LIKE 运算符 百分号(%)通配符
语法:SELECT column1, column2, ... FROM table_name WHERE column LIKE '%pattern%';
示例:查询姓氏以“张”开头的员工。
SQL 语句 | 说明 |
SELECT employee_id, first_name FROM employees WHERE first_name LIKE '张%'; | 查找first_name (姓名)以“张”开头的员工编号和姓名,% 表示任意数量的字符。 |
b. LIKE 运算符 下划线(_)通配符
语法:SELECT column1, column2, ... FROM table_name WHERE column LIKE 'pattern_';
示例:查询邮箱地址第三个字符为“n”的员工。
SQL 语句 | 说明 |
SELECT employee_id, email FROM employees WHERE email LIKE '__n%'; | 找到邮箱地址中第三个字符是“n”的员工编号和邮箱,__ 表示两个任意字符,% 表示后续任意数量字符。 |
三、排序查询
语法:SELECT column1, column2, ... FROM table_name ORDER BY column1 ASC/DESC, column2 ASC/DESC;
示例:按照工资升序查询员工信息,若工资相同则按姓名降序排列。
SQL 语句 | 说明 |
SELECT employee_id, first_name, salary FROM employees ORDER BY salary ASC, first_name DESC; | 根据salary (工资)升序排序员工记录,当工资相同时,再按照first_name (姓名)降序排序。 |
四、聚合函数查询
COUNT() 函数
语法:SELECT COUNT(*) FROM table_name;
或SELECT COUNT(column_name) FROM table_name;
示例:查询员工表中的总人数。
SQL 语句 | 说明 |
SELECT COUNT(*) FROM employees; | 统计employees 表中的行数,即员工总人数,如果只想统计有工资记录的员工人数,可以使用SELECT COUNT(salary) FROM employees; 。 |
SUM() 函数
语法:SELECT SUM(column_name) FROM table_name;
示例:计算订单表中所有订单的总金额。
SQL 语句 | 说明 |
SELECT SUM(total_amount) FROM orders; | 对orders 表中的total_amount (订单总金额)列求和,得到所有订单的总金额。 |
AVG() 函数
语法:SELECT AVG(column_name) FROM table_name;
示例:计算员工的平均年龄。
SQL 语句 | 说明 |
SELECT AVG(age) FROM employees; | 求出employees 表中员工年龄的平均值。 |
4. MAX() 函数和 MIN() 函数
语法:SELECT MAX(column_name) FROM table_name;
和SELECT MIN(column_name) FROM table_name;
示例:查询产品的最高价格和最低价格。
SQL 语句 | 说明 |
SELECT MAX(price) AS MaxPrice, MIN(price) AS MinPrice FROM products; | 分别获取products 表中产品价格的最高值和最低值,并设置别名为MaxPrice 和MinPrice 。 |
五、分组查询
语法:SELECT column1, column2, ..., aggregate_function(column_name) FROM table_name GROUP BY column1, column2, ...;
示例:按照部门分组统计每个部门的员工人数。
SQL 语句 | 说明 |
SELECT department, COUNT(*) AS NumberOfEmployees FROM employees GROUP BY department; | 根据department (部门)列对employees 表进行分组,然后统计每个组(部门)的员工数量,并将统计结果命名为NumberOfEmployees 。 |
六、连接查询
内连接(INNER JOIN)
语法:SELECT columns FROM table1 INNER JOIN table2 ON table1.common_column = table2.common_column;
示例:查询员工及其对应的部门名称。
SQL 语句 | 说明 |
SELECT employees.first_name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id; | 通过employees 表中的department_id 与departments 表中的department_id 进行连接,获取员工的名字以及他们所在的部门名称。 |
左连接(LEFT JOIN)
语法:SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_column = table2.common_column;
示例:查询所有员工及他们所在的部门(如果有),即使员工没有分配部门也能显示出来。
SQL 语句 | 说明 |
SELECT employees.first_name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id; | 如果员工已经分配部门,则显示员工名字和部门名称;如果没有分配部门,部门名称将显示为空值(NULL),但员工名字仍会显示。 |
右连接(RIGHT JOIN)
语法:SELECT columns FROM table1 RIGHT JOIN table2 ON table1.common_column = table2.common_column;
示例:查询所有部门及部门中的员工(如果有),即使部门没有员工也能显示出来。
SQL 语句 | 说明 |
SELECT employees.first_name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.department_id; | 如果部门中有员工,则显示员工名字和部门名称;如果部门没有员工,员工名字将显示为空值(NULL),但部门名称仍会显示。 |
七、子查询
单行子查询作为条件
语法:SELECT column1, column2, ... FROM table_name WHERE column = (SELECT column FROM sub_table WHERE condition);
示例:查询工资高于公司平均工资的员工。
SQL 语句 | 说明 |
SELECT employee_id, first_name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); | 首先通过子查询(SELECT AVG(salary) FROM employees) 计算出公司的平均工资,然后主查询筛选出工资高于这个平均值的员工信息。 |
多行子查询作为结果集
语法:SELECT (SELECT column1 FROM table1 WHERE condition1) AS column1, (SELECT column2 FROM table2 WHERE condition2) AS column2, ...;
示例:查询每个部门的最高工资和该部门的平均工资。
SQL 语句 | 说明 |
SELECT departments.department_name, (SELECT MAX(salary) FROM employees e1 WHERE e1.department_id = departments.department_id) AS MaxSalary, (SELECT AVG(salary) FROM employees e2 WHERE e2.department_id = departments.department_id) AS AvgSalary FROM departments; | 对于每个部门,通过两个子查询分别获取该部门的最高工资和平均工资,并与部门名称一起显示。e1 和e2 是对employees 表的别名引用,用于区分不同的子查询操作范围。 |