SQL學習筆記(更新中)

一、數據定義

1、定義模式

模式相當於一個數據空間,目錄,沒有具體內容

把一個模式授權給一個用戶

create schema <模式名> authorization <用戶名>

如果模式名爲空則模式名隱含爲用戶名

刪除模式

drop schema <模式名> <cascade(刪除所有數據庫對象)/restrict(只有在該模式下沒有對象時執行刪除)>

2、基本表的定義

create table <表名>
(<列名><數據類型>[<列級完整性約束條件>]
[,<列名><數據類型>[<列級完整性約束條件>]]
[,<表級完整性約束條件>]
);

列級完整性約束:primary key , unique
表級完整性約束:foreign key (列) references 表(列),primary key(列1,列2),unique(列)

模式與表,每個表屬於一個模式
方法一:create table <模式名>.<表名>(…);
方法二:創建模式時同時創建表
方法三:set search_path to <模式名>,<表名>;

3、修改基本表

alter table <表名> 操作;
操作 語句
新加列 add <新列名><數據類型>[完整性約束]
加表級完整性約束 add<表級完整性約束>
刪除列 drop <列名> [cascade(刪除引用該列的其他對象)
刪除完整性約束 drop constraint <完整性約束> [cascade
修改列 alter column <列名><數據類型>

刪除基本表

drop table <表名> [restrict|cascade];

4、索引

加快查詢速度
B+樹索引,Hash散列索引

create [unqiue每個索引值只對應唯一的數據記錄][cluster聚簇索引] index <索引名> on <表名>([<列名><次序asc/desc>])

刪除索引

drop index <索引名>;

二、數據查詢

1、單表查詢

語句 含義
select 指定要顯示的屬性列
from 指定查詢對象(基本表或視圖)
where 指定查詢條件
group by 對查詢結果按指定列的值分組,該屬性列值相同的分爲一組。通常在每組中作用聚集函數
having 只有滿足指定條件的組才予以輸出
order by 對查詢結果表按指定列的值的升序或降序排序

(1)選擇表中若干列

在table中查詢指定列aaa,bbb,ccc

select aaa,bbb,ccc
from table;

在table中查詢全部列

select *
from table;

虛列
select子句的目標列表達式不僅可以是屬性,也可以是表達式。也可以加入常量值作爲新的列。
列別名
在屬性後空格加別名可以改變查詢結果的列標題

select 屬性名1 別名1,屬性名2 別名2
from table;

(2)選擇表中若干元組

去重
在屬性前加distinct去掉重複行

select distinct a
from table;

常用查詢條件

查詢條件 謂詞
比較 =,<,>,<=,>=,!=,<>,!>,!<,NOT+上述比較運算符
確定範圍 between and ,not between and
確定集合 in, not in <值表>(a,b,c)
字符匹配 like ,not like ‘匹配串’
空值 is null, is not null
多重條件 and,or,not(and優先級高於or)
select x
from table 
where 條件語句;

關於匹配串
可以是完整字符串,或者含有%(任意長度字符串)和_(任意單個字符)
匹配串中如果有通配符則需要轉義 ‘_’ escape ‘’

(3)order by子句

可按一個或多個屬性列排序
對於控制顯示次序由具體系統實現決定
升序:asc;降序:desc;缺省值爲升序
多個屬性按出現順序作爲優先級排序

select x
from table
order by a,b asc(desc); 

(4)聚集函數

語句 含義
count(*) 統計元組個數
count([distinct/all] <列名>) 統計一列中值的個數
sum([distinct/all] <列名>) 計算一列值的和(必須爲數值類型)
avg([distinct/all] <列名>) 計算一列值的平均值(必須爲數值類型)
max/min([distinct/all] <列名>) 求最大值/最小值

(5)group by 子句

細化聚集函數,按指定列或多列值相等的分爲一組
若沒有分組,聚集函數作用於整個聚集函數
分組後作用於每個組

(6)having

條件語句
與where不同的地方在於,having作用於組,where作用於記錄元組

聚集函數在條件語句中只能用having

select a
from table
group by a
having count(*)>1;

2、連接查詢

一般格式:
[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>

(1)等值與非等值連接

運算符爲"="

select table1.*,table2.*
from table1,table2
where table1.a=table2.b

自然連接可以通過select中去掉重複字段來實現
where可以同時支持連接和選擇

(2)自身連接

通過別名來實現區分

select tablea.a,tableb.b
from table tablea,table tableb
where tablea.c=tableb.d

tablea和tableb是表table的別名

(3)外連接

select x
from tablea left/right out join tableb on
	(tablea.x=tableb.x);

左外連接左表保留右表爲null
右外連接右表保留左表爲null

(4)多表連接

通過and連接連接條件

3、嵌套查詢

將一個查詢嵌套在另一個查詢中的查詢稱爲嵌套查詢
不相關查詢子查詢和父查詢屬性不相關
相關查詢可用別名加條件

(1)in謂詞

select a	/*父查詢*/
from table1
where b in
		(select b	/*子查詢*/
		from table2
		where ...
		);

一般可以通過連接查詢實現

(2)比較運算符

確切知道內層查詢返回單值使用比較運算符

(3)帶有any或all

any和all的對象爲某個查詢結果,表示其中任意一個值或者全部值

any和all必須與比較運算符同時使用
any和all運算符等價於min和max聚集函數的某種形式

(4)帶有exists

exist對象爲查詢結果,表示這個查詢結果是否爲空,返回真值
內存查詢非空返回真值
內存查詢爲空返回假值
子查詢目標列表達式通常用*,因爲給出列名沒有意義
一般用於相關查詢

所有其他子查詢都能用exists謂詞的子查詢等價替換

4、集合查詢

種類 代碼
union
intersect
except

參加操作的各查詢結果列數必須相同,對應數據類型也必須相同

查詢塊1
操作
查詢塊2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章