参考廖雪峰老师:https://www.liaoxuefeng.com/wiki/1177760294764384/1179663974004192
1.基本查询
使用SELECT * FROM students
其中SELECT
是关键字,表示将要执行一个查询;*
表示“所有列”,FROM
表示将要从哪个表查询,本例中是students
表。
语法:
SELECT * FROM <表名>
总结:可以查询一个表的所有行和所有列的数据。
2.条件查询
SELECT语句可以通过WHERE
条件来设定查询条件,查询结果是满足查询条件的记录。
(通过选择一个列来进行约束)
例如,要指定条件“分数在80分或以上的学生”,写成WHERE
条件就是SELECT * FROM students WHERE score >= 80
。
语法:
SELECT * FROM <表名> WHERE <条件表达式>
第一种条件表达式可以用<条件1> AND <条件2>
表达满足条件1并且满足条件2。
第二种条件是<条件1> OR <条件2>
,表示满足条件1或者满足条件2。
第三种条件是NOT <条件>
,表示“不符合该条件”的记录。
NOT class_id = 2
其实等价于class_id <> 2
,因此,NOT
查询不是很常用。
条件运算优先级:
NOT
-->AND-->OR
,即NOT
优先级最高,其次是AND
,最后是OR
。加上括号可以改变优先级。
总结:通过WHERE
条件查询,可以筛选出符合指定条件的记录,而不是整个表的所有记录。
3.投影查询
SELECT 列1, 列2, 列3 FROM ...
,让结果集仅包含指定列。(投影映射)
起别名:SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...
总结:
使用SELECT *
表示查询表的所有列,使用SELECT 列1, 列2, 列3
则可以仅返回指定列,这种操作称为投影。
SELECT
语句可以对结果集的列进行重命名。
4.排序 order by
查询结果集通常是按照id
排序的,也就是根据主键排序.
SELECT id, name, gender, score FROM students ORDER BY score DESC;
其中,DESC表示倒序。
如果有WHERE
子句,那么ORDER BY
子句要放到WHERE
子句后面。
5.分页
LIMIT 3 OFFSET 0
表示,对结果集从0号记录开始,最多取3条。注意SQL记录集的索引从0开始。
LIMIT 3 OFFSET 3 表示 ,对结果集从3号记录开始查询,把OFFSET
设定为3,接着往下取3条。
LIMIT 3
表示的意思是“最多3条记录”。
OFFSET
是可选的,如果只写LIMIT 15
,那么相当于LIMIT 15 OFFSET 0
。
6.聚合查询:使用聚合函数查询的
聚合函数,如下:
COUNT、SUM(计算某一列的合计值,该列必须为数值类型)、AVG(计算某一列的平均值,该列必须为数值类型)、
MAX(计算某一列的最大值)、MIN(计算某一列的最小值)
COUNT(*)
表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)
。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果。
分组聚合(GROUP BY):
SELECT COUNT(*) num FROM students GROUP BY class_id;
7.多表查询(笛卡尔查询): # 感觉这种方法特别傻呢
语法:SELECT * FROM <表1>, <表2>
多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录。
8.连接查询:
语法:
SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;
INNER JOIN(内连接)查询的写法是:
(1)先确定主表,仍然使用FROM <表1>
的语法;
(2)再确定需要连接的表,使用INNER JOIN <表2>
的语法;
(3)然后确定连接条件,使用ON <条件...>
,这里的条件是s.class_id = c.id
,表示students
表的class_id
列与classes
表的id
列相同的行需要连接;
(4)可选:加上WHERE
子句、ORDER BY
等子句。
OUTER JOIN(外连接):
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
9.
在GROUP BY使用HAVING子句限制返回的结果集。
10.执行顺序:
WHERE --> GROUP BY --> HAVING --> ORDER BY
首先WHERE将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数),
然后通过GROUP BY关键字后面指定的分组条件将筛选得到的视图进行分组,
接着系统根据HAVING关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉,
最后按照ORDER BY语句对视图进行排序,这样最终的结果就产生了。
在这四个关键字中,只有在ORDER BY语句中才可以使用最终视图的列名。
11.WHERE 与 HAVING
“Where”是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
“Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。
日期相关:
参考:https://blog.csdn.net/zhanglu0223/article/details/8458814
12.to_date 与 to_char()
(1).在oracle中,当想把字符串为‘2011-09-20 08:30:45’的格式转化为日期格式,我们可以使用oracle提供的to_date函数。
SELECT to_date('2011-09-20 08:30:45', 'yyyy-MM-dd hh24:mi:ss') FROM dual;
使用to_char()函数把日期转化为字符串。
(2).SELECT to_char(SYSDATE, 'yyyy-MM-dd hh24:mi:ss') FROM dual;
13.系统当前时间 与指定日期的差(都必须是是日期类型),得到的是以天为单位的数值。FLOOR表示取小于等于的整数值。
SELECT FLOOR(AVG(sysdate - hiredate)) FROM dual;
语法:NVL(eExpression1, eExpression2)
参数:eExpression1, eExpression2
如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2;
如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。
eExpression1 和 eExpression2 可以是任意一种数据类型。
如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
返回值类型:字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值