查询语句

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


自连接:一种特殊的连接查询,数据来源于一个表,关联关系来自与同一表中的不同列,通过将同一表用别名虚拟成两个表的方式来实现等值或不等值连接。



你可能感兴趣的:(排序,分组,过滤,聚合函数,模糊查找)