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;

  • 对于空值,排序时显示的次序由具体系统来决定。
相关文章
|
12天前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
73 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
19天前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
33 8
|
25天前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
44 4
|
28天前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
1月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
102 10
|
1月前
|
SQL 关系型数据库 MySQL
|
1月前
|
SQL 关系型数据库 MySQL
SQL中,可以使用 `ORDER BY` 子句来实现排序功能
【10月更文挑战第26天】SQL中,可以使用 `ORDER BY` 子句来实现排序功能
90 6
|
1月前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
28 0
|
3月前
|
关系型数据库 MySQL 网络安全
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)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
129 13