SELECT *FROM table_name;--查询全表的所有列的数据
SELECT column,column,...,column FROM table_name;--查询指定列名的数据
当SELECT中的字段是一个表达式,那么查询出来的结果集中,当前列的列名就是该表达式,这样的可读性比较差,为此我们用别名来改善。
格式为:column AS column_name 或者 column column_name
如果希望别名中区分大小写字符或者想使别名中包含字符或空格,则必须用双引号将其字符引起来。
WHERE子句:用于限制查询结果,逐步过滤,其中不能使用分组函数
格式为:WHERE expr1 关系运算符 expr2
expr1和expr2可以是算术表达式或者函数
当expr2为数字时,可用单引号引起来,也可不用
当expr2为字符或日期时,必须用单引号引起来
数据库的关系运算符
单列比较符:
>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、=(等于)、
<>(不等于)、!=(不等于,但不常用)
多列比较符:
>ANY(expr1,expr2,...):大于列举数据中最小的
<ANY(expr1,expr2,...):小于列举数据中最大的
>ALL(expr1,expr2,...):大于列举数据中最大的
<ALL(expr1,expr2,...):小于列举数据中最小的
数据库中的逻辑运算符
AND:用于返回必须满足多个条件的结果(相当于java中的&&)
OR:用于返回只需满足一个条件的结果(相当于java中的||)
AND的优先级是高于OR的,可用括号提高优先级
LIKE:用于模糊查询字符串,需要借助于通配符_和%
%表示0到多个字符
_表示单个字符(必须有一个字符)
IN(expr1,expr2,...,exprn):获取与列举数据匹配的数据之一,用于等值比较,若匹配则返回true
NOT IN(expr1,expr2,...exprn):表示不是列举数据的任何一个。即全不相等。
BETWEEN expr1 AND expr2:用与查询expr1到expr2之间的数据(包含expr1和expr2)
IS NULL:是空值
IS NOT NULL:不是空值
DISTINCT(column,column,...):过滤指定列的重复行
对多列去重时只能达到这几列的组合是不重复的,即将多列看成一个整体去重,会保留一个NULL值
排序
ORDER BY column,column,... ASC(可以不写):升序排序列举列
ORDER BY column,column,... DESC:降序排序列举列
ORDER BY后可接列名、列别名、列位置(数字)、表达式、函数
当有多列进行排序时,左边的列排序的优先级高于右边的列,即在左边列排序的基础上,若右边列的值相同则执行右边列的排序规则
NULL的值认为是最大的,在升序排序中排在最后,在降序排序中排在最前
聚合函数:将表中的全部数据划分为几组数据,每组数据统计出一个结果,
忽略空值(null) 也称为分组函数、多行函数、集合函数。
MAX(column):统计当前列的最大值,列可以是任何类型
MIN(column):统计当前列的最小值,列可以是任何类型
AVG(column):统计当前列或表达式的平均值
SUM(column):用于统计当前列或表达式的和
COUNT:用于计算表的记录条数
COUNT(*):统计全表的总记录,即列数,但会忽略NULL列
COUNT(column):统计列不为空的记录条数
分组函数
GROUP BY column1,column2,... :根据给定的字段分组,值相同的为一组
当有多列参与分组时将多列看作一个整体,整体每列的值都相同才分为一组,出现一次
注意:只要在SELECT中使用了分组函数,那么SELECT中出现的非分组函数的列必须同时出现在GROUP BY子句中,反过来,在GROUP中出现的非分组函数的列不是必须出现在SELECT子句中。
GROUP BY ROLLUP(column1,column2,...)
从右到左以一次少一列的方式进行分组, 直到所有列(全表)分组完毕。
当有n个参数时,将进行n+1次分组。
GROUP BY CUBE(column1,column2,...):可以将参数看作一个维度,让后根据纬度分组。
我们可以将每个参与分组的的参数与没有参与分组的参数进行组合,其组合的结果就是分组后的集合。
对有n个参数的CUBE,将进行2^n次分组
eg:GROUP BY CUBE(a,b,c);
首先对(a,b,c)进行分组,然后依次为:(a,b),(a,c),(a),(b,c),(b),(c)进行分组
GROUP BY GROUPING SETS(column1,column2,...)
可以生成与使用单个GROUP BY ROLLUP或CUBE运算符所生成的结果集相同的结果集。
如果不需要获得由完备的ROLLUP或CUBE生成的全部分组,则可以使用GROUPING SETS。
其所指定的参数只是所需的分组参数,列表中允许包含重复分组
GROUPING SETS(a,b,c):表示对(a),(b),(c)进行依次分组
GROUPING SETS((a,b),c):表示对(a,b),(c)进行依次分组
GROUPING SETS(a,a):表示对(a),(a)进行2次分组(允许重复)
HAVING:用于在进行分组查询后二次过滤数据,不能单独存在,必须跟在GROUP BY之后。
WHERE用于第一次检索过滤,HAVING用于第二次检索过滤,常与WHERE联用
查询语句的执行顺序
(1)FROM子句:执行顺序为从后往前,从右到左
数据量较少的表尽量放在最后
(2)WHERE子句:执行顺序自下而上、从右到左
将能过滤掉最大数量记录的条件写在WHERE子句最右
(3)GROUP BY子句:执行顺序从左往右分组
最好GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉
(4)HAVING子句:消耗资源,在GROUP BY之后执行
尽量避免使用,HAVING会检索出所有的记录后才对结果集进行筛选,需要排序等操作
(5)SELECT子句:少用*号,尽量取字段名
Oracle在解析的过程中,通过查询数据字典将*号依次转换成所有的列名,消耗时间
(6)ORDER BY子句:执行顺序从左到右,消耗资源。
联合查询:两个或两个以上数据表或视图的查询。通常建立在存在相互关系的父子表之间
n张表联合查询必须有n-1个连接条件。
格式为:SELECT column,column,... FROM table1,table2
WHERE 连接条件
AND 筛选条件
笛卡尔积:做关联表的每一个表的每一行(X)都和其他表的每一行(Y)做组合,返回X*Y条记录
等值连接:用=连接相关的表,通常将主外键所在的列设为连接条件
非等值连接:不同的表没有共同属性的列,但两张表的列可以写成一个SQL条件表达式
内连接:返回所有满足连接条件的记录
格式为: SELECT column,column,...
FROM table1 JOIN table2
ON 连接条件
自然连接:两张表中只有一个字段相同,则自动寻找两张表相同的列名做等值连接
格式为:SELECT column,column,... FROM table1
NATURAL JOIN table2
外连接:返回满足条件的记录,同时也返回不满足连接条件的记录
格式为:SELECT column,column,... FROM table1
LEFT OUTER JOIN table2
ON 连接条件
左外连接(LEFT OUTER ):以table1为主,将table2中不满足条件的赋予NULL并返回结果集
右外连接(RIGHT OUTER):以table2为主,将table1中不满足条件的赋予NULL并返回结果集
全外连接(FULL OUTER):将两张表查找的总和记录返回,不满足的补NULL
自连接:一种特殊的连接查询,数据来源于一个表,关联关系来自与同一表中的不同列,通过将同一表用别名虚拟成两个表的方式来实现等值或不等值连接。