SQL数据查询——单表查询和排序

简介: SQL数据查询——单表查询和排序

一、单表查询

单表查询指仅涉及一个表的查询

1.查询列

1)查询全部列指定列

选择表中的全波列或者部分列,这就是关系代数中的投影运算

该语句的执行过程:从选定的表中取出一个元组,取出该元组在选定的属性上的值,形成一个新的元组作为输出。对该表所有元组做相同的处理,最后形成一个结果关系作为输出。

# 最基本的SELECT语句: SELECT 字段1,字段2,... FROM 表名 
SELECT 1 + 1,3 * 2;
SELECT 1 + 1,3 * 2
FROM DUAL; #dual:伪表
  • 结果

全部列

#查询全体学生的详细记录
SELECT * FROM Student;
  • 结果

部分列

#查询全体学生的学号与姓名(指定列)
SELECT Sno, Sname
FROM Student;
  • 结果:

2)查询经过计算的值

SELECT子句的<目标表达式>不仅可以是表中的属性列,也可以是表达式、字符串常量、函数等

计算之后的列默认名称为计算的公式

#查询全体学生的姓名及其出生年份
SELECT Sname, 2004-Sage
FROM Student;
  • 结果:

3)列的别名

用户也可以通过指定别名来改变计算的列标题,对于含有算术表达式、常量、函数名的目标列表达式较为常用。

命名方式:紧跟列名,也可以在列名和别名之间加入关键字AS,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。

#查询全体学生的姓名及其出生年份(假设今年是2004年)和所在的院系,要求用小写字母表示所有的系名
SELECT Sname AS 'NAME', 'Year of Birth:' BIRTH, 2004-Sage BIRTHDAY,
LOWER(Sdept) DEPARTMENT
FROM Student;
  • 结果

2.查询元组

1)消除取值重复的行(DISTINCT)

两个本来并不完全相同的元组,投影到指定的某些列上之后,可能变成相同的行了,可以通过DISTINCT来取消重复的行

如果按照默认方式选定某一列

#查询选修了课程的学生学号
SELECT Sno FROM SC;
  • 结果有重复行

加入DISTINCT

#去重
SELECT DISTINCT Sno
FROM SC;
  • 结果

2)条件查询(WHERE)

常用的运算符

  1. 算数运算符
  2. 比较运算符

  3. 逻辑运算符
  4. 位运算符
  5. 正则表达式

    运算操作较为简单,查询方式也比较灵活,这里就不一一介绍了。
    常用的有比较(>、<……)、确定范围(BETWEEN……AND)、确定集合(IN)、字符匹配(LIKE)、涉及空值的查询(IS NULL / IS NOT NULL)、多重条件查询(AND / OR)

简单的示例

#查询所有年龄小于20岁的学生姓名及年龄
SELECT Sname, Sage
FROM Student
WHERE Sage < 20;
  • 结果

3.空值参与运算

在某些属性中,经常会遇见NULL的情况,但是如果这一列带着NULL要参与运算,如果算作默认的运算,后面的结果都会是NULL

如果不加处理

SELECT employee_id,salary "月工资",salary * (1 + commission_pct) * 12 "年工资",commission_pct
FROM employees;
  • 结果:

如果想要得到一个符合条件的值,可以根据实际情况,将NULL转化为合适的值

在这里,NULL代表没有奖金,所以应该转化为0再做运算

#实际问题的解决方案:引入IFNULL
SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0)) * 12 "年工资",commission_pct
FROM `employees`;
  • 正确的结果

4.着重号

我们需要保证表中的字段、表名等没有和保留字、数据库系统或常用方法冲突。如果真的相同,需要在SQL语句中使用一对``(着重号)引起来。

如果不加处理

#错误的:
SELECT * FROM ORDER;
  • 错误信息:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'ORDER' at
line 1

解决方法

SELECT * FROM `ORDER`;

二、排序(ORDER BY子句)

用户可用ORDER BY子句对查询结果按照一个或多个属性列的升序或降序排列,缺省(默认)为升序

排序规则

  • ASC为升序
  • DESC为降序
  • ORDER BY子句在SELECT语句的结尾

简单的例子

#查询所有学生的学号及成绩,结果按照分数的降序排列
SELECT Sno, Grade
FROM SC
ORDER BY Grade  DESC;
  • 结果

注意

  1. 也可使用列的别名进行排序
#查询全体学生姓名和所在的院系,结果按照院系号降序排列
SELECT Sname, Sdept dept
FROM Student
ORDER BY dept DESC;

  1. WHERE 需要声明在FROM后,ORDER BY之前。
#查询选修了3号课程的学生的学号及其成绩,查询结果按照分数的降序排列
SELECT Sno, Grade
FROM  sc
WHERE Cno='3'
ORDER BY Grade DESC;
#1-4行执行顺序:2、3、1、4

  1. 二级排序
#查询全体学生的情况,查询结果按所在系的系号升序排序,同一系的学生按年龄降序排序
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;

  • 对于空值,排序时显示的次序由具体系统来决定。
目录
打赏
0
0
0
0
1
分享
相关文章
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
141 77
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
29天前
|
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
46 17
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
103 6
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
406 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
2月前
|
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
115 9
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
7月前
|
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
185 13
|
7月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
111 9
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等