详解SQL单表查询

SQL单表查询

  • [1. `SELECT` 语句的基本结构](#1. SELECT 语句的基本结构)
  • [2. 查询所有列和指定列](#2. 查询所有列和指定列)
  • [3. `WHERE` 条件筛选](#3. WHERE 条件筛选)
    • 比较运算符
    • [多条件查询:使用 `AND` 和 `OR`](#多条件查询:使用 ANDOR)
    • [`NOT` 操作符](#NOT 操作符)
  • [4. `ORDER BY` 进行排序](#4. ORDER BY 进行排序)
  • [5. `LIMIT` 限制返回行数](#5. LIMIT 限制返回行数)
    • 只获取前N行数据
    • [使用 `LIMIT` 和 `OFFSET` 进行分页查询](#使用 LIMITOFFSET 进行分页查询)
  • [6. 常见的SQL函数操作](#6. 常见的SQL函数操作)
  • [7. 使用别名 `AS`](#7. 使用别名 AS)
  • [8. 使用 `DISTINCT` 去重](#8. 使用 DISTINCT 去重)
  • 综合实例

1. SELECT 语句的基本结构

单表查询的最基本语句结构是:

sql 复制代码
SELECT 列1, 列2, ... 
FROM 表名
WHERE 条件
ORDER BY 列名 ASC|DESC
LIMIT 数量;

关键要素说明:

  • SELECT:选择列。可以指定多个列,也可以使用通配符(*)选择所有列。
  • FROM:指定查询的数据来源,即数据表的名称。
  • WHERE:条件筛选,设置过滤条件,只返回符合条件的行。
  • ORDER BY:排序,对结果集按指定列进行升序或降序排列。
  • LIMIT:限制结果行数,适合分页或只取前几条数据。

2. 查询所有列和指定列

查询所有列

如果希望一次性查询表中的所有列,可以用星号*代替列名。

示例 :查询employees表的所有数据。

sql 复制代码
SELECT * FROM employees;

此时返回整个表的内容,非常适合快速查看一个表的所有数据。

查询特定列

在很多实际情况下,我们并不需要所有列的数据。我们可以指定要查询的列名,以减少数据传输量。

示例:查询员工姓名和工资

sql 复制代码
SELECT name, salary FROM employees;

这种方法尤其适合数据量较大时的查询操作,因为只获取所需列的数据能够显著提升查询效率。

3. WHERE 条件筛选

WHERE子句允许我们对数据进行条件过滤。只有符合条件的记录才会被返回。WHERE子句支持多种比较运算符和逻辑运算符。

比较运算符

  • =:等于
  • <>:不等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于

示例:查询工资大于8000的员工

sql 复制代码
SELECT * FROM employees WHERE salary > 8000;

返回结果中只有工资高于8000的员工数据。

多条件查询:使用 ANDOR

可以使用ANDOR运算符组合多个条件。

  • AND:只有所有条件都为真时,结果才会返回。
  • OR:只要有一个条件为真,结果就会返回。

示例 :查询IT部门且工资大于8000的员工

sql 复制代码
SELECT * FROM employees WHERE department = 'IT' AND salary > 8000;

只有同时满足两个条件的记录才会返回。

示例 :查询IT部门或工资大于8000的员工

sql 复制代码
SELECT * FROM employees WHERE department = 'IT' OR salary > 8000;

只要满足其中一个条件的记录都会被返回。

NOT 操作符

NOT运算符用于否定条件,返回不符合该条件的记录。

示例 :查询非IT部门的员工

sql 复制代码
SELECT * FROM employees WHERE NOT department = 'IT';

4. ORDER BY 进行排序

ORDER BY子句用于对结果进行排序,可以指定升序(ASC)或降序(DESC)。

  • ASC(升序):从小到大排列(默认)。
  • DESC(降序):从大到小排列。

示例:按工资升序排列

sql 复制代码
SELECT * FROM employees ORDER BY salary ASC;

示例:按年龄降序排列

sql 复制代码
SELECT * FROM employees ORDER BY age DESC;

多列排序

可以根据多列进行排序。首先按第一列排序,如果第一列相同,则按第二列排序,以此类推。

示例:先按部门排序,再按工资降序排序

sql 复制代码
SELECT * FROM employees ORDER BY department, salary DESC;

返回结果会先按部门分组排序,然后在每个部门内按工资降序排列。

5. LIMIT 限制返回行数

LIMIT子句用于限制查询结果返回的行数,特别适用于分页查询和获取前几条记录。

只获取前N行数据

示例:获取工资最高的两位员工

sql 复制代码
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;

此查询首先按工资降序排序,然后仅返回前两条记录。

使用 LIMITOFFSET 进行分页查询

分页查询时,我们可以配合LIMITOFFSET使用,OFFSET表示从第几行开始返回数据。

示例:从第3行开始返回两条数据

sql 复制代码
SELECT * FROM employees LIMIT 2 OFFSET 2;

此查询会跳过前两行,从第三行开始返回两条记录。

6. 常见的SQL函数操作

在单表查询中,SQL提供了一些常用的函数来对数据进行处理:

  • COUNT():计算记录行数。
  • SUM():计算数值列的总和。
  • AVG():计算数值列的平均值。
  • MAX():返回数值列中的最大值。
  • MIN():返回数值列中的最小值。

示例:统计员工总数

sql 复制代码
SELECT COUNT(*) AS total_employees FROM employees;

示例:计算所有员工的平均工资

sql 复制代码
SELECT AVG(salary) AS avg_salary FROM employees;

示例 :查询部门为IT的员工最高工资

sql 复制代码
SELECT MAX(salary) AS max_salary FROM employees WHERE department = 'IT';

7. 使用别名 AS

别名AS用于给列或表起一个临时名称。别名不会改变列或表的真实名称,但可以使查询结果更加易读。

示例 :查询员工姓名和工资,并给工资列起别名为employee_salary

sql 复制代码
SELECT name, salary AS employee_salary FROM employees;

在查询结果中,列名会显示为employee_salary而不是salary,这在需要重新命名列名时非常方便。

8. 使用 DISTINCT 去重

DISTINCT关键字用于消除结果中的重复值。

示例:查询所有不同的部门名称

sql 复制代码
SELECT DISTINCT department FROM employees;

返回结果中,每个部门只会出现一次。

综合实例

假设我们想要查询以下信息:

  1. 所有部门中工资最高的员工姓名及其工资。
  2. 只返回IT财务部门,并按工资降序排列。

综合使用多种SQL关键字的查询语句如下:

sql 复制代码
SELECT name, department, MAX(salary) AS highest_salary
FROM employees
WHERE department IN ('IT', '财务')
GROUP BY department
ORDER BY highest_salary DESC;

通过熟练掌握以上内容,可以灵活应用单表查询从数据中获取所需信息。

相关推荐
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天7 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺8 小时前
分布式系统架构:服务容错
数据库·架构
独行soc9 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘