SQL必知必會實踐--mysql

--
mysql安裝
--
 
 
終端執行命令
 
(可參考本筆記MySQL環境搭建-mysql 8.0.13 解壓版安裝配置方法圖文教程)
 
mysql 教學demo --命令行輸指令建立表
 
數據庫tysql關係圖
 

 
--
概念
--
 
數據庫:保存有組織數據的容器
數據庫軟件:也做DBMS,數據庫是經過DBMS來建立和操縱的容器。
表table:某種特定類型的結構化清單。數據庫中的每一個表都有惟一的名字來標識本身,稱之爲表名。
模式schema:用來描述關於數據庫和表的佈局及特性的信息。
表的列column:表中的一個字段,全部表都是由一個或多個列組成的。
行row:表中的一條記錄。record
主鍵primary key:一列或幾列,其值可以惟一標識表中的每一行。不能重用,不容許修改和更新,即便某行從表中刪除,他的主鍵也不能賦給之後的新行。
數據類型datatype:所容許的數據的類型,每一個表列都有相應的數據類型,它限制該列中存儲的數據。
 
--
ch2 檢索數據
--
 
查詢
 
SELECT 列1, 列2 FROM 表;
 
通常習慣:關鍵是大寫,列名和表名使用小寫。
全部空格都被忽略。即SQL能夠寫一行也能夠多行。不區分大小寫,不論關鍵字仍是表名列名。
 
SELECT DISTINCT vend_id FROM Products; --僅顯示不一樣項,DISTINICT必須放在列名的前面,不然無效(不會報錯,僅DISTINICT不生效,SELECT正常執行)
SELECT DISTINCT vend_id FROM Products LIMIT 2; --限制僅輸出查詢的兩行,不一樣數據庫軟件對於指令略有不一樣
SELECT prod_id FROM Products LIMIT 3 OFFSET 1;--從OFFSET開始查詢最多3行,OFFSET爲起點座標(從0開始計數)
 
註釋
 
-- 註釋內容 兩個連字符和註釋之間有至少一個空格符,不然語法錯誤
#註釋內容,沒有空格要求
/*註釋內容*/ 能夠進行多行註釋,沒有空格要求
 
--
ch3  排序檢索數據
--
 
SELECT prod_name FROM Products ORDER BY prod_price; -- 按物品價格排序,默認從低到高,必須是SELECT中最後一條語句,不然報錯。
 
SELECT prod_name,prod_price FROM Products ORDER BY prod_price,prod_name; --先按價錢再按名稱排列(分兩次排列)
 
SELECT vend_id,prod_name,prod_price FROM Products ORDER BY 3,1 DESC;  --先按第3列再按第1列排序(從0開始算,通常調試使用)
 
SELECT prod_name,prod_price FROM Products ORDER BY prod_price DESC,prod_name DESC; --降序排序,不一樣列名須要分別添加DESC纔有效果。
 
--
ch4  過濾數據
--
 
SELECT prod_name,prod_price FROM Products WHERE prod_price = 9.49; --匹配價格爲9.49的產品
 
WHERE子句操做符
經常使用的比較操做符
不等於 <> 或者 !=
不大於 !>
在指定的兩個值之間 BETWEEN
是NULL值 IS NULL
NULL 它與字段包含0、空字符串或僅僅包含空格不一樣
 
eg.  SELECT prod_name,prod_price,vend_id FROM Products WHERE vend_id != 'BRS01';
 
 
SELECT cust_name,cust_email FROM Customers WHERE cust_email IS NULL;--篩選NULL值
 
--
ch5  高級數據過濾
--
 
SELECT prod_name,prod_price,vend_id FROM Products WHERE vend_id = 'DLL01' AND prod_price = 3.49;
 
OR操做符
當OR WHERE子句的第一個條件獲得知足時,就再也不計算第二個條件了(原文這樣寫,不太明白)
感受取的是兩個條件的並集。打印以下
 
優先級 AND > OR
 
IN操做符:
優勢:
清楚直觀。
求值順序便於管理,相對於AND OR來講。
執行效率比OR高。
最重要的是可以包含其餘SELECT語句。
 
NOT操做符,條件取反操做。
MariaDB 支持使用NOT否認IN、BETWEEN和EXISTS子句。大多數DBMS容許使用NOT否認任何條件。
SELECT prod_name,vend_id FROM Products WHERE vend_id NOT IN ('DLL01', 'BR01') ORDER BY prod_name;
 
 
--
ch6  用通配符進行過濾
--
 
LIKE操做符--匹配搜索、複雜過濾
 
LIKE ‘%’表示任何字符出現任意次數。有些DBMS使用*表示。
%能夠匹配任何字符,但有一個例外,就是NULL。
 
LIKE ‘_’ 表示只匹配單個字符。
 
方括號[] 通配符 用來指定一個字符集合。它必須匹配指定位置的一個字符。(不生效,暫時未扎到緣由)
 
--
ch7 建立計算字段
--
 
字段(filed):基本上與列(column)意思相同。
TRIM,RTRIM,LTRIM函數在MYSQL中無效。
下面返回元素的一個列即爲計算字段。鏈接字符串用函數CONCAT
用AS方便命名返回後 的列名(計算字段)
執行計算命令
如何測試計算,直接用SELECT
 
 
--
ch8 使用函數處理數據
--
 
 
#找發音類似的客戶
SELECT cust_name,cust_contact FROM Customers WHERE SOUNDEX(cust_contact)= SOUNDEX('Michael Green');
 
SELECT order_num,order_date FROM Orders WHERE YEAR(order_date) = 2012;--篩選年份爲2012的訂單號
 
數字處理函數
 
--
ch9 彙總數據
--
 
彙集函數:對某些行運行的函數,計算並返回一個值。
基本的一些彙集函數,計算平均值,計數,最大值,最小值,求和。
COUNT(*) 對全部行計數,包括NULL行。若是指定列名,則會忽略NULL行。
彙集函數用來彙總數據,這些函數很高效,返回結果比在客戶端應用程序中計算要快的多。
指定不一樣價格求平均
 
--
ch10 分組數據
--
 
按給定的分組返回對應組的計算字段。
 
GROUP BY子句使用注意:
a 支持嵌套,數據將在最後指定的分組上進行彙總。(創建分組時,指定的全部列都一塊兒計算)
b 子句接收的每一列必須是檢索列或是有效的表達式,不能是彙集函數。若是SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。
c 不容許GROUP BY列帶有長度可變的數據類型(如文本或備註型字段)
d 若是分組中包含NULL值的行,則NULL做爲一個分組返回。若列中有多個NULL值的行,它們將分爲一組。
e GROUP BY 必須出如今WHERE子句以後,ORDER BY子句以前。
 
WHERE過濾行,而HAVING過濾分組。(匹配)HAVING支持全部的WHERE操做符。
WHERE在數據分組前對數據進行過濾,而HAVING在數據分組後對數據進行過濾。
 
 
--
ch11 子查詢
--
查詢(query)任何SQL語句都是查詢。但此術語通常指SELECT語句。
子查詢(subquery):SQL容許建立子查詢,即嵌套在其餘查詢語句中的查詢。查詢嵌套
 
查詢產品id爲'RGAN01'的全部訂單用戶
 
注意:
a 做爲子查詢的SELECT語句只能查詢單個列。不然報錯。
b 子查詢和性能:使用子查詢並不老是執行這類數據檢索的最有效方法。
 
做爲計算字段使用子查詢--顯示Customers表中每一個顧客的訂單總數:(注 紅色部分須要兩張表都在from後面才能使用,不然只能找到其中一張表)
 
 
--
ch12 聯結表 --join
--
思考:若是數據存儲在多個表中,怎樣用一條SELECT語句就檢索出來呢?
 
聯結是一種機制,用來在一條SELECT語句中關聯表,所以稱爲聯結。
 
關係表:
關係表的設計就是要把信息分解成多個表,一類數據一個表。各表經過某些共同的值互相關聯,因此也叫關係數據庫。
將數據分解爲多個表可以更有效地存儲,更方便地處理。
 
建立聯結:指定要聯結的全部表以及關聯他它們的方式便可。
 
笛卡爾積:沒有聯結條件(上面的where),則返回的是第一張表A和第二張表B的每一行匹配(AXB),咱們稱之爲笛卡爾積。
注:笛卡爾積不是咱們想要的,這裏返回的數據每一個供應商都匹配了每一個產品,包括供應商根本沒有的產品。要保證全部聯結都有正確的where語句,不然DBMS將返回比你想要的數據多得多的數據。
 
叉聯結:有時返回笛卡爾積的聯結,也稱叉聯結(cross join)--暫時未涉及
 
內聯結:目前爲止使用的聯結爲等值聯結,它是基於兩個表之間的相等測試。這種聯結也稱爲內聯結。稍微不一樣的語法:
select T1col, T2col 
form T1 join T2
on T1.id = T2.id
 
聯結多個表:(注:聯結的表越多,性能降低的越厲害。雖然SQL自己不限制每一個聯結約束中表的數目,可是實際上許多DBMS都會有限制)
 
注:上述查詢的值來自3個表,沒有限定,可是後面的where加了限定條件,若不加where將返回笛卡爾積。
 
 
--
ch13 建立高級聯結
--
使用表別名
mysql使用as(oracle中沒有as),用來縮短SQL語句,容許在一條SELECT語句中屢次使用相同的表
 
使用不一樣類型的聯結
內聯結:inner join
自聯結:self join (在select語句中不止一次引用相同的表)
天然聯結:natural join (標準的聯結返回全部數據,相同的列甚至出現屢次,天然聯結排除屢次出現,使每列只返回一次)
外聯結:outer join (許多聯結將一個表中的行與另外一個表中的行相關聯,但有時候須要包含沒有關聯行的那些行。舉個例子,對每一個顧客下的訂單數進行技術。包括那些至今還沒有下訂單的顧客,列出全部產品以及訂購數量,包括沒有人訂購的產品,計算平均銷售規模,包括那些至今還沒有下訂單的顧客)
 
自聯結:(許多DBMS處理聯結的效率要遠高於處理子查詢)
 
 
天然聯結:
SELECT C.*, O.order_num, O.order_date, OI.prod_id, OI.quantity, OI.item_price 
FROM Customers AS C, Orders AS O, OrderItems AS OI 
WHERE C.cust_id = O.cust_id 
AND OI.order_num = O.order_num 
AND prod_id = 'RGAN01';
 
+------------+---------------+---------------------+-----------+------------+----------+------------
--+--------------------+-----------------------+-----------+---------------------+---------+--------
--+------------+
| cust_id    | cust_name     | cust_address        | cust_city | cust_state | cust_zip | cust_countr
y | cust_contact       | cust_email            | order_num | order_date          | prod_id | quantit
y | item_price |
+------------+---------------+---------------------+-----------+------------+----------+------------
--+--------------------+-----------------------+-----------+---------------------+---------+--------
--+------------+
| 1000000004 | Fun4All       | 829 Riverside Drive | Phoenix   | AZ         | 88888    | USA
  | Denise L. Stephens | dstephens@fun4all.com |     20007 | 2012-01-30 00:00:00 | RGAN01  |       5
0 |       4.49 |
| 1000000005 | The Toy Store | 4545 53rd Street    | Chicago   | IL         | 54545    | USA
  | Kim Howard         | NULL                  |     20008 | 2012-02-03 00:00:00 | RGAN01  |
5 |       4.99 |
+------------+---------------+---------------------+-----------+------------+----------+------------
--+--------------------+-----------------------+-----------+---------------------+---------+--------
--+------------+
2 rows in set (0.00 sec)
 
外聯結:
外聯結必定要標明是是LEFT仍是RIGHT 聯結,不然報錯。left表示與左邊的作基準進行索引,right表示用右邊的作基準進行索引,索引的那一列均不包含null這個值,其餘列包括。
 
 
--
ch14 組合查詢
--
組合查詢:SQL執行多個SELECT查詢,並將結果做爲一個查詢結果集返回。這些組合查詢一般稱爲並(union)或符合查詢。
舉個例子(列必須相等)
列不相等的狀況
 
UNION默認會合並重復的行,若要顯示全部行(包含重複的行),可使用UNION ALL替代UNION
 
對組合查詢結果排序
在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須位於最後一條SELECT語句以後。
 
 
--
ch15 插入數據
--
INSERT將行插入數據庫,插入的幾種方式:
- 插入完整的行
- 插入行的一部分
- 插入某些查詢結果
 
INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      ...) -- 添加列名(字段),雖然繁瑣一些,但比上述例子要安全不少,而且表結構順序改變,也不會影響值得插入
VALUES( '1000000006',
        'Toy Land',
        '123 Any Street',
        'New York',
        'NY',
        '1111',
        'USA',
        NULL,
        NULL)
 
省略列:若是表定義容許,則能夠在INSERT中省略某些列,省略列必須知足如下某個條件:
a 該列定義爲容許NULL值(無值或空值)
b 該表定義中給出默認值。當沒有值插入時,將使用默認值。
 
插入檢索出的數據
INSERT Customers(cust_id,
                 cust_contact,
                 cust_email,
                 ...)
SELECT  cust_id,
        cust_contact,
        cust_email,
        ...
FROM CustNew; 
 
從一個表中複製另外一個表
 
 
--
ch16 更新和刪除數據
--
更新數據格式:
UPDATE Customers
SET cust_email = 'eamli@xx'
WHERE cust_id = '1000000006';
 
刪除數據格式:
DELETE FROM Customers --FROM在有些DBMS中是可選的,建議使用時最好帶上這個關鍵字,保證語句的可移植性。
WHERE cust_id= '1000000006' --不要省略WHERE語句,一不當心就會刪除全部行
 
DELETE語句從表中刪除行,甚至是刪除表中的全部行。可是,DELETE不刪除表自己。
 
更快的刪除:若是想從表中刪除全部行,不要使用DELETE。可以使用TRUNCATE TABLE語句,它完成相同的工做,而速度更快(由於不記錄數據的變更)。
 
 
--
ch17 建立和操縱表
--
 
表建立基礎
數據類型後面不指定NOT NULL,則默認爲NULL(有些DBMS可能必須指定)
 
主鍵和NULL值
主鍵是惟一表中某一行的列。只有不容許NULL值的列可做爲主鍵,容許NULL值得列不能做爲惟一的標識。
 
NULL和空字符
NULL值是沒有值,不是空字符串,空字符串是一個有效的值,它不是無值。NULL值用關鍵字NULL而不是空字符串指定。
 
指定默認值:
 
注:默認值常常用於日期或是時間戳。例如經過引用系統日期的函數或變量,將系統日期用做默認日期。MYSQL用戶指定DEFAULT CURRENT_DATE()。
 
                        得到系統日期
 
DBMS
函數或變量
ACCESS
NOW()
DB2
CURRENT_DATE
MySql
CURRENT_DATE()
Oracle
SYSDATE
prostgreSQL
CURRENT_DATE
SQL Server
GETDATE()
SQLite
date('now')
 
更改表ALTER TABLE
更改表的定義(理想狀況下,不要再表中包含數據時對其進行更新,應該在表的設計過程當中充分考慮將來的可能需求,避免從此對錶的結構作大的改動)
舉個例子 增長一列
ALTER TABLE Vendorse
ADD vend_phone CHAR(20);
 
# 刪除列
ALTER TABLE Vendorse
DROP COLUMN vend_phone;
 
# 刪除表
DROP TABLE custCopy
重命名錶操做的基本語法都要求制指定新表和舊錶,不一樣的DBMS實現存在差別。參閱DBMS文檔。
 
 
--
ch18 使用視圖
--
視圖:視圖是虛擬的表,與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。
使用視圖緣由:
a 簡化複雜的操做。
b 使用表的一部分而不是整個表。
c 保護數據 能夠授予用戶訪問表的特定部分的權限,而不是整個表的訪問權限。
d 更改數據格式和表示。視圖可返回與底層表的表示和格式不一樣的數據。
 
注:
視圖必須惟一命名(不能與別的視圖或是表同名)
對於能夠建立的視圖數目沒有限制
建立視圖須要足夠的訪問權限
視圖能夠嵌套(可能會嚴重影響性能,須要進行全面測試)
許多DBMS禁止在視圖查詢中使用ORDER BY子句
有些DBMS要求對返回的全部列進行命名,若是列是計算字段,則須要使用別名
視圖不能索引,也不能有關聯的觸發器或默認值
有些DBMS把視圖做爲只讀查詢,這表示能夠從視圖檢索數據,但不能將數據寫回底層表。
有些DBMS容許建立這樣的視圖,它不能進行到這行再也不屬於視圖的插入或更新。
 
舉例說明:
SELECT cust_name, cust_contact
FROM Orderitems,Orders,Customers
WHERE customers.cust_id = orders.cust_id
AND orders.order_num = orderitems.order_num
AND prod_id = 'RGAN01';
 
假如能夠把整個查詢包裝成一個名爲ProductCustomers的虛擬表,那麼輸入就能夠簡化爲
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
 
建立視圖CREATE VIEW 
與建立表同樣,只能用於建立不存在的視圖
 
視圖重命名
刪除視圖,可使用DROP語句,其語法爲DROP VIEW viewname;。覆蓋(或更新)視圖,必須先刪除它,而後再從新建立。
 
舉個例子:
 
視圖用來簡化複雜的數據處理
 
 
--
ch19 使用存儲過程 --無MYSQL示例,待深刻研究
--
 
存儲過程:存儲過程就是爲之後使用而保存的一條或多條SQL語句。能夠將其視爲批文件,雖然它的做用不只限於批處理。
優勢:簡單、安全、高性能。
缺點:可移植性差,不一樣DBMS種存儲過程的語法有所不一樣。事實上,編寫真正的可移植性存儲過程幾乎是不可能的。
 
執行存儲過程:
EXECUTE AddNewProduct('JTS01',
                      'Stuffed Eiffel Tower',
                      6.49,
                      'Plush stuffed toy with the text LaTour Fiffel in red white and bule')
 
這裏執行一個名爲AddNewProduct的存儲過程,將一個新產品添加到Products表中。
注:Products表中還有另外一個須要值得列prod_id列,它是這個表的主鍵。爲什麼這個值不做爲屬性傳遞給存儲過程?這是爲了保證恰當的生成此ID,最好是使生成此ID的過程自動化(而不是依賴於最終用戶的輸入)。
 
建立存儲過程:(ORACLE)
CREATE PROCEDURE MailingListCount(
    ListCount OUT INTEGER
)
IS
v_rows INTEGER;
BEGIN
    SELECT COUNT(*) INTO v_rows FROM Customers WHERE NOT cust_email IS NULL;
    ListCount := v_rows;
END;
 
 
--
ch20 管理事務處理
--
事務處理:事務處理是用來管理必須成批執行的SQL操做,保證數據庫不包含不完整的操做結果。利用事務處理,能夠保證一組操做不會中途中止,它們要麼徹底執行,要麼徹底不執行(除非明確指示)。若是沒有錯誤發生,整組語句提交給(寫入)數據庫表;若是錯誤發生,則進行回退(撤銷),將數據庫恢復到某個已知且安全的狀態。
 
使用事務處理,經過確保成批的SQL操做要麼徹底執行,要麼徹底不執行,來維護數據庫的完整性。
假設數據庫方式故障(如超出磁盤空間、安全限制、表鎖等),致使訂單插入失敗,或者數據庫存在不完整的訂單,而你還不知道。如何解決這個問題?這就須要使用事務處理了。
 
幾個術語:
事務:只一組SQL語句
回退:指撤銷指定SQL語句的過程
提交:將爲存儲的SQL語句結果寫入數據庫表
保留點:指事務處理中設置臨時佔位符,能夠對它發佈回退(與回退整個事務處理不一樣)
 
事務處理用來管理INSERT UPDATE DELETE 語句。不能回退SELECT語句(不必回退),也不能回退CREATE DROP操做。事務處理中可使用這些語句,進行回退時,這些操做也不撤銷。
 
 
--
ch21 使用遊標
--
簡單地使用SELECT語句,沒有辦法獲得第一個行、下一行或是前10行。這時候遊標就起做用了。
遊標:一個存儲在DBMS服務器上的數據庫查詢,它不是一條SELECT語句,而是被該語句檢索出來的結果集(SQL查詢所檢索的全部結果)
遊標常見的一些選項和特性:
可以標記遊標爲只讀,使數據能讀取,但不能更新和刪除。
能控制能夠執行的定向操做。
能標記某些列爲可編輯的,某些列爲不可編輯的。
規定範圍,使遊標對建立它的特定請求(如存儲過程)或對全部請求可訪問。
指示DBMS對檢索的數據進行復制,使數據在遊標打開或訪問期間不變化。
 
建立遊標:
 
 
--
ch22 高級SQL特性
--
主鍵、外鍵、約束、索引、觸發器一些概念
相關文章
相關標籤/搜索