《SQL必知必會》讀書筆記
1 瞭解SQL
資料庫是指一個以某種有組織的方式儲存的資料集合。
表是一種特定型別資料的結構化清單,通過表名才能標識自己。
表由列組成。列儲存表中某部分的資訊。每個列有相應的資料型別,限定了可儲存在列中的資料種類。
表中的資料按行儲存,所儲存的每個記錄儲存在自己的行內。
主鍵是表中的一列或多列,用於唯一標識表中每一行。主鍵需要滿足如下要求:(1)任何兩行都不具有相同的主鍵值(2)每一行都必須有一個主鍵值(3)主鍵列中的值不允許修改或更新(4)主鍵值不能重用。
SQL是用於與資料庫溝通的語言。
2 檢索資料
使用SELECT語句從表中檢索一個或多個數據列。
2.1 檢索單個列
SELECT prod_name FROM Products; 表示從表Products中檢索列prod_name
資料庫管理系統需要在單條SQL語句後加分號。SQL語句不區分大小寫。在處理SQL語句時忽略空格。
2.2 檢索多個列
SELECT prod_id,prod_name,prod_price FROM Products; 檢索多列加逗號
SQL語句一般返回原始的、無格式的資料
2.3 檢索所有列
SELECT * FROM Products; 用*表示返回表中的所有列。
2.4 檢索不同的值
SELECT DISTINCT vend_id FROM Products; 只返回所有列中不同的值
2.5 限制結果
SELECT語句預設返回指定表中所有匹配的行,如果只是想返回第一行或一定數量的行,可以通過TOP
SELECT TOP 5 prod_name FROM Products; 只檢索前5行(SQL Server和Access)
SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY; (DB2)
SELECT prod_name FROM Products WHERE ROWNUM<=5; (Oracle)
SELECT prod_name FROM Products LIMIT 5; (MySQL、MariaDB、PostgreSQL、SQLite)
SELECT prod_name FROM Products LIMIT 4 OFFSET 3;返回從第3行起的4行資料 簡化寫法:LIMIT 3,4
2.6 使用註釋
行內註釋 -- 多行註釋/* */
3 排序檢索資料
ORDER BY
3.1 排序陣列
預設檢索出的資料順序是其底層表中出現的順序顯示。
SELECT prod_name FROM Products ORDER BY prod_name; 對prod_name列以字母順序排序。ORDER BY語句必須是SELECT語句的最後一條子句。
3.2 按多個列排序
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name; 只有在有相同的price時才按name排序
3.3 按列位置排序
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3; 按第2、3列排序
3.4 指定排序方向
預設排序順序是升序。可以通過關鍵字DESC實現降序。
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC,prod_name; DESC只作用於其前面的列名。
預設資料庫排序時不區分大小寫,即a和A一樣。
4 過濾資料
WHERE
4.1 使用WHERE子句
通常只會根據特定的操作或條件提取表資料的子集。WHERE語句在表名之後給出。
SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49; 只返回price等於3.49的行
同時使用ORDER BY和WHERE語句時,ORDER BY應該位於WHERE之後。
4.2 WHERE子句操作符
所有的條件操作符:
操作符 | 說明 | 操作符 | 說明 |
= | 等於 | > | 大於 |
<> | 不等於 | >= | 大於等於 |
!= | 不等於 | !> | 不大於 |
< | 小於 | BETWEEN | 在指定的兩個值之間 |
<= | 小於等於 | IS NULL | 為NULL值 |
!< | 不小於 |
SELECT prod_name,prod_price FROM Products WHERE prod_price<10;
SELECT vend_id,prod_name FROM Products WHERE vend_id != 'DLL01'; 列出不是供應商DLL01製造的產品,單引號來限定字串。
SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10; 檢索5美元到10美元之間的值
SELECT prod_name FROM Products WHERE prod_price IS NULL; 返回所有沒有價格(空prod_price欄位)的產品
5 高階資料過濾
5.1 組合WHERE子句
SQL允許使用多個WHERE子句,以AND子句或OR子句的方式使用。
(1)AND操作符
通過不止一個列進行過濾,可以使用AND操作符給WHERE子句附加條件。AND相當於&&
SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <=4; 列出由供應商DLL01製造的價格小於等於4美元的產品。
(2)OR操作符
OR操作符與AND操作符正好相反,表示匹配任一條件的行。OR相當於||
SELECT prod_name FROM Products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'; 列出供應商DLL01或供應商BRS01製造的產品
(3)求值順序
WHERE子句中可以包含任意數目的AND和OR操作符。但在使用的過程中可能會出現組合問題,因此需要用圓括號明確地分組操作符。
SELECT prod_name,prod_price FROM Products WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10;
5.2 IN操作符
IN操作符用來指定條件範圍,範圍中每個條件可以進行匹配。IN取一組由逗號分隔、括在圓括號中的合法值。
SELECT prod_name,prod_price FROM Products WHERE vend_id IN ('DLL01','BRS01'); 列出供應商DLL01和BRS01製造的產品
可以發現IN完成了和OR操作符一樣的功能,其優點如下:在多個合法項時,IN操作符的語法更清楚直觀;與其他AND和OR操作符組合使用IN時,求值順序更容易管理;IN操作符一般比OR快;IN的最大優點就是可以包含其他SELECT語句。
5.3 NOT操作符
NOT用於否定其後條件的關鍵字。NOT關鍵字可以用在要過濾的列前,而不僅是在其後。
SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01';
6 用萬用字元進行過濾
6.1 LIKE操作符
前面的所有操作符都是針對已知值進行過濾。但要搜尋比如包含文字bean的所有產品時,這種方法並不適用。可以通過萬用字元實現。萬用字元是用來匹配值的一部分的特殊字元。
LIKE操作符表示後面的搜尋模式利用萬用字元匹配而不是簡單的相等匹配進行比較。萬用字元搜尋只能用於文字欄位,非文字資料型別欄位不能使用萬用字元搜尋。
(1)百分號%萬用字元(*,在Microsoft Access中)
%表示任何字元出現任意次數,0,1或多次。並不能用來匹配NULL
SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE 'Fish%'; 使用了搜尋模式找以Fish開頭的記錄
SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE '%bean bag%'; 使用了多個萬用字元,匹配任何位置上出現文字bean bag的值。
SELECT prod_name FROM Products WHERE prod_name LIKE 'F%y'; 找出以F起頭、y結尾的所有產品
(2)下劃線(_)萬用字元(?)
與%功能一樣,但只匹配單個字元,而不是多個字元。
SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE '_ inch teddy bear'; 匹配單個字元
(3)方括號([])萬用字元
用來指定一個字符集,必須匹配萬用字元內的一個字元。
SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact; 找出以J或M起頭的聯絡人
可以用字首字元^(!)來否定
SELECT cust_contact FROM Customers WHERE cust_contact LIKE '[^JM]%' ORDER BY cust_contact; 找出除J和M以外起頭的聯絡人
6.2 萬用字元使用技巧
萬用字元搜尋一般比前面討論的其他搜尋耗時更長,因此有下面技巧:
不要過度使用萬用字元;儘量不要把萬用字元放在搜尋模式的開始處
7 建立計算欄位
7.1 計算欄位
有時候需要從資料庫中檢索出轉換、計算或格式化過的資料,不是檢索出資料,然後再在客戶端重新格式化。通過計算欄位實現。欄位的概念與列相同。
7.2 拼接欄位
建立由兩列組成的標題,則需要將這兩列拼接到一起構成單個值。操作符為+(Access和SQL server),||(Oracle,SQLite),Concat(MySQL)
SELECT RTRIM(vend_name) + ' (' + vend_country + ')' FROM Vendors ORDER BY vend_name; 將vend_name與vend_country拼接生成一個新欄位,並去除vend_name後面多餘的空格。
RTRIM()去除字串右邊的空格,LTRIM()去除字串左邊的空格,TRIM()去除字串左右兩邊的空格
可以發現上述拼接生成的欄位並沒有名字,則不能用於客戶端應用中,因此需要別名。關鍵字為AS
SELECT RTRIM(vend_name) + ' (' + vend_country + ')' AS vend_title FROM Vendors ORDER BY vend_name; 將vend_name與vend_country拼接生成一個新欄位,取名為vend_title
7.3 執行算術計算
對檢索的資料進行算術計算。例如通過單價和數量得到總價格
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM OrderItems WHERE order_num = 20008;
8 使用函式處理資料
8.1 函式
SQL可以用函式來處理資料。不同的DBMS有著不同的函式。
函式 | 語法 |
提取字串的組成部分 | Access使用MID();DB2、Oracle、SQLite使用SUBSTR();MySQL和SQLServer使用SUBSTRING() |
資料型別轉換 | Access和Oracle每個型別都有一個轉換函式;DB2使用CAST();MariaDB、MySQL和SQL Server使用CONVERT() |
取當前日期 | Access使用NOW();DB2和PostgreSQL使用CURRENT_DATE;MariaDB和MySQL使用CURDATE();Oracle使用SYSDATE;SQL Server使用GETDATE();SQLite使用DATE() |
8.2 使用函式
大多數SQL實現支援以下型別的函式:(1)處理文字字串(刪除或填充值,轉換值為大寫或小寫)的文字函式(2)在數值資料上進行算術操作(返回絕對值、代數運算)的數值函式(3)用於處理日期和時間值並從這些值中提取特定成分(返回兩個日期差、檢查日期有效性)的日期和時間函式。(4)返回DBMS正使用的特殊資訊(如返回使用者登入資訊)的系統函式。
(1) 文字處理函式
SELECT vend_name,UPPER(vend_name) AS vendd_name_upcase FROM Vendors ORDER BY vend_name; 通過upper()函式來將文字轉換為大寫。
常見的文字處理函式
函式 | 說明 |
LEFT()(或使用子字串函式) | 返回字串左邊的字元 |
LENGTH()(DATALENGTH()或LEN()) | 返回字串的長度 |
LOWER()(LCASE()) | 將字串轉換為小寫 |
LTRIM() | 去掉字串左邊的空格 |
RIGHT()(或使用子字串函式) | 返回字串右邊的字元 |
RTRIM() | 去掉字串右邊的空格 |
SOUNDEX() | 返回字串的SOUNDEX值 |
UPPER()(UCASE()) | 將字串轉為大寫 |
其中SOUNDEX是一個將任意文字串轉換為描述其語音表示的字母數字模式的演算法,能夠對字串進行發音比較而不是字母比較。
SELECT cust_name,cust_contact FROM Customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green'); 從而可以找到Michelle Green的記錄
(2)日期和時間處理函式
日期和時間採用相應的資料型別儲存在表中,在不同資料庫中有不同的時間處理函式
以從日期中取年份為例:
SQL Server:SELECT order_num FROM Orders WHRER DATEPART(yy,order_date) = 2012; 尋找年份為2012的訂單
Access:SELECT order_num FROM Orders WHRER DATEPART('yyyy',order_date) = 2012;
PostgreSQL:SELECT order_num FROM Orders WHRER DATE_PART('year',order_date) = 2012;
Oracle:SELECT order_num FROM Orders WHRER to_number(to_char(order_date,'YYYY')) = 2012;
MySQL/MariaDB:SELECT order_num FROM Orders WHRER YEAR(order_date) = 2012;
SQLite:SELECT order_num FROM Orders WHRER strftime('%Y',order_date) = 2012;
(3)數值處理函式
用於代數、三角或幾何運算。
函式 | 說明 |
ABS() | 返回一個數的絕對值 |
COS() | 返回一個角度的餘弦 |
EXP() | 返回一個數的指數 |
PI() | 圓周率 |
SIN() | 返回一個角度的正弦 |
SQRT() | 返回一個數的平方根 |
TAN() | 返回一個角度的正切 |
9 彙總資料
9.1 聚集函式
常常需要彙總資料而不是檢索出來。比如以下功能:確定表中行數(或者滿足某個條件或包含某個特定值的行數);獲得表中某些行的和;找出表列的最大值、最小值、平均值。
函式 | 說明 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
(1)AVG()函式
AVG()可以用來返回所有列的平均值,也可以用來返回特定列或行的平均值
SELECT AVG(prod_price) AS avg_price FROM Products; 求prod_price的平均值
SELECT AVG(prod_price) AS avg_price FROM Products WHERE vend_id = 'DLL01'; 求特定行prod_price的平均值
(2)COUNT()函式
COUNT(*)對錶中行的數目進行計數,不管表列中包含的是空值還是非空值。用COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。
SELECT COUNT(*) AS num_cust FROM Customers;
SELECT COUNT(cust_email) AS num_cust FROM Customers;
(3)MAX()函式
返回指定列中的最大值。
(4)MIN函式
返回指定列的最小值。
(5)SUM()函式
返回指定列值的和。
SELECT SUM(item_price*quantity) AS total_price FROM OrderItems WHERE order_num = 20005;
9.2 聚集不同值
指定DISTINCT來包含不同值
9.3 組合聚集函式
一句SELECT語句可以包含多個聚集函式
SELECT COUNT(*) AS num_items MIN(prod_price) AS price_min,MAX(prod_price) AS price_max,AVG(prod_price) AS price_avg FROM OrderItems;
10 分組資料
GROUP BY子句和HAVING子句
10.1 建立分組
使用GROUP BY子句建立。
SELECT vend_id,COUNT(*) AS num_prods FROM Products GROUP BY vend_id; GROUP BY指示DBMS按vend_id排序並分組資料。
規定:GROUP BY子句可以包含任意數目的列,可以對分組進行巢狀,更細緻地進行資料分組。如果在GROUP BY中嵌套了分組,資料將在最後指定的分組上進行彙總。子句中列出的每一列必須是檢索列或有效的表示式。不允許GROUP BY列帶有長度可變的資料型別。NULL將作為一個分組返回。必須出現在WHERE子句之後,ORDER BY子句之前。
10.2 過濾分組
可以規定包括哪些分組,排除哪些分組。必須基於完整分組而不是個別的行進行過濾。HAVING子句支援所有的WHERE操作符
SELECT cust_id,COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*) >= 2; 過濾出至少有兩個訂單的顧客
HAVING與GROUP BY一起使用,WHERE用於標準的行級過濾
10.3 分組和排序
ORDER BY和GROUP BY的區別
ORDER BY | GROUP BY |
對產生的輸出排序 | 對行分組,但輸出可能不是分組的順序 |
任意列都可以使用(甚至非選擇的列也可以使用) | 只能用於選擇列或表示式列,必須使用每個選擇列表達式 |
不一定需要 | 如果與聚集函式一起使用列,則必須使用 |
SELECT order_num,COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING COUNT(*) >= 3 ORDER BY items,order_num;
11 使用子查詢
子查詢是指巢狀在其他查詢中的查詢。
11.1 利用子查詢進行過濾
例如要列出訂購物品RGAN01的所有顧客:
(1)檢索包含物品RGAN01的所有訂單的編號(2)檢索前一步驟列出的訂單編號的所有顧客的ID(3)檢索前一步驟所有顧客ID的顧客資訊
可以發現上述三步可以把一條SELECT語句返回的結果用於另一條SELECT語句的WHERE子句,可以將3個查詢組合起來。
SELECT cust_name,cust_contact FROM Customers WHERE cust_id IN (SELECT cust_id FROM Orders WHERE order_num IN (SELECT order_num FROM OrderItems WHERE prod_id = 'RGAN01'));
子查詢是從內往外擴散。
11.2 作為計算欄位使用子查詢
假如需要顯示Customers表中每個顧客的訂單總數。訂單與相應的顧客ID儲存在Orders中。操作步驟:
(1)從Customers中檢索顧客列表(2)對於檢索出的每個顧客,統計其在Orders中的訂單數
SELECT cust_name,(SELECT COUNT(*) FROM Orders WHERE Orders.cust_id = Customers.cust_id) AS orders FROM Customers ORDER BY cust_name;
子查詢對檢索的每個顧客執行一次操作。子查詢中的WHERE使用完全限定列名,指定表名和列名:Orders.cust_id = Customers.cust_id,從而避免混淆。(之後可以用JOIN同樣解決該問題)
12 聯結表
12.1 聯結
在SELECT中聯結多個表查詢。
關係表
例子:一個包含產品目錄的資料庫表,每類物品佔一行,對於每個物品要儲存產品描述、價格,以及生產該產品的供應商。分開儲存的理由:(1)同一供應商生產的每個產品,其供應商資訊都是相同的,對每個產品重複此資訊既浪費時間又浪費儲存空間(2)如果供應商資訊發生變化,只需要修改一次(3)如果有重複資料很難保證每次輸入該資料的方式相同。
因此建立兩個表:一個儲存供應商資訊(Vendors),另一個儲存產品資訊(Products)。通過主鍵聯絡。
12.2 建立聯結
SELECT vend_name,prod_name,prod_price FROM Vendors,Products WHERE Vendors.vend_id = Products.vend_id; 列出了兩個表Vendors和Products,如果不使用WHERE子句會返回兩個表的笛卡爾積,檢索不出正確的資料。
12.2.1 內聯結
之前使用的聯結稱為等值聯結,這種聯結也稱為內聯結。下面的語法與前面的例子作用一樣:
SELECT vend_name,prod_name,prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id; 指明為內聯結,標準寫法,聯結條件用特定的ON子句。
12.2.2 聯結多個表
SQL一個SELECT語句可以聯結多個表,但聯結的表越多,效能下降越厲害。例如11.1的三條SELECT語句可以用下面一條代替:
SELECT cust_name,cust_contact FROM Customers,Orders,OrderItemts WHERE Customers.cust_id = Orders.cust_id AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01';
13 建立高階聯結
13.1 使用表別名
前面可以對列取別名,並使用列的別名檢索。為了縮短SQL語句,允許給表名取別名。例如將上面一條SQL語句轉換一下:
SELECT cust_name,cust_contact FROM Customers AS C,Orders AS O,OrderItemts AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';
13.2 使用不同型別的聯結
13.2.1 自聯結
SELECT c1.cust_id,c1.cust_name,c1.cust_contact FROM Customers AS c1,Customer AS c2 WHERE c1.cust_name=c2.cust_name AND c2.cust_contact = 'Jim Jones';
c1和c2其實為同一個表。自聯結通常用來替代從相同表中檢索資料的使用子查詢語句。
13.2.2 自然聯結
無論何時對錶進行聯結,應該至少有一列不止出現在一個表中(被聯結列)。如果標準的聯結返回所有的資料,則相同的列會多次出現。自然聯結就是用來排除該情況,使得每一列只返回一次。自然聯結要求你只能選擇那些唯一的列,通過對一個表使用萬用字元(*),而對其他表的列使用明確的子集來完成。
SELECT C.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_price FROM Customers AS C,Orders AS O,OrderItemts AS OI WHERE C.cust_id = O.cust_id AND OI.order_num = O.order_num AND prod_id = 'RGAN01';
13.2.3 外聯結
許多聯結將一個表中的行與另一個表中的行相關聯,但有時候需要包含沒有關聯行的那些行。例如要檢索沒有訂單顧客在內的所有顧客,使用外聯結:
SELECT Customers.cust_id,Orders.order_num FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
上述語句會列出Customers中的所有行,如果有關聯行則顯示其order_num,如果沒有關聯則為NULL。
使用OUTER JOIN時,必須使用RIGHT或LEFT關鍵字指定包括所有行的表。
除了左外聯結和右外聯結外,還有全外聯結,檢索兩個表的所有行,並關聯。
13.3 使用帶聚集函式的聯結
例如需要完成以下工作:對每個顧客下的訂單進行計數,包括哪些至今尚未下訂單的顧客
SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ord FROM Customers LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id GROUP BY Customers.cust_id;
14 組合查詢
14.1 組合查詢
SQL允許執行多個查詢,並將結果作為一個查詢結果集返回,這些查詢稱為並(union)或者複合查詢。
主要有兩種情況需要使用組合查詢:(1)在一個查詢中從不同的表返回結構資料(2)對一個表執行多個查詢,按一個查詢返回資料
14.2 建立組合查詢
用UNION操作符來組合數條SQL查詢。
14.2.1 使用UNION
例子:假如需要Illinois、Indiana等州的所有顧客的報表,還要得到顧客Fun4All所有的報表。可以通過兩條SELECT語句得到。組合這兩條語句為:
SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_state IN ('IL','IN','MI')
UNION SELECT cust_name,cust_contact,cust_email FROM Customers WHERE cust_name = 'Fun4All'; UNION中每個查詢必須包含相同的列、表示式或聚集函式,列資料型別必須相容。
UNION會自動去重,若要顯示不去重資訊,用UNION ALL。對結果排序的話將ORDER BY子句放在最後一個SELECT子句的後面。
15 插入資料
INSERT語句
15.1 資料插入
插入的三種方式:插入完整的行;插入行的一部分;插入某些查詢的結果。
15.1.1 插入完整的行
需要指定表名和插入到新行中的值。
INSERT INTO Customers VALUES('100006','Toy Land','123','New York',NULL,NULL); 按順序給每一列賦值,如果該列沒有值用NULL表示,該插入方式嚴格依賴於表的結構順序,並不安全,採用下面較為繁瑣的方法。
INSERT INTO Customers(cust_id,cust_name,cust_address,cust_city,cust_contact,cust_email)
VALUES('100006','Toy Land','123','New York',NULL,NULL); 該插入方法可以不列出所有的列,如cust_contact可以省略,表會給出預設值。
15.1.2 插入檢索的資料
可以將SELECT檢索的結果插入表中。
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_contact, cust_email) SELECT cust_id, cust_name, cust_address, cust_city,cust_contact,cust_email FROM CustNew;
15.2 從一個表複製到另一個表
將一個表的內容複製到一個全新的表,使用SELECT INTO語句。
CREATE TABLE CustCopy AS
SELECT * INTO CustCopy FROM Customers; 建立一個新表CustCopy,將Customers複製到CustCopy中
16 更新和刪除資料
UPDATE和DELETE
16.1 更新資料
兩種方式:更新表中的特定行;更新表中的所有行。
UPDATE Customers SET cust_email = '[email protected]' WHERE cust_id = '1000000005';
可以通過將值更新為NULL來刪除某一列的值。
16.2 刪除資料
兩種方式:刪除表中的特定行;刪除表中的所有行。
DELETE FROM Customers WHERE cust_id = '1000000006';
17 建立和操縱表
17.1 建立表
CREATE TABLE建立表,必須給出下列資訊:
1、新表的名字,在關鍵字CREATE TABLE之後給出
2、表列的名字和定義,用逗號分隔
3、指定表的位置
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
NULL值表示沒有值或缺值,允許NULL值的列允許在插入行時不給出該列的值。NULL為預設設定。
指定預設值:預設值用關鍵字DEFAULT指定。
CREATE TABLE OrderItems
(
order_num CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
相關推薦
【讀書筆記】【資料庫】SQL必知必會
第1課 瞭解SQL 簡單介紹了sql,和dbms,無重點。 第2課 檢索資料 重點:select語句,distinct,limit,註釋 1. select 語句如果沒有明確排序查詢結果,那麼返回的資料沒有特定的順序。返回資料的順序可能是資料被新增到表中的順序,也可能不是。只要返回相同數目的行,就是正
讀書筆記《MySQL必知必會》之第一章瞭解SQL
文章目錄 瞭解SQL 資料庫基礎 什麼是資料庫 什麼是表 列和資料型別 行 主鍵 關於主鍵最好的習慣 什麼是SQL
SQL必知必會第4版讀書筆記
SQL必知必會_4前言@author 魯偉林 在讀電子版<<SQL必知必會>> 第4版時,做了下筆記。供以後自己或者其他學習者參考。 電子版<<SQL必知必會>>和書中使用的資料庫和表的原始碼, 請參看地址:https://gi
《SQL必知必會》讀書筆記
1 瞭解SQL 資料庫是指一個以某種有組織的方式儲存的資料集合。 表是一種特定型別資料的結構化清單,通過表名才能標識自己。 表由列組成。列儲存表中某部分的資訊。每個列有相應的資料型別,限定了可儲存在列中的資料種類。 表中的資料按行儲存,所儲存的每個記錄儲存在自己的行內
《mysql必知必會》讀書筆記--觸發器及管理事務處理
sql drop 是不是 回退 blog mysql語句 update inno eat 觸發器 觸發器是MySQL響應DELETE,INSERT,UPDATE而自動執行的一條MySQL語句,其他語句不支持觸發器。 創建觸發器時,需要4個條件; 唯一的觸發
2018/07/26 《SQL 必知必會》 學習筆記
order lec tinc 終端 報錯 提交 寫法 啟動 過濾 讀書總結: 《SQL 必知必會》是我系統學習數據庫的第一本書。 主要講解了 常用的 SQL 語句寫法和一些基本的註意點。 並不涉及一些比較深入的知識點。 作為初學或者是系統學習的查漏補缺我覺得
【SQL必知必會】筆記 SQL萬用字元
萬用字元: WHERE子句中用於篩選 用來匹配值的一部分的特殊字元 萬用字元只能用於文字欄位(字串),不能用於非文字資料型別的資料 使用萬用字元時,必須使用LIKE操作符 1. 百分號(%)萬用字元 %表示任何字元出現任意次數 比方說,
讀書筆記《MySQL必知必會》之第十七章組合查詢
文章目錄 什麼是組合查詢 建立組合查詢 使用union 使用union的規則 union all的使用 組合查詢的結果的排序 總結 什麼是組合查詢 把
讀書筆記《MySQL必知必會》之第0章,書中基本資料的準備
文章目錄 指令碼下載地址 下載壓縮包 解壓檔案 建立資料庫 建表語句 填充資料語句 各個表的詳細描述 vendors表 products表
《SQL必知必會》閱讀筆記
【自言自語】對於資料庫sql語言,之前都是用的時候再查,沒有系統的瞭解,用了一天半把這個書看完了,所以需要總結一下,不過,我沒有寫遊標、儲存過程這些,因為我覺得書中講的過淺了。等下一本書看完,或許有更好的理解。到時候,再寫關於那幾個方面的我覺得是不錯的。這段時間
【SQL必知必會】筆記 資料庫基礎
資料庫(database):儲存有組織的資料的容器(通常是一個文 件或一組檔案) 資料庫管理系統(DBMS): 資料庫軟體 表(table):一種結構化的檔案,可用來儲存某種特定型別的資料。 同一資料庫的不同標的表名不能重複。 列(column): 表中的一個欄位。 行(row): 表中的一個記錄。 主鍵(
【SQL必知必會】筆記 函式
與其他大多數計算機語言一樣, SQL支援利用函式來處理資料。函式一般是在資料上執行的,它給資料的轉換和處理提供了方便。 可移植性:能執行在多個系統上的程式碼。 相對來說,多數SQL語句是可移植的,不同的DBMS之間實現使用函式有較大的差異,也就是說函式的可移植
【SQL必知必會】筆記 建立和表
建立一張新表CREATE TABLE 比如說建立一張使用者資訊表, CREAIE TABLE customers(cust id int NOT NULL AUTO_INCREMENT, cust_name char(50) NOT NULL , cust a
產品讀書《SQL必知必會》
大學期間學過資料庫相關的知識,無奈幾年下來能吃到肚子裡的都吃進去了,留在腦子裡的恐怕沒多少了,其實之前也沒有認認真真的學習過資料庫,全靠實踐中一點點查,還好也不算晚,看一本非常基礎但是比較全面的基礎書來補一補N多年前的知識,就當是複習筆記吧! 很遺憾的一點是在
《SQL必知必會》筆記(施工中)
溫馨提示:本文程式碼全部以MySQL 5.7實現。 第7課 建立計算欄位 select concat(vend_name, '(', vend_country, ')') as vend_title from vendors order by vend_name;se
MYSQL必知必會讀書筆記 第二十四章 使用遊標
MySQL檢索操作返回一組稱為結果集的行。這組返回的行都是與SQL語句相匹配的行。使用簡單的SELECT語句無法得到第一行、下一行和前十行。有時候需要在檢索出來的結果中前進或後退一行或多行。這就是使用遊標的原因。遊標(cursor)是一個儲存在MySQL伺服器上的資料庫查詢
《Mysql必知必會》讀書筆記
《Mysql必知必會》(MySQL Crash Course)內容很豐富,mysql的各個方面都涉及到了,從基本的SQL增刪改查到觸發器、事務以及安全管理和效能提升,本書都做了精簡的介紹。 相比於另外兩本相關的初學者讀物——《SQL基礎教程》MICK著和《
SQL必知必會-筆記(五)函數
contact tac 我不 href 技術分享 gree table 轉換 問題 目錄 函數 匯總函數 函數 需要明確的一點是,SQL函數是不可移植的 大多數SQL支持一下類型的函數, 用於處理文本字符串 用於在數值上進行計算操作 用於處理日期和時間 返回DBM
SQL必知必會-筆記(六)分組數據
概念 item 問題: 問題 技術 tro 大於 class 圖片 為什麽需要分組? 先來看一個問題,如果需要返回供應商DLL01提供的產品數目,SQL如下: select count(*) from Products where vend_id = ‘DLL01‘; 那麽
SQL必知必會-筆記(七)查詢
聯結 nta mys 語句 地方 沒有 表結構 問題 我們 目錄 子查詢 聯結表 子查詢 即嵌套在其他查詢中的查詢 表結構說明:每個訂單包含訂單編號,客戶ID,訂單日期