读书笔记-《SQL 必知必会》

《SQL 必知必会》是学习数据库的入门级经典书籍,里面知识点虽然都比较基础,不过讲解的清晰简介,也比较全面。通过全面的学习SQL,可以在工作面临问题时想到更高效的办法。
接下来主要记录经典章节中知识点的用法(主要针对Oracle语法):
第6课:用通配符进行过滤
第7课:创建计算字段
第8课:使用函数处理数据
第9课:汇总数据
第10课:分组数据
第11课:使用子查询
第12课:联结表
第13课:创建高级联结
第15课:插入数据
第16课:更新和删除数据
第17课:创建和操纵表
第19课:使用存储过程
此外,还有一些章节介绍了视图、索引、事务处理等知识,先不纳入笔记中啦。

第6课:用通配符进行过滤
LIKE操作符+通配符:对数据进行复杂过滤,创建特定数据的搜索模式。
%:代表搜索模式中给定位置的0个、1个或多个字符,不会匹配NULL的行。
_:匹配单个字符。
[]:用来指定一个字符集,来匹配指定位置(通配符的位置)的一个字符,如LIKE ‘[JM]%’ :即匹配开头是J或M的所有信息。此通配符可以用前缀字符 ^ (脱字号)来否定,如LIKE ‘[ ^ JM]%’ 。

第7课:创建计算字段
SQL算术操作符

操作符 说明
+ 加,对字符型数据操作时,类似于’两竖杠’
-
*
/

去除空格:RTRIM()、LTRIM()、TRIM(去字符串左右两边的空格)。

第8课:使用函数处理数据
常用的文本处理函数:

函数 说明
LEFT()、RIGHT() 返回字符串左边(右边)的字符
SUBSTR(str, n1, n2) 返回字符串str中自第n1个字符起n2个字符的值,如substr(‘HelloWorld’,0,3) 返回ell
INSTR(str1,str2) 字符查找函数,select instr(‘helloworld’,‘l’) from dual; --返回结果:3,默认第一次出现“l”的位置
LOWER()、UPPER() 将字符串转换为小写(大写)
LENGTH() 返回字符串的长度
LTRIM()、RTRIM()、TRIM() 去除字符串左边or右边空格
SOUNDEX(str) 返回字符串的SOUNDEX值,即返回发音类似于str的值

时间和日期处理函数:
‘yyyy-mm-dd hh24:mi:ss’

常用数值处理函数:

函数 说明
ABS() 返回一个数的绝对值
EXP() 返回一个数的指数值
SQRT() 返回一个数的平方根
SIN()、COS()、TAN() 返回一个数的正弦、余弦、正切

第9课:汇总数据
聚集函数

函数 说明
AVG() 返回某列的平均值
SUM() 返回某列值的和
COUNT() 返回某列的行数
MAX()、MIN() 返回某列的最大值、最小值

注意:COUNT(*)是对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值,COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

第10课:分组数据
GROUP BY子句
1、GROUP BY子句中列出的每一列都必须是检索列或有效的表达式,如果在SELECT中使用表达式,则在group by子句中制定相同的表达式,不能使用别名;
2、如果分组列中包含NULL值的行,则NULL将作为一个分组返回。

HAVING子句
where过滤行,在数据分组前进行过滤;
having过滤分组,在数据分组后进行过滤。

SELECT子句顺序

select * fromwhere ##
group by  ##
having ##
order by ##

第11课:使用子查询(嵌套查询)
1、作为子查询(subquery)的SELECT语句只能查询单个列,否则将返回错误;
2、在SELECT语句中,子查询总是从内向外处理;
3、子查询中的where子句使用了完全限定列名(指定表名和列名);
4、常用于where子句的In操作符中,以及用来填充计算列

举例1:
列出订购物品RGA01的所有顾客。

select cust_id from orders
where order_num in(
select order_num from orderitems where prod_id='RGAN01')

举例2:
显示customers表中每个顾客的订单总数。

select cust_name,cust_state,
(select count(*) from orders where orders.cust_id=customers.cust_id) orders
from customers
order by cust_name

第12课:联结表
创建联结:指定要联结的所有表以及关联它们的方式即可,具体有例一、例二两种形式如:

#例1
select vend_name,prod_name,pro_price
from vendors,products
where vendors.vend_id=products.vend_id

在联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。where子句作为过滤条件,只包含那些匹配给定条件(即联结条件)的行。
(由没有联结条件的表关系返回的结果是笛卡尔积)

内连接(inner join)即等值联结(equijoin),基于两个表的相等测试,如:

#例2:例2与例1效果相同
select vend_name,prod_name,pro_price
from vendors inner join products
on vendors.vend_id=products.vend_id

子查询并非总是执行复杂SELECT操作的最有效方法,有时利用联结查询更简洁,许多DBMS处理联结比处理子查询更快,所以有时需测试哪种方法更好。

第13课:创建高级联结
在各种联结中,注意表别名的使用。
自联结(self-join):在一条select语句中不止一次引用相同的表。
自然联结(natural join):每个内联结均为自然联结。
外联结(outer join):许多联结将表中行与另外一个表中的行相关联,但有时需包含没有关联行的那些行,具体可分为left join、right join、full join。

自联结(self-join)举例:
Jim Jones需要给同一公司所有顾客发送一封信件。

#子查询
select cust_id,cust_name,cust_contact
from customers
where cust_name=(select cust_name 
				 from customers
				 where cust_contact='Jim Jones')
#自联结
select c1.cust_id,c1.cust_name,c1.cust_contact
from customers c1,customers c2
where c1.cust_name=c2.cust_name
and c2.cust_contact='Jim Jones'

使用带聚集函数的联结举例:
检索所有顾客及每个顾客所下订单数。

select customer.cust_id,
count(order.order_num) num_ord 
from customers left join orders
on customers.cust_id=orders.cust_id
group by customers.cust_id

注意:
1、注意所使用联结的类型;
2、若不提供联结条件,则会出现笛卡尔积。

第15课:插入数据
插入有几种方式:
1、插入完整的行;
2、插入行的一部分;
3、插入某些查询的结果。

具体有以下几种语法操作:
1、插入行数据:

insert into 表名(列名1,列名2...values(value1, value2, ...);
commit;

2、插入select语句:

insert into 表名(列名1,列名2...select * from;
commit;

3、复制表:

#方法1
create table1 as
(select * from2);
#方法2
select * into1 from2;
#存储过程中可用如下方法
select 列名 into 变量 from;

(区别插入和更新:插入是插入新的行,更新是对原有行中数据进行更新)

第16课:更新和删除数据
两种使用update的方式:
1、更新表中的特定行;
2、更新表中的所有行。

update 表名 set(1,2,...)=()
where ...
#例子
update customers
set (cusft_contact,cust_email)=('Sam','[email protected]')
where cust_id='10000000006'

两种使用delete的方式:
1、删除表中特定的行;
2、删除表中所有的行。
delete不需要列名或通配符,是删除整行而不是删除列,要删除指定列,应使用update(更新为NULL值)。

delete from 表名 where ...

要删除所有的行,可使用truncate table语句(清空表),速度更快。

注意:
1、注意where子句的重要性;
2、在update或delete语句使用where子句前,应先用select进行测试,保证它过滤的是正确记录。

第17课:创建和操纵表
一、创建表:

create table1
(列名1 定义1, 列名2 定义2, ...);

二、更新表:

#增加列
alter table1
add 列名1 定义1;
#删除列
alter table1
drop column 列名1;

三、删除表:
该语句将永久删除该表。

drop table1;

表更名使用Rename关键字。

第19课:使用存储过程

create or replace procedure MailingListCount(
ListCount OUT integer    #参数 参数行为 参数类型
)
IS
v_rows integer;   #局部变量
begin    #主体代码
	select count(*) into v_rows
	from customers
	where not cust_email is null;
	ListCount := v_rows;
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章