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,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。

扫描二维码关注公众号,回复: 15287456 查看本文章
#查询全体学生的姓名及其出生年份(假设今年是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;

在这里插入图片描述

  • 对于空值,排序时显示的次序由具体系统来决定。

猜你喜欢

转载自blog.csdn.net/z135733/article/details/128949483