數(shù)據(jù)庫(kù) 筆記

一、數(shù)據(jù)庫(kù)的一些概念

數(shù)據(jù)庫(kù)的概念:

數(shù)據(jù)庫(kù)指的是以一定方式儲(chǔ)存在一起、能為多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。

數(shù)據(jù)庫(kù)管理系統(tǒng):

數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management System,簡(jiǎn)稱DBMS)是為管理數(shù)據(jù)庫(kù)而設(shè)計(jì)的電腦軟件系統(tǒng),一般具有存儲(chǔ)、截取、安全保障、備份等基礎(chǔ)功能。例如:MySQL就是一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)。

關(guān)系數(shù)據(jù)庫(kù):

所謂的關(guān)系型數(shù)據(jù)庫(kù),是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫(kù),借助于集合代數(shù)等數(shù)學(xué)概念和方法來(lái)處理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的特點(diǎn):

  • 數(shù)據(jù)以表格的形式出現(xiàn);
  • 每行為各種記錄名稱;
  • 每列為記錄名稱所對(duì)應(yīng)的數(shù)據(jù)域;
  • 許多的行和列組成一張表單;
  • 若干的表單組成 database;

關(guān)系模型的結(jié)構(gòu)的一些概念:

表的結(jié)構(gòu)

  • 關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)單一,采用二維表結(jié)構(gòu)來(lái)表示實(shí)體和實(shí)體之間的關(guān)系,是一種按行與列排列的具有相關(guān)信息的邏輯組。一個(gè)關(guān)系對(duì)應(yīng)一個(gè)二維表。一個(gè)數(shù)據(jù)庫(kù)可以包含任意多個(gè)數(shù)據(jù)表。

  • 屬性

    表中每一列(也稱字段、數(shù)據(jù)項(xiàng))描述實(shí)體集的某個(gè)特征,在關(guān)系數(shù)據(jù)庫(kù)中被稱為屬性;每一個(gè)屬性都有自己的取值范圍,稱為域。

  • 元組

    表中的每一行由一個(gè)實(shí)體的相關(guān)屬性取值構(gòu)成,稱為元組,它相對(duì)完整地描述了一個(gè)實(shí)體。一個(gè)元組在關(guān)系數(shù)據(jù)庫(kù)中也被稱為一條記錄。元組的一個(gè)屬性值稱為分量。

關(guān)鍵字

在一個(gè)關(guān)系模式中,關(guān)鍵字是保證表中記錄具有唯一性的一種機(jī)制。

  • 候選關(guān)鍵字

    關(guān)系表中按應(yīng)用語(yǔ)義能唯一標(biāo)志元組的最小屬性的集合。在最簡(jiǎn)單的情況下,候選關(guān)鍵字只包含一個(gè)屬性。在最極端的情況下,關(guān)系模式的所有屬性組是這個(gè)關(guān)系模式的候選關(guān)鍵字,稱為全碼。

  • 主關(guān)鍵字(主鍵)

    用戶指定的用來(lái)在關(guān)系表中唯一標(biāo)識(shí)元組的一個(gè)候選關(guān)鍵字。若一個(gè)關(guān)系有多個(gè)候選關(guān)鍵字,則只選定其中的一個(gè)為主關(guān)鍵字。主關(guān)鍵字的值不能為空、不能重復(fù)。

  • 外關(guān)鍵字 (外鍵)

    一個(gè)表中的主關(guān)鍵字與另一個(gè)表中與該主關(guān)鍵字相同的屬性建立聯(lián)系,這個(gè)起到聯(lián)系作用的屬性,稱為另一個(gè)表的外關(guān)鍵字,簡(jiǎn)稱外鍵。

關(guān)系模式

表中的行定義(即表頭)是實(shí)體集相關(guān)屬性的集合,稱為該表的關(guān)系模式。關(guān)系模式就是對(duì)關(guān)系的描述,包括關(guān)系名、組成該關(guān)系的屬性名、屬性向域的映像。

關(guān)系模式通常記為:(屬性名1,屬性名2,…屬性名n),其中主關(guān)鍵字加下劃線。

二、關(guān)系數(shù)據(jù)庫(kù)的基本操作

關(guān)系數(shù)據(jù)庫(kù)的基本操作包括:查、增、刪、改。這些操作,我們可以通過(guò)一種語(yǔ)言去執(zhí)行,這種語(yǔ)言就是 SQL (Structured Query Language),即結(jié)構(gòu)化查詢語(yǔ)言。

SQL

SQL 是一門 ANSI 的標(biāo)準(zhǔn)計(jì)算機(jī)語(yǔ)言,用來(lái)訪問(wèn)和操作數(shù)據(jù)庫(kù)系統(tǒng)。SQL 語(yǔ)句用于取回和更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。

數(shù)據(jù)操作語(yǔ)言 (DML)

SQL (結(jié)構(gòu)化查詢語(yǔ)言)是用于執(zhí)行查詢的語(yǔ)法。但是 SQL 語(yǔ)言也包含用于更新、插入和刪除記錄的語(yǔ)法。查詢和更新指令構(gòu)成了 SQL 的 DML 部分:

  • SELECT - 從數(shù)據(jù)庫(kù)表中獲取數(shù)據(jù)
  • UPDATE - 更新數(shù)據(jù)庫(kù)表中的數(shù)據(jù)
  • DELETE - 從數(shù)據(jù)庫(kù)表中刪除數(shù)據(jù)
  • INSERT INTO - 向數(shù)據(jù)庫(kù)表中插入數(shù)據(jù)

數(shù)據(jù)定義語(yǔ)言 (DDL)

SQL 的數(shù)據(jù)定義語(yǔ)言 (DDL) 部分使我們有能力創(chuàng)建或刪除表格。我們也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。SQL 中最重要的 DDL 語(yǔ)句:

  • CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫(kù)
  • ALTER DATABASE - 修改數(shù)據(jù)庫(kù)
  • CREATE TABLE - 創(chuàng)建新表
  • ALTER TABLE - 變更(改變)數(shù)據(jù)庫(kù)表
  • DROP TABLE - 刪除表
  • CREATE INDEX - 創(chuàng)建索引(搜索鍵)
  • DROP INDEX - 刪除索引

SQL指令

SELECT

SELECT 最常用的方式是將數(shù)據(jù)從數(shù)據(jù)庫(kù)中的表中選出,即從 (FROM) 數(shù)據(jù)庫(kù)中的表中選出 (SELECT)。(表格是一個(gè)數(shù)據(jù)庫(kù)內(nèi)的結(jié)構(gòu),它的目的是儲(chǔ)存數(shù)據(jù)。)一個(gè)最基本的 SQL 架構(gòu)如下所示:

SELECT “列名” FROM “表名稱”

例如:

SELECT Name FROM city;

上述語(yǔ)句,會(huì)返回表 city 中的 Name 這一列的全部值。

DISTINCT

SELECT 指令讓我們能夠讀取表中一個(gè)或數(shù)個(gè)列的所有數(shù)據(jù),得到的數(shù)據(jù)的值可能會(huì)有重復(fù)。當(dāng)我們需要找出表中的某列數(shù)據(jù)有哪些不同的值時(shí),只要在 SELECT 后加上一個(gè) DISTINCT 就可以了。也就是說(shuō) SELECT 會(huì)將符合條件的數(shù)據(jù)全都選出來(lái),而 DISTINCT 會(huì)選擇出這個(gè)表的列中那些 不同的值。即使每個(gè)值的出現(xiàn)多次,使用 DISTINCT 后會(huì)返回唯一不同的值。在 SQL 中,使用 DISTINCT 的語(yǔ)法如下:

SELECT DISTINCT “列名” FROM “表名稱”

例如:

SELECT DISTINCT Language FROM countrylanguage;

上述語(yǔ)句,會(huì)返回表 countrylanguage 中的屬性 Language 這一列在表中的不同的值。

WHERE

當(dāng)我們需要選擇性地從表中選取數(shù)據(jù)時(shí),就需要用到 WHERE 這個(gè)指令。使用 WHERE 指令的語(yǔ)法如下:

SELECT “列名稱” FROM “表名稱” WHERE “條件”(列 運(yùn)算符 值)

例如:

SELECT CountryCode FROM countrylanguage WHERE Language = "English";

上述語(yǔ)句,會(huì)返回表 countrylanguage 中 Language 的值為 Enlish 的 CountryCode 的列。

AND OR

上面的指令都是基于一個(gè)條件對(duì)數(shù)據(jù)進(jìn)行選擇,當(dāng)我們想通過(guò)復(fù)雜條件選擇數(shù)據(jù)時(shí),可以將多個(gè)簡(jiǎn)單條件連接成復(fù)雜條件。拿 WHERE 來(lái)說(shuō),AND 和 OR 可在 WHERE 子語(yǔ)句中把兩個(gè)或多個(gè)條件結(jié)合起來(lái)。如果第一個(gè)條件和第二個(gè)條件都成立,則 AND 運(yùn)算符顯示一條記錄。如果第一個(gè)條件和第二個(gè)條件中只要有一個(gè)成立,則 OR 運(yùn)算符顯示一條記錄。使用 AND OR 指令的語(yǔ)法如下:

SELECT “列名” FROM “表名稱” WHERE “簡(jiǎn)單條件” {[AND|OR] “簡(jiǎn)單條件”}+

例如:

SELECT CountryCode FROM countrylanguage WHERE Language = English AND IsOfficial = "T";

上述語(yǔ)句,會(huì)返回表 countrylanguage 中 Language 的值為 Enlish 且 IsOfficial 為 T 的列。

IN

IN 這個(gè)指令允許我們?cè)?WHERE 子句中規(guī)定多個(gè)值。IN 指令的語(yǔ)法為下:

SELECT “欄位名” FROM “表名稱” WHERE “列名” IN (‘值一’, ‘值二’, …)

例如:

SELECT CountryCode FROM countrylanguage WHERE Language IN ("Enlish","French");

上述命令,會(huì)返回表 countrylanguage 中 Language 的值滿足條件在 Enlish 和 French 這兩個(gè)值中的列。

BETWEEN

BETWEEN 操作符在 WHERE 子句中使用,經(jīng)常和 AND 連用。使用 BETWEEN … AND 選取介于兩個(gè)值之間的數(shù)據(jù)范圍。這些值可以是數(shù)值、文本或者日期。。BETWEEN 這個(gè)子句的語(yǔ)法如下:

SELECT “列名” FROM “表名稱” WHERE “列名” BETWEEN ‘值一’ AND ‘值二’

例如:

SELECT CountryCode FROM countrylanguage WHERE Percentage BETWEEN "10.0" AND "35.0";

上述語(yǔ)句,會(huì)返回表 countrylanguage 中 Percentage 值在 10.0 到 35.0 之間的列。

LIKE

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式(pattern)。對(duì)比之下,在使用 IN 指令的時(shí)候,我們完全地知道我們需要的
條件;在使用 BETWEEN 指令的時(shí)候,我們則是列出一個(gè)范圍。使用 LIKE 指令的語(yǔ)法如下:

SELECT “列名” FROM “表名稱” WHERE “列名” LIKE {模式}

例如:

SELECT CountryCode FROM countrylanguage WHERE CountryCode LIKE "%A%";

上述語(yǔ)句,會(huì)返回表 countrylanguage 中 CountryCode 以A開(kāi)頭的列。LIKE 后的模式,通常是一個(gè)通配符。

ORDER BY

ORDER BY 語(yǔ)句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序,默認(rèn)按照升序(ASC)對(duì)記錄進(jìn)行排序。如果希望按照降序?qū)τ涗涍M(jìn)行排序,可以使用 DESC 關(guān)鍵字。ORDER BY 的語(yǔ)法如下:

SELECT “列名” FROM “表名稱” [WHERE “條件”] ORDER BY “列名” [ASC, DESC]

例如:

SELECT CountryCode,Percentage FROM countrylanguage WHERE Percentage BETWEEN "25.0" AND "55.0" ORDER BY Percentage DESC;

上述語(yǔ)句,會(huì)返回表 countrylanguage 中包含 CountryCode 和 Percentage 的列,這些列按照 Percentage 的值降序排列,且滿足 Percentage 值介于25.0和55.0之間。

函數(shù)

除了對(duì)數(shù)據(jù)的查詢,我們有的時(shí)候可能會(huì)想對(duì)這些數(shù)據(jù)做一些運(yùn)算,比如將它們總合起來(lái),或是找出它們的平均值,而SQL 有提供一些這一類的函數(shù)。

  • AVG (平均)
  • COUNT (計(jì)數(shù))
  • MAX (最大值)
  • MIN (最小值)
  • SUM (總合)

使用函數(shù)的語(yǔ)法是:

SELECT “函數(shù)名”(“列名”) FROM “表名稱”

例一:

SELECT SUM(Population) FROM city WHERE CountryCode = "AFG";

上述語(yǔ)句,會(huì)返回表 city 中 CountryCode 等于 AFG 的 Population 總合。

例二:

SELECT COUNT(CountryCode) FROM city WHERE CountryCode = "NLD";

上述語(yǔ)句,會(huì)返回表 city 中 CountryCode 等于 NLD 的個(gè)數(shù)。

例三:

SELECT COUNT(DISTINCT CountryCode) FROM city WHERE CountryCode IS NOT NULL;

上述語(yǔ)句,會(huì)返回表 city 中 CountryCode 的個(gè)數(shù)。COUNT 和 DISTINCT 經(jīng)常被合起來(lái)使用,目的是找出表中某列有多少不同的數(shù)值。

例四:

SELECT AVG(Population) FROM city WHERE CountryCode = "DZA";

上述語(yǔ)句,會(huì)返回表 city 中 CountryCode 等于 DZA 的Population 的平均值。

GROUP BY

GROUP BY 語(yǔ)句用于結(jié)合合計(jì)函數(shù) (比如 SUM),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。使用 GROUP BY 的語(yǔ)法為:

SELECT “列名1”, SUM(“列名2”) FROM “表名稱” GROUP BY “列名1”

例如:

SELECT CountryCode,SUM(Population) FROM city GROUP BY CountryCode;

上述語(yǔ)句,會(huì)返回表 city 中 每個(gè) CountryCode 對(duì)應(yīng)的總?cè)藬?shù),結(jié)果按照 CountryCode 進(jìn)行分組。

HAVING

當(dāng)我們想對(duì)函數(shù)產(chǎn)生的值來(lái)設(shè)定條件時(shí),比如我們想知道那個(gè) CountryCode 的總?cè)藬?shù)超過(guò)10000000,在這個(gè)情況下,我們不能使用 WHERE 的指令。這時(shí),我們可以使用 HAVING 的指令,來(lái)達(dá)到這個(gè)目標(biāo)。 需要注意的是 HAVING 子句通常是在一個(gè) SQL 句子的最后;而且,一個(gè)含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。使用 HAVING 的語(yǔ)法如下:

SELECT “列名1”, SUM(“列名2”) FROM “表名稱” GROUP BY “列名1” HAVING (函數(shù)條件)

例如:

SELECT CountryCode,SUM(Population) FROM city GROUP BY CountryCode HAVING SUM(Population) > "10000000";

上述語(yǔ)句,會(huì)返回表 city 中 Population 總數(shù)大于10000000的結(jié)果,結(jié)果按照 CountryCode 進(jìn)行分組。

ALIAS

在 SQL 語(yǔ)言中,可以通過(guò) ALIAS 為列名稱和表名稱指定別名。最常用到的別名有兩種:列別名及表別名。SQL 中使用列名和表別名的語(yǔ)法如下:

SELECT “表別名”.”列名1” “列別名” FROM “表名稱” “表別名”

例如:

SELECT c1.District Area FROM city c1 GROUP BY c1.District;

上述語(yǔ)句,會(huì)返回表 city 中的 District 這一列。不同的是,返回的結(jié)果中 District 這一列有了別名 Area。

表連接

之前,我們都是在一張表中讀取數(shù)據(jù),操作相對(duì)比較簡(jiǎn)單。但實(shí)際情況下,我們經(jīng)常需要從多個(gè)數(shù)據(jù)表中讀取數(shù)據(jù)。在 SQL 中,JOIN 用于根據(jù)兩個(gè)或多個(gè)表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)。

在 MySQL 中 JOIN 按照功能大致分為如下三類:

  • INNER JOIN(內(nèi)連接,或等值連接):獲取兩個(gè)表中字段匹配關(guān)系的記錄。
  • LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒(méi)有對(duì)應(yīng)匹配的記錄。
  • RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒(méi)有對(duì)應(yīng)匹配的記錄。

要能進(jìn)行多表查詢,那么被查詢的表之間必須要有聯(lián)系,而數(shù)據(jù)庫(kù)中的表可通過(guò)鍵將彼此聯(lián)系起來(lái)。

主鍵(Primary Key)是一個(gè)列,在這個(gè)列中的每一行的值都是唯一的。在表中,每個(gè)主鍵的值都是唯一的。這樣做的目的是在不重復(fù)每個(gè)表中的所有數(shù)據(jù)的情況下,把表間的數(shù)據(jù)交叉捆綁在一起。

例如:

SELECT
    c1. NAME CountryName,
    c2. LANGUAGE Country_Language
FROM
    city c1
INNER JOIN countrylanguage c2 ON c1.CountryCode = c2.CountryCode
GROUP BY
    c1. NAME;

注: INNER JOIN 與 JOIN 是相同的。

表格處理

前面我們基本都是在數(shù)據(jù)庫(kù)管理系統(tǒng)中存在數(shù)據(jù)庫(kù)的情況下,獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)。當(dāng)然,我們也可以自己創(chuàng)建數(shù)據(jù)庫(kù),根據(jù)自己的需要建表存儲(chǔ)數(shù)據(jù)。

CREATE DATABASE

在 SQL 中,使用 CREATE DATABASE 來(lái)創(chuàng)建數(shù)據(jù)庫(kù)。使用的語(yǔ)法 CREATE DATABASE 語(yǔ)法如下:

CREATE DATABASE database_name

例如:

CREATE DATABASE store;

上述語(yǔ)句,創(chuàng)建了一個(gè)名叫 store 的數(shù)據(jù)庫(kù)。

CREATE TABLE

創(chuàng)建好數(shù)據(jù)庫(kù),我們就需要建立表格來(lái)存儲(chǔ)數(shù)據(jù)。使用 CREATE TABLE 的語(yǔ)法是:

CREATE TABLE 表名稱 ( 列名稱1 數(shù)據(jù)類型, 列名稱2 數(shù)據(jù)類型, 列名稱3 數(shù)據(jù)類型, …. )

例如:

CREATE TABLE Customer
( Id int,
  First_Name char(50),
  Last_Name char(50),
  Address char(50),
  City char(50),
  Country char(25),
  Birth_Date date );

上述語(yǔ)句,創(chuàng)建了一個(gè)名叫 Customer 的表,并定義了表中存儲(chǔ)數(shù)據(jù)。

在創(chuàng)建表時(shí),我們需要對(duì)表中要存儲(chǔ)的數(shù)據(jù)進(jìn)行限制,常見(jiàn)的限制有以下幾種:

  • NOT NULL
  • UNIQUE
  • CHECK
  • Primary Key
  • Foreign Key

NOT NULL

在沒(méi)有做出任何限制的情況下,某一列的值是允許有 NULL 值的。如果我們不允許某一列的值含有 NULL 值,我們就需要對(duì)那個(gè)列做出 NOT NULL 的指定。

例如:

CREATE TABLE Customer
( SID integer NOT NULL,
  Last_Name varchar (30) NOT NULL,
  First_Name varchar(30));

上述語(yǔ)句,”SID” 和 “Last_Name” 這兩列不允許有 NULL 值,而 “First_Name” 這一列是可以有 NULL 值的。

UNIQUE

UNIQUE 限制是保證一個(gè)欄位中的所有資料都是有不一樣的值。

例如:

CREATE TABLE Customer
( SID integer Unique,
  Last_Name varchar (30),
  First_Name varchar(30));

上述語(yǔ)句,”SID” 這列不能有重復(fù)值存在,而 “Last_Name” 及 “First_Name” 這兩列則是允許有重復(fù)值存在。

注意:
一個(gè)被指定為主鍵的列也一定會(huì)含有 UNIQUE 的特性。相對(duì)來(lái)說(shuō),一個(gè)UNIQUE 的列并不一定會(huì)是一個(gè)主鍵。

CHECK

CHECK 約束用于限制列中的值的范圍。如果對(duì)單個(gè)列定義 CHECK 約束,那么該列只允許特定的值。如果對(duì)一個(gè)表定義 CHECK 約束,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制。

例如:

CREATE TABLE Customer
( SID integer CHECK (SID > 0),
  Last_Name varchar (30),
  First_Name varchar(30));

上述語(yǔ)句,”SID” 這列的值只能包含大于 0 的整數(shù)。

注意:
CHECK 限制目前尚未被執(zhí)行于 MySQL 數(shù)據(jù)庫(kù)上。

Primary Key

主鍵(Primary Key)在前面已經(jīng)多次提到了,它是一個(gè)列,在這個(gè)列中的每一行的值都是唯一的。在表中,每個(gè)主鍵的值都是唯一的。這樣做的目的是在不重復(fù)每個(gè)表中的所有數(shù)據(jù)的情況下,把表間的數(shù)據(jù)交叉捆綁在一起。主鍵可以是表中的一個(gè)列,或是一個(gè)人造列 (與表沒(méi)有關(guān)系的列)。主鍵可以包含一或多個(gè)列。當(dāng)主鍵包含多列時(shí),稱為組合鍵 (Composite Key)。

主鍵可以在創(chuàng)建新表時(shí)設(shè)定 (使用 CREATE TABLE 語(yǔ)句),或是以改變現(xiàn)有表架構(gòu)的方式設(shè)定 (使用 ALTER TABLE)。例如,MySQL 中指定 Primary Key:

CREATE TABLE Customer
( SID integer,
  Last_Name varchar(30),
  First_Name varchar(30),
  PRIMARY KEY (SID));

或者是改變現(xiàn)有表架構(gòu)的方式設(shè)定:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

Foreign Key

外鍵(Foreign Key)是一個(gè)(或數(shù)個(gè))指向另外一個(gè)表格主鍵的列。外鍵的目的是確定資料的參考完整性(referential integrity)。也就是說(shuō),只有被準(zhǔn)許的資料值才會(huì)被存入數(shù)據(jù)庫(kù)內(nèi)。

例如,MySQL 中設(shè)置 Foreign Key:

CREATE TABLE ORDERS
( Order_ID integer,
  Order_Date date,
  Customer_SID integer,
  Amount double,
  Primary Key (Order_ID),
  Foreign Key (Customer_SID) references CUSTOMER(SID));

同樣的,在建好表之后,我們依然可以通過(guò)改變現(xiàn)有表架構(gòu)的方式設(shè)定外鍵:

ALTER TABLE ORDERS ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

CREATE VIEW

在 SQL 中,視圖是基于 SQL 語(yǔ)句的結(jié)果集的可視化的表。視圖包含行和列,就像一個(gè)真實(shí)的表。視圖中的字段就是來(lái)自一個(gè)或多個(gè)數(shù)據(jù)庫(kù)中的真實(shí)的表中的字段。我們可以向視圖添加 SQL 函數(shù)、WHERE 以及 JOIN 語(yǔ)句,我們也可以提交數(shù)據(jù),就像這些來(lái)自于某個(gè)單一的表。SQL中,建立一個(gè)視圖的語(yǔ)法如下:

CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition

例如:

CREATE VIEW New_City AS SELECT Name,District,Population FROM city;

這樣,我們就有了一個(gè)名為 New_City 的視圖。當(dāng)然,我們可以從視圖中獲取數(shù)據(jù):

SELECT * FROM New_City;

CREATE INDEX

INDEX (索引)是由一個(gè)表中的一列或者若干列的值與其對(duì)應(yīng)的記錄在數(shù)據(jù)表中地址所組成。用戶無(wú)法看到索引,它們只能被用來(lái)加速搜索/查詢。

數(shù)據(jù)庫(kù)中一個(gè)表的存儲(chǔ)由兩部分組成:數(shù)據(jù)頁(yè)面和索引頁(yè)面。

創(chuàng)建索引的目的是為了改善查詢性能、加快依據(jù)索引字段對(duì)表中數(shù)據(jù)行的檢索、強(qiáng)制保持表的數(shù)據(jù)唯一性等。

索引雖然能改善查詢性能,但也耗費(fèi)了磁盤空間,并且當(dāng)對(duì)數(shù)據(jù)表進(jìn)行數(shù)據(jù)增加、修改或刪除時(shí),系統(tǒng)需要花費(fèi)一些時(shí)間來(lái)維護(hù)索引,所以通常不在一個(gè)表上建立太多索引,也不建立不常使用的索引。

一般來(lái)說(shuō),需要在下面這些地方建立索引:

  • 在主鍵和外鍵上創(chuàng)建索引
  • 在檢索頻繁的字段建立索引
  • 在經(jīng)常需要排序的字段上建立索引

在 SQL 中,建立索引的語(yǔ)法如下:

CREATE INDEX “INDEX_NAME” ON “TABLE_NAME” (COLUMN_NAME)

例如:

CREATE INDEX IDX_POPULATION ON city (Population);

注意
索引的命名并沒(méi)有一個(gè)固定的方式。通常會(huì)用的方式是在名稱前加一個(gè)字首,例如”IDX_” ,來(lái)避免與數(shù)據(jù)庫(kù)中的其他物件混淆。另外,在索引名之內(nèi)包括表名及列名也是一個(gè)好的方式。

ALTER TABLE

在表被建立在數(shù)據(jù)庫(kù)中后,我們常常會(huì)發(fā)現(xiàn),這個(gè)表的結(jié)構(gòu)需要有所改變。比如,增加一列、刪去一列、改變列名稱、改變列的數(shù)據(jù)類型。在 SQL 中, ALTER TABLE 語(yǔ)句用于在已有的表中添加、修改或刪除列。使用 ALTER TABLE 的語(yǔ)法如下:

ALTER TABLE “table_name” [ 改變方式 ]

[ 改變方式 ] 的詳細(xì)寫(xiě)法會(huì)依我們想要達(dá)到的目標(biāo)而有所不同。比如,增加一列:

ALTER TABLE city ADD Country char(10);

刪除一列:

ALTER TABLE city Drop Country;

改變列的類型:

ALTER TABLE city Modify Country char(5);

DROP

通過(guò)使用 DROP 語(yǔ)句,可以輕松地刪除索引、表和數(shù)據(jù)庫(kù)。

例如,刪除一個(gè)表:

DROP TABLE city;

或者是刪除一個(gè)索引:

DROP INDEX IDX_POPULATION;

TRUNCATE TABLE

使用 DROP TABLE 指令會(huì)刪除表和表中的數(shù)據(jù)。而使用 TRUNCATE TABLE 的指令,表中的數(shù)據(jù)會(huì)完全消失,可是表本身會(huì)繼續(xù)存在。 TRUNCATE TABLE 的語(yǔ)法為下:

TRUNCATE TABLE “表格名”

例如:

TRUNCATE TABLE city;

INSERT INTO

到目前為止,我們都是操作如何把數(shù)據(jù)從表中取出。那么,怎么往表中添加數(shù)據(jù)呢?在 SQL 中,我們可以通過(guò) INSERT INTO 向表中添加數(shù)據(jù)。使用 INSERT INTO 的語(yǔ)法如下:

INSERT INTO “表格名” (“列1”, “列2”, …) VALUES (“值1”, “值2”, …)

或者,將其它表中的數(shù)據(jù)作為值:

INSERT INTO “表格1” (“欄位1”, “欄位2”, …) SELECT “欄位3”, “欄位4”, … FROM “表格2”;

例如:

INSERT INTO city (Name,CountryCode,District,Population) VALUES ("NanJing","CHN","JiangSu",82302000);

UPDATE

我們有時(shí)候可能會(huì)需要修改表格中的數(shù)據(jù)。在這個(gè)時(shí)候,我們就需要用到 UPDATE 指令。這個(gè)指令的語(yǔ)法是:

UPDATE “表名” SET “列名1” = [新值] WHERE {條件}

例如:

UPDATE city SET Population = "1880000" WHERE Name = "Kabul" AND CountryCode = "AFG";

DELETE FROM

在某些情況下,我們會(huì)需要直接從數(shù)據(jù)庫(kù)中去除一些數(shù)據(jù)。在 SQL 可以通過(guò) DELETE FROM 指令來(lái)完成。它的語(yǔ)法是:

DELETE FROM “表格名” WHERE {條件}

例如:

DELETE FROM city WHERE Name = "MaiJi";

進(jìn)階SQL

UNION

UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語(yǔ)句的結(jié)果集。UNION 的語(yǔ)法如下:

[SQL 語(yǔ)句 1] UNION [SQL 語(yǔ)句 2]

例如:

SELECT CountryCode FROM city UNION SELECT CountryCode FROM countrylanguage;

UNION ALL

UNION ALL 這個(gè)指令的目的也是要將兩個(gè) SQL 語(yǔ)句的結(jié)果合并在一起。 UNION ALL 和 UNION 不同之處在于 UNION ALL 會(huì)將每一筆符合條件的數(shù)據(jù)都列出來(lái),無(wú)論資料值有無(wú)重復(fù)。UNION ALL 的語(yǔ)法如下:

[SQL 語(yǔ)句 1] UNION ALL [SQL 語(yǔ)句 2]

例如:

SELECT CountryCode FROM city UNION ALL SELECT CountryCode FROM countrylanguage;

INTERSECT

和 UNION 指令類似,INTERSECT 也是對(duì)兩個(gè) SQL 語(yǔ)句所產(chǎn)生的結(jié)果做處理的。不同的地方是,UNION 是對(duì)結(jié)果做并集,而 INTERSECT 是交集。INTERSECT 的語(yǔ)法如下:

[SQL 語(yǔ)句 1] INTERSECT [SQL 語(yǔ)句 2]

注: MySQL 中無(wú)此用法

MINUS

MINUS 指令是運(yùn)用在兩個(gè) SQL 語(yǔ)句上。它先找出第一個(gè) SQL 語(yǔ)句所產(chǎn)生的結(jié)果,然后看這些結(jié)果有沒(méi)有在第二個(gè) SQL 語(yǔ)句的結(jié)果中。如果有的話,那這一筆數(shù)據(jù)就被去除,而不會(huì)在最后的結(jié)果中出現(xiàn)。如果第二個(gè) SQL 語(yǔ)句所產(chǎn)生的結(jié)果并沒(méi)有存在于第一個(gè) SQL語(yǔ)句所產(chǎn)生的結(jié)果內(nèi),那這筆數(shù)據(jù)就被拋棄。MINUS,也就是差集。使用 MINUS 的語(yǔ)法如下:

[SQL 語(yǔ)句 1] MINUS [SQL 語(yǔ)句 2]

注: MySQL 中無(wú)此用法

子查詢

我們可以在一個(gè) SQL 語(yǔ)句中放入另一個(gè) SQL 語(yǔ)句。當(dāng)我們?cè)?WHERE 子句或 HAVING 子句中插入另一個(gè) SQL 語(yǔ)句時(shí),我們就有一個(gè)子查詢 (subquery) 的架構(gòu)。 子查詢的作用是什么呢?第一,它可以被用來(lái)連接表。另外,有的時(shí)候子查詢是唯一能夠連接兩個(gè)表格的方式。子查詢的語(yǔ)法如下:

SELECT “欄位1” FROM “表格” WHERE “欄位2” [ 比較運(yùn)算素 ]
(SELECT “欄位1” FROM “表格” WHERE [ 條件 ])

[ 比較運(yùn)算素 ] 可以是相等的運(yùn)算素,例如 =, >, <, >=, <=. 這也可以是一個(gè)對(duì)文字的運(yùn)算素,例如 “LIKE”。綠色的部分代表外查詢,紅色的部分代表內(nèi)查詢。

例如:

SELECT SUM(Population) FROM city WHERE CountryCode IN (SELECT CountryCode FROM countrylanguage WHERE Language = "French");

EXISTS

上面的子查詢中,我們用 IN 來(lái)連接內(nèi)查詢和外查詢,而 EXISTS 也是這樣一種方式。在 SQL 中 EXISTS 是用來(lái)測(cè)試內(nèi)查詢有沒(méi)有產(chǎn)生任何結(jié)果。如果有的話,系統(tǒng)就會(huì)執(zhí)行外查詢中的 SQL。若是沒(méi)有的話,那整個(gè) SQL 語(yǔ)句就不會(huì)產(chǎn)生任何結(jié)果。EXISTS 的語(yǔ)法是:

SELECT “欄位1” FROM “表格1” WHERE EXISTS (SELECT *
FROM “表格2” WHERE [條件])

例如:

SELECT SUM(Population) FROM city WHERE EXISTS(SELECT * FROM countrylanguage WHERE Language = "French");

CASE

CASE 是 SQL 用來(lái)做為 if-then-else 之類邏輯的關(guān)鍵字。 CASE 的語(yǔ)法如下:

SELECT CASE (“欄位名”) WHEN “條件1” THEN “結(jié)果1” WHEN “條件2” THEN “結(jié)果2” … [ELSE “結(jié)果N”] END FROM “表格名”

注意: “條件” 可以是一個(gè)數(shù)值或是公式。 ELSE 子句則并不是必須的。

例如:

SELECT NAME,CASE 
WHEN 'NanJing' THEN
    Population * 0.9
WHEN 'TianShui' THEN
    Population * 1.1
ELSE
    Population
END "New Population"
FROM city;

說(shuō)明: 練習(xí) SQL 語(yǔ)句的數(shù)據(jù)庫(kù)結(jié)構(gòu)及數(shù)據(jù) 在這里。數(shù)據(jù)庫(kù)管理系統(tǒng)使用的是 MySQL。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容