這篇文章為大家帶來了關於資料庫語言SQL的相關知識,主要介紹了SQL指令、表格處理以及SQL進階技巧的相關問題,希望對大家有幫助。
推薦學習:mysql影片教學
SQL指令是指SQL如何被用來儲存,讀取和處理資料庫之中的表格資料。
常見的SQL指令有以下這些:
(1)作用:將資料從資料庫的表格中選出。能夠讀取表格中一個或數個欄位的所有資料。
什麼是表格?表格是資料庫內的結構,目的是儲存資料。
1.2 DISTINCT:區分(選擇)
(1)作用:處理資料時,需要找出表格內不同的資料值,也就是要知道列中有哪些不同的值,而不關心每個值出現的次數。此時用distinct。
1.3 WHERE:帶查詢條件
(1)作用:當需要有條件的進行選擇性查詢一些資料時,用到where
1.4 AND OR:與,或(連接條件)
(1)作用:where的複雜條件是由兩個或多個簡單條件透過and或or連接而成的。一個SQL語句中可以有無限多個簡單條件的存在。
(2)語句:select 列名from 表名where 簡單條件1 and|or 簡單條件2...
#(1)作用:in子句,通常跟where搭配使用,表示條件在一個不連續的範圍內取值
(2)語句: select 列名from 表名where 列名作為條件in (值1,值2,值3...) exists
1.6 BETWEEN:在連續範圍內取值(跟where配合)
(1)作用:in指令是在一個或數個不連續的值的限制內取得資料庫中的值,而between是在一個連續的範圍內取得資料庫中的值。通常也跟where搭配使用。
(2)語句: select 列名from 表名where 列名between 值1 and 值2
1.7 LIKE:帶查找模式(跟where配合)
(2)語句:
select 列名from 表名where 列名like {模式}(3 ){模式}:
#########例如A_B表示A開頭B結尾中間只能有一個字符,ABC%表示ABC開頭的字串,�C表示ABC結尾的字串,� C%表示所含有ABC這個模式的字串。 ###############1.8 ORDER BY:排序###############(1)作用:將取得的資料做一個有系統的顯示,即排序顯示,正序或逆序。 ############(2)語句:### select 列名 from 表名 where 條件 order by 列名[ASC, DESC]#########(3)[ ]表示可選,不是必選的。 ASC表示從小到大,DESC反之。預設用ASC。
(4)注意:如果存在where,那麼where需要在order by子句的前面。
(5)補充:可以同時對幾個列名進行排序。 order by 列名1[ASC, DESC], 列名2[ASC,DESC]。如果兩個欄位都選擇從小到大排序,那麼這個子句的結果是:依照列名1從小到大排。若有好幾個查詢結果的列名1相等,那這幾個結果就依照列名2從小到大排,以此類推。
(1)作用:資料庫中很多內容都是以數字的形式存在,對這些數字做運算時,可以透過一些定義好的函數來直接運作。
(2)常用函數:
#AVG:平均值
#COUNT:計數
#MAX:最大值
MIN:最小值
SUM:總和
(3)語句: select 函數名稱(列名)from 表名
#( 1)作用:計數,數出在表格中找到的符合條件的條目一共有幾個。
(2)語句: select count(列名) from 表名
(3)注意:count經常和distinct一起使用,目的是找出表格中有多少個不同的項目。
(1)作用:當我們選不只一個列名且其中至少一個列名有包含函數的運用時,就需要用到group by指令。在這種情況下,需要確定我們有group by所有其他的列名。即:除了有包含函數的列名外,都需要將其放在group by的子句中。
(2)語句: #select 列名1 sum(列名2) from 表名group by 列名1
#(1)作用:對函數產生的值來設定條件。 having子句是在一個SQL句子的最後。
一個含有having子句的SQL不一定要包含group by子句。
(2)語句: select 列名1,sum(列名2) from 表名group by 列名1 having(函數條件)
(3)注意:如果被select的只有函數欄,那就不需要group by子句。
(1)作用:給表格和列起別名。
列名的別名:是為了讓SQL產生的結果易讀。
表格的別名:只要from子句中的表格名稱後面空一格,然後再列出要用的表格別名即可。
即:這兩個別名,都放在要取代的表名或列名的後面,跟表名或列名用空格分開。
(2)語句: select 表別名.列名1 列名1 列別名 from 表名表別名
(3)注意:列別名不但可以直接放在列名後面,也可以放在函數後,例如...sum(列名) 列別名...
(1)作用:透過兩個表中相同的列,將兩個表連起來。
where子句在表格連結中扮演了重要的角色。
如果where使用有誤,很可能得到一個笛卡爾連接(所得兩個表格每兩行之間所有可能的組合)。
#(1)作用:
我們常說的左連結也就是內部連結。在內部連結的情況下,需要兩個表格內都有相同的數值,那一筆資料才會被選取。
如果要列出一個表格中每一筆的資料,無論它的值在另一個表中有沒有出現。此時,就需要外部連線:SQL OUTER JOIN。
(2)語句: 外部連結的語法是依資料庫的不同而不同。例如,在Oracle中,where子句中要選出所有資料的那個表格後加上 ( )來表示這個表格中的所有資料我們都需要。
(3)注意:當第二個表格沒有相對的資料時,SQL會傳回NULL。
(1)作用:由不同列名獲得的結果串連起來。每個資料庫提供的方法可能有所不同:
MySQL:CONCAT()
Oracle:CONCAT(), ||
SQL Server:
(2)語句: concat(字元1,字元2,字元3...)
表示將字元1,字元2,字元3串連起來。
(3)注意:Oracle的concat()只允許兩個參數;即一次只能串起兩個字串。但是可以用||來一次串連其多個字串。
(1)作用:SQL中的substring函數,是用來取得一個列資料中的其中一部分。
在不同的資料庫中,這個函數名稱不一樣:
#MySQL: substr(), substring()
#Oracle: substr()
SQL Server: substring()
#(2)語句: substr(str, pos)表示選出從第pos位置開始字元。此語法不適用於SQL Server上。
sub(str, pos, len)表示從str的pos位置開始,選出len長度的字串。
(1)作用:trim ()函數用來移除字串中的字頭或字尾。最常用的是移除字頭或字尾的空白。
在不同的資料庫中,該方法不同:
#MySQL:trim(), rtrim(), ltrim()
Oracle:rtrim(), ltrim()
#SQL Server:rtrim(), ltrim()
#(2)語句: trim([[位置] [要移除的字串] 從] 字串)
(3) 注意:如果沒有列出要移除的字串是什麼的話,就會移除空白(如果有的話)。
表格處理指令,是指如何使用SQL來處理資料庫中的各個表格,增刪改查等。
(1)作用:在資料庫中建立表格
(2)語句:
#create table 表格名稱
############################# ( 列名1 屬性,############列名2 屬性,############列名3 屬性);######
#(1)作用:用來指定哪些資料可以存入表格中,或之後借由alter table語句來指定。
(2)常見的限制有:
#not null
unique
check
主鍵(primary key)
外來鍵(Foreign key)
(1)作用:在沒有做出任何限制的情況下,一個列的值是允許有null值的。如果不允許一個列的值含有null,那就需要對那個列做not null的指定。
(2)語句:
#create table 表名
(列名1 屬性not null,
列名2 屬性not null,
列名3 屬性);
(1)作用:保證一個欄位中的值都是不一樣的。
(2)語句:
#create table 表名
(列名1 屬性not null unique,
列名2 屬性not null,
列名3 屬性);
(3)注意:一個被指定為主鍵的列,一定會含有unique特性。但一個unique欄位不一定是主鍵。
#(1)作用:保證一個欄位中的所有值都符合某些條件。
(2)語句:
#create table 表名
(列名1 屬性check(列名1>10) not null unique,
列名2 屬性not null,
#列名3 屬性);
(3)注意:check限制尚未執行於MySQL資料庫上。
(1)作用:主鍵(primary key )中的每一個值都是表格中的唯一值。
即,它是用來獨一無二地確認一個表格中的每一行值。
主鍵可以是原本資料內的一個欄位或是一個人造列(和原本的值沒有關係的列位)。
主鍵可以包含一個或多個列位。當主鍵包含多個列位時,稱為組合鍵(composite key)。
(2)語句:
#MySQL中:
create table 表名
(列名1 屬性check(列名1>10) not null unique,
列名2 屬性not null,
列名3 屬性,
#primary key(列名1));
Oracle中:
create table 表名
(列名1 屬性check(列名1>10) not null unique primary key,
列名2 屬性not null,
#列名3 屬性);
SQL Server中:
create table 表名
########## ####(列名1 屬性check(列名1>10) not null unique primary key,############列名2 屬性not null,######## ####列名3 屬性);#######
(3)如何透過改變現有表格架構來設定主鍵的方式:
#MySQL: alter table 表名add primary key (列名2)
Oracle: alter table 表名add primary key(列名2)
SQL Server: alter table 表名add primary key(列名2)
(4)注意:在用alter語句加入主鍵之前,需要確認被用當做主鍵的列是否設定為not null。即,主鍵列一定要 not null。
(1)作用:外來鍵是一個或數個指向另外一個表格主鍵的欄位。
外來鍵的目的是確定值的參考完整性(referential integrity)。即只有被準許的值才會存入資料庫。
(2)語句:
#MySQL中:
create table 表名1
(列名1 屬性check(列名1>10) not null unique,
列名2 屬性not null,
列名3 屬性,
#primary key(列名1)
foreign key(列名2) references 表名2(主鍵列));
Oracle:
##create table 表名1
(列名1 屬性check(列名1>10) not null unique primary key,
#列名2 屬性not null,
列名3 屬性references 表名2(主鍵列)
);
SQL Server中:
create table 表名1
(列名1 屬性check(列名1>10) not null unique primary key,
列名2 屬性not null,
列名3 屬性references表名2(主鍵列)
);
(3)如何透過改變現有表格架構來設定外鍵的方式:
#MySQL: alter table 表名1 add foreign key(列名2) references 表名2(列名2)
Oracle: alter table表名1 add(constraint xxx) foreign key(列名2) references 表名2(列名2)
SQL Server: alter table 表名1 add foreign key(列名2) references 表名2(列名2)
# (1)作用:視圖表可以被當作虛擬表格。與常規的表格不同的是,表格中有實際儲存資料,但視圖是建立在表格之上的一個架構,它本身不實際儲存資料。
(2)語句: create view 檢視名稱as SQL語句;
其中,SQL語句可以類似: select 列名from 表名;
(3)注意:可以用視圖來連接兩個表格。在這種情況下,使用者就可以直接由一個視圖表中找出需要的信息,而不需要從兩個不同的表格中去先做連接動作再查找。
(1)作用:
索引可以幫助我們從表格中快速的找到所需的資料。
如果一個表格沒有索引,資料庫系統需要將整個報個的資料讀出,這個過程叫做table scan。
如有適當的索引存在,資料庫系統就可以先由這個索引去找出需要的資料是在表格中的什麼位置,然後直接去該位置取得資料,加快了獲取資料的速度。
索引是有利於系統效率的事情。一個索引可以涵蓋一個或多個欄位。 ######
(2)語句: create index 索引名on 表名(列名1, 列名2);
(1)作用:表格建立後,有時需要改變表格的結構。例如,加一列,刪一列,改變列名稱,改變列的屬性等等。
(2)語句: alter 表格名列名[改變方式]
[改變方式]常見的有:
加一列:add 欄位名稱2 屬性
刪除一列:drop 欄位名稱2
#改變列名稱:change 舊列名新列名新屬性
#改變列的屬性:modify 列名2 新屬性
#(1)作用:從資料庫中清除一個表格(刪除表格)
(2)語句: drop table 資料表名稱
(1)作用:清除一個表格中的所有資料(不刪表格)
(2)語句: truncate table表名
(1)作用:將資料輸入表中。
(2)語句:
#insert into 表名(列1,列2...)values (值1,值2...)
insert into 表名1(列1,列2...)select 列名3,列名4 from 表名2
##(1)作用:修改表格中的資料。
(2)語句: update 資料表名set 欄位名稱1=新值where 條件
(1)作用:在某些情況下,需要直接由資料庫中移除一些資料。 (刪除的是一行或多行)
(2)語句:delete from 表名where 條件
如何使用SQL來執行一些較為複雜的運算,以及如何用SQL來做這些操作:
排名rank
中位數median
#累積總計running total
##總和百分比percent to total累積總和百分比cumulative percent to total
union的一個限制是兩個SQL語句所產生的欄位需要是相同的屬性型別。
另外,
##當使用union時,我們只會看到不同的資料值,即結果值不重複,類似select distinct 。 (2)語句:
#SQL
語句1
#union
############SQL #######語句2###############(3)請注意:如果我們在任何一個SQL語句(或兩句都一起)用select disinct 列名,那很可能會得到完全一樣的結果。 ######(1)作用:目的也是要將兩個SQL語句的結果合併在一起。
不同的是,union all會將每一筆符合條件的資料列出來,無論資料值有無重複。結果值可重複。
(2)語句:
#SQL 語句1
# union all
SQL 語句2
(1)作用:與union類似,intersect也是對兩個SQL語句所產生的結果做處理。
不同的是,union基本上就是一個OR,而intersect則比較像AND。即union是聯集,intersect是並集。
(2)語句:
#SQL 語句1
# intersect
SQL 語句2
#(3)注意:intersect指令,不同的值只會被列出一次。
#(1)作用:
mius是指運用在兩個SQL語句上。
先找出第一個SQL語句所產生的結果,然後看這些結果有沒有在第二個SQL語句的結果中。如果有,那這第一筆資料就被移除,而不會在最後的結果中出現。
如果第二個SQL語句所產生的結果並沒有存在於第一個SQL所產生的結果內,那麼這筆資料也會被拋棄。
(類似減法?最後只剩下第一個SQL語句中那些只在第一個SQL語句中出現而不會在第二個SQL語句中出現的項)
(2)語句:
#SQL 語句1
minus
SQL 語句2
(3)注意:minus指令,不同的值只會被列出一次。
#(1)作用:subquery,在一個SQL語句中放入另一個SQL語句。
當我們在where子句或having子句中插入另一個sql語句時,我們就有一個子查詢。
子查詢的作用,第一,可以用來連接表格。第二,有時子查詢是唯一能夠連接兩個表格的方式。
(2)語句:
#select 列名1 from 表名1 where 列名2 [比較運算素] ( select 列名2 from 表名2 where 條件)
#其中,[比較運算素]可以是相等的運算素(=, >=, >, < ;=, <),也可以是對文字的運算素(LIKE)。
#(1)作用:在前面我們用in,>, <, =等來連接內查詢和外查詢。 exists也是其中一個方式。
基本上,exists是用來測試內查詢有沒有產生任何結果。
如果有,系統就會執行外查詢中的SQL。若沒有,整個SQL語句就不會產生任何結果。
(2)語句: select 列名1 from 表名1 where exists (select 列名2 from 表名2 where 條件)
(1)作用:case用來當if- then-else之類邏輯的關鍵字。
(2)語句:
#select case(列名)
##############################################################################when 條件1 then 結果1
when 條件2 then 結果2
...
[else 結果n]
end
from 資料表名稱
(3)補充:條件可以是一個數值或一個公式。 else子句不是必須的。
推薦學習:mysql影片教學
#以上是一起聊聊SQL指令、表格處理以及SQL進階知識點總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!