数据库表查询中常用的 SQL 语句及其用法

数据库表查询中常用的 SQL 语句及其用法

  在数据库管理中,SQL(结构化查询语言)是与数据库进行交互的核心工具,而表查询则是 SQL 的重要应用场景之一。无论是从单表中提取特定数据,还是在多表之间进行复杂的数据关联分析,合理使用 SQL 查询语句都能让我们高效地获取所需信息。本文将详细介绍数据库表查询中常用的 SQL 语句及其用法。
在这里插入图片描述



一、基础单表查询

1. 查询所有列

  使用SELECT *语句可以查询表中的所有列数据。

SELECT
	*
FROM
	表名;

  例如,有一个学生表students,包含id、name、age、gender等列,要查询所有学生的信息,就可以使用:

SELECT
	*
FROM
	students;

2. 查询指定列

  若只需查询表中的部分列,可在SELECT关键字后指定列名,多个列名之间用逗号分隔。

SELECT1,2,3
FROM
	表名;

  比如,只查询学生的姓名和年龄:

SELECT
	name,
	age
FROM
	students;

3. 去重查询

  当需要查询某列中不重复的值时,可使用DISTINCT关键字。

SELECT
DISTINCT
	列名
FROM
	表名;

  例如,查询学生表中所有不同的性别:

SELECT
DISTINCT
	gender
FROM
	students;

二、条件查询

  通过WHERE子句可以对查询结果进行筛选,只返回满足条件的数据。WHERE子句中可以使用各种比较运算符和逻辑运算符。

1. 比较运算符

运算符用途
=等于
>大于
<小于
>=大于等于
<=小于等于
!=或<>不等于

  例如,查询年龄大于 20 岁的学生:

SELECT
	*
FROM
	students
WHERE
	age > 20;

2. 逻辑运算符

运算符用途
AND逻辑与,表示多个条件同时满足
OR逻辑或,表示多个条件中至少有一个满足
NOT逻辑非,对条件进行取反
  1. 查询年龄大于 20 岁且性别为的学生:
SELECT
	*
FROM
	students
WHERE
	age > 20
	AND gender = '男';
  1. 查询年龄大于 20 岁或者性别为的学生:
SELECT
	*
FROM
	students
WHERE
	age > 20
	OR gender = '女';
  1. 查询年龄不大于 20 岁的学生(即年龄小于等于 20 岁):
SELECT
	*
FROM
	students
WHERE
	NOT age > 20;

3. 范围查询

  • BETWEEN … AND …:查询在某个范围内的数据,包括边界值
  • IN (值1, 值2, …):查询在指定列表中的数据
  1. 查询年龄在 18 到 25 岁之间的学生:
SELECT
	*
FROM
	students
WHERE
	age BETWEEN 18
	AND 25;
  1. 查询性别为男或女的学生(假设性别列只有这两个值):
SELECT
	*
FROM
	students
WHERE
	gender IN ('男', '女');

4. 模糊查询

  使用LIKE关键字可以进行模糊查询,配合通配符 %_ 使用。

  • %:匹配任意数量的字符,包括零个字符
  • _:匹配任意一个字符
  1. 查询姓名以 “张” 开头的学生:
SELECT
	*
FROM
	students
WHERE
	name LIKE '张%';
  1. 查询姓名中包含 “三” 字的学生:
SELECT
	*
FROM
	students
WHERE
	name LIKE '%三%';
  1. 查询姓名为两个字的学生(假设每个字用一个字符表示):
SELECT
	*
FROM
	students
WHERE
	name LIKE '__';

三、排序查询

  使用ORDER BY子句可以对查询结果按照指定列进行排序,默认是升序排序(ASC),也可以指定降序排序(DESC)。

SELECT
	列名	
FROM
	表名
ORDER BY
	排序列 [ASC/DESC];
  1. 例如,按年龄升序排列学生信息:
SELECT
	*
FROM
	students
ORDER BY
	age ASC;
  1. 按年龄降序且姓名升序排列学生信息:
SELECT
	*
FROM
	students
ORDER BY
	age DESC,
	name ASC;

四、聚合函数查询

  聚合函数用于对一组数据进行计算,返回一个单一的值。常见的聚合函数有:

函数用途
COUNT()统计行数
SUM()计算数值列的和
AVG()计算数值列的平均值
MAX()获取列中的最大值
MIN()获取列中的最小值

1. 统计行数

  统计学生表中的学生人数:

SELECT
	COUNT(*)
FROM
	students;

2. 计算总和

  假设有一个成绩表scores,包含student_id和score列,计算所有学生的成绩:

SELECT
	SUM(score)
FROM
	scores;

3. 计算平均值

  计算所有学生的平均成绩:

SELECT
	AVG(score)
FROM
	scores;

4. 获取最大值和最小值

  获取成绩表中的最高成绩和最低成绩:

SELECT
	MAX(score),
	MIN(score)
FROM
	scores;

五、分组查询

  使用GROUP BY子句可以将数据按照指定列进行分组,通常与聚合函数一起使用,对每个分组进行统计计算。

SELECT
	分组列,
	聚合函数 (其他列)
FROM
	表名
GROUP BY
	分组列;

1. 例如,按性别分组统计学生人数:

SELECT
	gender,
	COUNT(*) AS 人数
FROM
	students
GROUP BY
	gender;

2. 分组后的筛选

使用HAVING子句可以对分组后的结果进行筛选,筛选条件基于聚合函数的计算结果。

SELECT
	分组列,
	聚合函数 (其他列)
FROM
	表名
GROUP BY
	分组列
HAVING
	筛选条件;

3. 统计成绩表中每个学生的平均成绩,并筛选出平均成绩大于80 分的学生:

SELECT
	student_id,
	AVG(score) AS 平均成绩
FROM
	scores
GROUP BY
	student_id
HAVING
	AVG(score) > 80;

六、多表连接查询

  当需要从多个表中获取数据时,需要使用表连接操作。常见的连接类型有:

链接类型说明
内连接(INNER JOIN)只返回两个表中连接条件匹配的行
左外连接(LEFT JOIN或LEFT OUTER JOIN)返回左表的所有行,右表中匹配的行,若右表没有匹配的行则用NULL填充
右外连接(RIGHT JOIN或RIGHT OUTER JOIN)返回右表的所有行,左表中匹配的行,若左表没有匹配的行则用NULL填充
全外连接(FULL JOIN或FULL OUTER JOIN)返回两个表中所有匹配的行和不匹配的行,不匹配的行用NULL填充

  假设学生表students和成绩表scores通过student_id进行关联。

1. 内连接

  查询学生的姓名和对应的成绩:

SELECT
	students.name,
	scores.score
FROM
	students
	INNER JOIN scores ON students.id = scores.student_id;

2. 左外连接

  查询所有学生的姓名以及他们的成绩(包括没有成绩的学生):

SELECT
  students.name,
  scores.score
FROM
  students
  LEFT JOIN scores ON students.id = scores.student_id;

3. 右外连接

  查询所有成绩对应的学生姓名(包括没有学生对应的成绩,这种情况可能较少见):

SELECT
  students.name,
  scores.score
FROM
  students
  RIGHT JOIN scores ON students.id = scores.student_id;

七、子查询

  子查询是指在一个查询语句中嵌套另一个查询语句,子查询通常放在WHERE子句FROM子句HAVING子句中。

1. 在 WHERE 子句中使用子查询

  查询成绩高于平均成绩的学生信息:

SELECT
  *
FROM
  students
WHERE
  id IN (SELECT student_id FROM scores WHERE score > (SELECT AVG(score) FROM scores));

2. 在 FROM 子句中使用子查询(表子查询)

  将子查询的结果作为一个临时表来使用:

SELECT
  s.name,
  sub.平均成绩
FROM
  students s,
  (SELECT student_id, AVG(score) AS 平均成绩 FROM scores GROUP BY student_id) sub
WHERE
  s.id = sub.student_id;

八、限制查询结果数量

  使用LIMIT子句可以限制查询结果返回的行数,常用于分页查询。

SELECT
	*
FROM
	表名
	LIMIT 起始行数,
	显示行数;

  例如,查询前 5 条学生记录:

SELECT
	*
FROM
	students
	LIMIT 0,
	5;

九、别名的使用

  为了使查询语句更易读,可以给表名或列名起别名,使用AS关键字AS可以省略)。

SELECT
	s.name AS 学生姓名,
	sc.score AS 学生成绩
FROM
	students s
	INNER JOIN scores sc ON s.id = sc.student_id;

  通过合理组合和运用以上各种 SQL 查询语句,我们可以在数据库表查询中灵活地获取所需的数据,满足不同的业务需求。在实际应用中,需要根据具体的数据库结构和查询目标,选择合适的查询方法,以提高查询效率和数据处理的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值