Oracle学习——投影(SELECT)、筛选(WHERE)、排序(ORDER BY)
本文将介绍多个数据库操作语句,并进行代码操作实操。
1、SELECT语句
SELECT语句主要是对列进行投影,选择的是那个表的哪一列进行投影表示。
语法基本结构:
SELECT *|{[DISTINCT] cloumn|expression [alias], .... } FORM table
语法解释:
- DISTINCT 关键字表示禁止重复
- * 选择所有列
- cloumn|expression 选择指定的字段或者表达式
- alias 给所选择的列指定不停的标题名(列名)
- FORM table 指定所包含的表
1.1、算术表达式
使用算术运算表达式可以对数字和日期数据进行算术运算(+-*/)。
SELECT id, (salary+100)*12 FROM employee
将employee这个表中的salary字段下的所有数值+100,再乘以12,最后显示。
注意:对日期类型(DATA、TIMESTAMP)的数据只能进行加减运算;对于列数据中具有空值的数据,经过计算后也是为空值
1.2、别名定义
我们可以给选出来的列(或表达式计算出)给一个别名,不过需要满足以下规则。
- 紧跟在列标题名后面,用空格分隔
- 在列名和别名之间可以使用AS来连接(建议使用这种方式)
- 如果别名中包含有空格、特殊字符或者对大小写敏感,则要求使用“”分隔
SELECT id, (salary+100)*12 AS "Annual salary" FROM employee
将计算之后的列给一个叫做Annual salary的别名(因为这里有空格,所以使用了“”)
1.3、连字运算符
连接列或者字符串到其他列当中。使用||进行连接,列与列之间,列与表达式之间或者列与常数值之间的连接,来创建一个字符表达式。连字运算符两边的列被合并成单个的输出列。
SELECT id || name FROM employee
将id和name列的数据连起来(这里尽管id的数据类型是number也可以连接)。
下面这个例子,表明我们还可以在连字运算符中加入自定义的文字字符串,需要注意的是文字字符串需要使用单引号(' ')引起来。
SELECT name || '的id是' || id AS "Employee Details" FROM employee
2、WHERE约束语句
前文提到的SELECT语句主要是对列进行筛选,而下面将介绍如何对行进行筛选,主要采用的是WHERE语句,帮助我们在查询到的结果中进行数据过滤。
语法基本结构:
SELECT *|{[DISTINCT] cloumn|expression [alias], ...} FROM table
[WHERE condition(s)]
语法解释:
- WHERE 子句紧跟着FROM子句
- WHERE 限制查询满足条件的行
- condition 由列名、表达式、常数和比较操作组成
WHERE子句能够比较列值、文字值、算术表达式或者函数,WHERE子句必须包含一个可以返回bool类型的表达式。如果该行数据能够使得表达式为true则会被查询显示,否则不会被显示。WHERE子句有是三个元素组成:
- 列名
- 比较条件(<>、=、<、>)
- 列名、常量、值列表
SELECT id, name, departmentid FROM employee
WHERE departmentid = 10
该查询语句,查询departmentid这个字段下值为10的那些行被显示出来。如果我们还需要增加行筛选条件,则可以使用AND/OR等逻辑连接关键字连接其他的条件,语法格式如下:
SELECT *|{[DISTINCT] cloumn|expression [alias], ...} FROM table
WHERE condition1 AND condition2 AND condition3...
2.1、字符串和日期
- 日期和字符串的值必须放在单引号(' ' )中
- 字符值区分大小写和空格,日期值是格式敏感的
- 日期的默认格式是DD-MON-YY(日-月-年),例如‘24-1月-2006’即‘2006年1月24日‘
Oracle中数据库以内部数字格式储存日期,表示为:世纪、年、月、日、小时、分、秒,默认的日期显示格式为字符串DD-MM-YY,但是我们可以使用to_data(字符串,‘format’)的形式改造成datatime格式来进行筛选,例如:
SELECT id, name, departmentid FROM employee
WHERE hire_data= TO_DATE('2021/8/8', 'yyyy/mm/dd')
在SQL学习——数据类型、约束类型文中的第三部分提到,Orcale中采用同一格式来储存data格式,而to_date函数可以将字符串转化为这种格式,从而与数据库中的值进行比较。
2.2、比较条件介绍
- =:等于
- >:大于
- >=:大于等于
- <:小于
- <=:小于等于
- <>(或者!=):不等于
SELECT id, name, departmentid FROM employee
WHERE salary <= 100000
查询薪水薪水小于等于100000的行数据。
2.3、其他比较条件
- BETWEEN 下限 AND 下限:在两个值之间的查询(包含),注意到上下限位置不可以交换。
- IN(值1,值2,...):匹配一个任意值的列表。
- LIKE ‘....’:使用通配符进行模糊查询("%"匹配任意多个字符,"_"表示只匹配单个字符)。
- IS [NOT] NULL:当前列是否是空值。
对于LIKE匹配这里有一个需要学习的知识点,那就是:escape,转义符号定义保留字。我们想一下这种场景,我想要搜索姓名开头为bob_like的人员信息,我们应该在LIKE中使用'bob_like%'来进行匹配对吧,但实际上如果这样Orcale会认为_是一个通配符,并不是真正的字符串,因此这肯定达不到我们的要求。所以我们需要一个转义符号告诉Orcale这个_并不是通配符。我们需要用escape ‘符号’来先告诉Orcale哪一个符号是转义符,比如escape ‘\’,则表示\这个符号后面跟的一个字母不再是Orcale本身的含义了,因此上面说到的需求我们可以使用以下代码来实现:
SELECT id, name, salary, departmentid, hire_data FROM employee
WHERE name LIKE 'bob\_like%' escape '\'
下面是上述各比较条件的例子。
1、查询薪水在2500到6000之间的值
SELECT id, name, departmentid FROM employee
WHERE salary BETWEEN 2500 AND 6000
2、查询id是7,8,2的雇员信息
SELECT id, name, departmentid FROM employee
WHERE id IN(7,8,2)
3、查询name中第二个字母是e的雇员信息
SELECT id, name, salary, departmentid FROM employee
WHERE name LIKE '_e%'
4、查询入职日期是2021年入职的人员信息
SELECT id, name, salary, departmentid, hire_data FROM employee
WHERE hire_data LIKE '%21'
这里需要注意的是能使用‘%2021’,因为data储存格式中年只储存了2位。
2.4、逻辑条件关系
- AND:两个组成部分的条件都为真,才返回TRUE
- OR:两个组成部分条件中只要有一个为真则返回TRUE
- NOT:对关系取反
其中AND和OR,都比较好理解,这里我们需要了解下NOT,NOT不仅仅可以在IS NOT...中使用,还可以跟随LIKE,BETWEEN,IN使用,语法规则如下:
NOT LIKE '...'
NOT IN (...)
NOT BETWEEN ... AND ...
3、ORDER BY 排序语句
帮助结果集进行排序,提供升序(ASC)和降序排序(DESC)两种排序方式,默认是升序排序。排序的字段可以是没有包括在SELECT子句中的字段。
语法基本结构:
SELECT *|{[DISTINCT] cloumn|expression [alias], ...} FROM table
ORDER BY cloumn [ASC|DESC], cloumn2 [ASC|DESC],....
语法解释:
- ORDER BY 子句需要在SELECT子句的最后(如果有WHERE子句,则需要把ORDER BY 放在WHERE之后)
- ORDER BY 后面紧跟的字段名是需要排序的字段名,并且越靠近BY的字段,优先级越高。
升序规则:
- 对于数字,越小的值在前面
- 对于日期,越早的日期在前面
- 对于字符值,依字母(ASCII码)顺序显示,A在第一,Z最后,大写在前,小写在后。
- 对于空值,显示在最后(如果是降序则会显示在最前面)
SELECT id, name, salary, departmentid, hire_data FROM employee
ORDER BY salary ASC, id DESC
这段SQL是指现将salary字段值按照升序排列,如果salary字段相同则按照id降序排列。
注意:对于ORDER BY后面跟着的字段名可以是表中的字段名称,也可以是在SELECT中取的字段别名,也可以是1,2,3这种数字表示SELECT中位置字段(不推荐,因为如果SELECT中字段顺序发生改变则导致排序优先级发生改变)