SQL 第二集(select)

这篇博客详细介绍了SQL的查询操作,包括基本查询、条件查询、投影查询、排序、分页、聚合函数、多表查询、连接查询、HAVING子句的使用,以及日期处理和NVL函数的用法。通过实例展示了如何使用SQL筛选、排序、分组数据,以及处理空值。
摘要由CSDN通过智能技术生成

参考廖雪峰老师: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;   

14.Oracle的NVL函数用法

语法:NVL(eExpression1, eExpression2)
参数:eExpression1, eExpression2
如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2;

如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。

eExpression1 和 eExpression2 可以是任意一种数据类型。

如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
返回值类型:字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值