【數據庫】數據庫知識點梳理

目錄

一、數據庫基礎知識

二、操作語句

創建模式

 創建表

 修改表

 刪除

 約束

索引

 查詢

 查詢條件

 Order by

聚集函數

Group by

 連接查詢

 嵌套查詢


一、數據庫基礎知識

二、操作語句

創建模式

create    schema test0402;

 use    test0402;

 創建表

createtable Course(

Cno    char(4) primary key,

Cname    char(40) ,

Cpno    char(4),

Ccredit    smallint,

foreignkey (Cpno) references Course(Cno));

 

 修改表

Alter table Student add S_entrance datetime;

alter table course add UNIQUE(Cname);

alter table course drop index Cname;

 刪除

Droptable 表名cascade/restrict

Cascade刪除沒有限制,相關依賴全部刪除

Restrict刪除有條件限制,待刪除的表不能有約束(check、foreign key等),不能有視圖、觸發器、存儲過程或者函數等

drop database

truncate tabe tbalename(僅僅刪除表格中的數據)

 約束

 

 

Not  null

建表時添加,create table ###(name_id cahr(52) not null...)

unique

 

(單個列)建表時添加,create table a (列1,類型,列2,類型,...... unique(列1));建表後,alter table a add unique(列2)

(2)多列且命名。建表時,create table a (列1,類型,列2,類型,...... constraint c_person unique(列1,列2) )

建表後,alter table 1 add constraint c_person unique(列1,列2) )

(3)刪除

alter table a drop index c_person

Primary key

(1)CREATE TABLE Persons

(......PRIMARY KEY (Id_P))

(2)CREATE TABLE Orders

(......CONSTRAINT pk_PerOrders PRIMARY KEY (Id_P))

(3)ALTER TABLE Orders

ADD PRIMARY KEY (Id_P)

(4)ALTER TABLE Orders

ADD CONSTRAINT pk_PerOrders

PRIMARY KEY (Id_P)

(5)ALTER TABLE Orders

DROP PRIMARY KEY pk_PerOrders

 

Foreign key 

(1)CREATE TABLE Orders

(....FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))

(2)CREATE TABLE Orders

(......CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P))

(3)ALTER TABLE Orders

ADD FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P)

(4)ALTER TABLE Orders

ADD CONSTRAINT fk_PerOrders

FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P)

(5)ALTER TABLE Orders

DROP FOREIGN KEY fk_PerOrders

check

對特定列進行約束其取值範圍

(1)CREATE TABLE Persons

(

...

CHECK (Id_P>0)

)

(2)ALTER TABLE Persons

ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

(3)ALTER TABLE Persons

DROP CHECK chk_Person

default

插入默認值

(1)CREATE TABLE Persons

(

......,

City varchar(255) DEFAULT 'Sandnes'

)

(2)ALTER TABLE Persons

ALTER City SET DEFAULT 'SANDNES'

(3)ALTER TABLE Persons

ALTER City DROP DEFAULT

 

 

索引

carete index on tbalename(colname)

create unique indec on tablename(colname)

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

alter table tablename drop index indexname

 

 查詢

 

Select[distinct/all(默認all)] 列/列/列 from 表名/視圖名

 [where 條件表達式]

[gruopby 列名[having 條件表達式]]

group by 分組,having 控制分組條件,用COUNT()函數和GROUP BY語句可以統計同一值的記錄條數

[orderby 列名[ASC(默認升序)/desc]]

 

 查詢條件

(1)確定範圍

between下限 and 上限 (兩端都包含)

Notbetween 下限 and 上限

(2)比較大小

=,>,<,<>(不等於),!=,>=,<=,!>(不大於),!<(不小於)

(3)確定集合

In和 not in

(4)字符匹配

notlike/Like <匹配串>[escape<換碼字符串>]

 

% 任意長度的字符串
_ 任意單個字符串
[charlist] 字符列中的任何單一字符
[^charlist]
或者
[!charlist]
不在字符列中的任何單一字符

一個漢字佔兩個字符的位置

***like‘db|_d’escape ‘\

查詢db_d的相關信息,用escape聲明’\’後的只是普通字符,不具有通配符含義

(5)涉及空值的查詢

Select*from sc where  grade is null(is notnull)

(6)     多重條件查詢

And 和or連接多個查詢條件。And優先級較高

(7)where後避免對字段進行函數操作,否則會使字段上的索引失效,全表掃描,降低查詢速度

 Order by

按照查詢結果對多個屬性列排序(升序asc默認/降序desc)

空值,升序在後,降序最先顯示

聚集函數

注意:where 後不可以跟聚集函數作爲條件表達式

除了count(*),其他都跳過空值不處理

count([distinct|all] *)

統計元組個數

count([distinct|all]  列名)

統計一列中值得個數

Sum([distinct|all]  列名)

求和(數值型)

AVG([distinct|all]  列名)

求平均(數值型)

max([distinct|all]  列名)

最大值

min([distinct|all]  列名)

最小值

 

 

 

 

 

 

 

 

Group by

將查詢結果按一列或多列的值分組,值相等的爲一組

分組後,聚集函數將作用於每一組。否則,作用於整個查詢結果

Where 和 having的區別:

Where作用於基本表或者視圖,選擇滿足條件的元組;

Having 作用於組,選擇滿足條件的組

 連接查詢

等值與非等值

等值 =

非等值 不是=

自身連接

自己和自己

外連接

左外連接(列出左邊全部,右邊缺失的填補null)

Left outer join

右外連接(列出右邊全部,左邊缺失的填補null)

Right outer join

複合連接

Where後面跟多個連接條件

 嵌套查詢

(1)上層/下層子查詢

上層查詢:父查詢或者外層查詢

下層查詢:子查詢或者內層查詢

子查詢中不能使用order by,order by只能對最終查詢結果排序

有些嵌套查詢可以用連接運算替代

(2)相關/不相關子查詢

不相關子查詢:子查詢的查詢條件不依賴與父查詢(一下子將子查詢求解出來)

相關子查詢:子查詢的查詢條件依賴於父查詢(反覆求值,先取父查詢中的一個元組,遍歷內層查詢,再從外層查詢中取出一個元組,遍歷內層查詢。。。)

(3)帶有any/some/all的子查詢:

子查詢跟在比較運算符之後,只有返回的是單值的時候可以用比較運算符

返回多值時,要用any(有些用some)或者all,且和比較運算符搭配使用

 

 

(4)帶有exists的子查詢

返回true或者false,只關心內層操作是否有返回值

(5)in和exists  

in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。一直以來認爲exists比in效率高的說法是不準確的。  

如果查詢的兩個表大小相當,那麼用in和exists差別不大。  

如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in: 

如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。  not in 邏輯上不完全等同於not exists,如果你誤用了not in,小心你的程序存在致命的BUG: 

 (6)集合查詢

Uninon 並集 uninon all 並集,保留重複值

Intersect 交集

Except 差操作

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