《MySQL必知必會》筆記1

2016/2/21正則表達式

數據庫:保存有組織的數據的容器(一般是一個文件或一組文件)sql

數據庫管理系統(DBMS):用於訪問數據庫。
數據庫


:某種特定類型數據的結構化清單。相同的數據庫中表的名字是惟一的安全

模式:關於數據庫和表的佈局及特性的信息。能夠用來描述數據庫中特定的表以及整個數據庫。服務器

:表中的一個字段,全部表都是由一個或多個列組成。函數

數據類型:所允許的數據的類型。每一個表列都有相應的數據類型,它限制(或允許)該列中存儲的數據。佈局

:表中的一個記錄性能


主鍵:一列(或一組列),其值可以惟一區分表中每一個行。測試

主鍵值的幾個規則。編碼


SQL:結構化查詢語言。專門用來與數據庫通訊的語言。



2016/2/22

DBMS分爲兩類:

    基於共享文件系統的DBMS

    基於客戶機-服務器的DBMS


USE關鍵字:選擇一個數據庫。必須先使用USE打開數據庫,才能讀取其中的數據。


 返回可用數據庫的一個列表

SHOW DATABASES;


返回當前選擇的數據庫內可用表的列表。

SHOW TABLES;    


也可用來顯示錶

SHOW COLUMNS FROM customers;

快捷方式:

DESCRIBE customers;


 顯示容許的SHOW命令

HELP SHOW;  



SELECT語句:從表中檢索一個或多個數據列。


SELECT prod_name    #列名(列名間加上逗號能夠檢索多個列;使用通配符(*)能夠檢索全部列,並能檢索出名字未知的列)
FROM products;    #從中檢索數據的表名


SQL語句不區分大小寫,多數開發人員喜歡對關鍵字使用大寫,便於閱讀和調試。


SELECT DISTINCT vend_id    #DISTINCT,指示只返回不一樣的值,它應用於全部列。
FROM products;


SELECT prod_name
FROM products
LIMIT 5;    #指示MySQL返回很少於5行。


SELECT prod_name
FROM products
LIMIT 3, 4;    #指示MySQL返回從行3開始的4行。


替代語法:

LIMIT 4 OFFSET 3;


行0:表示第一行。


使用徹底限定的表名,列名。

SELECT products.prod_name
FROM crashcourse.products;



子句的概念:如SELECT語句的FROM子句。


ORDER BY子句指示MySQL對prod_name列以字母順序排序。

SELECT prod_name
FROM products
ORDER BY prod_name;


也可經過非選擇列進行排序。


檢索3個列,對其中兩個列進行排序。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;


DESC關鍵字:指定降序排序。

ASC:指定升序排序(默認)。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC;


DESC關鍵字只應用到直接位於其前面的列名上。

SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name;


在對文本性的數據進行排序時,A與a是否相同,取決於數據庫如何設置。


子句的使用順序:FROM子句->WHERE子句->ORDER BY子句->LIMIT子句



WHERE子句:

SELECT prod_price, prod_name
FROM products
WHERE prod_price = 2.50;


字符串使用‘ ’,單引號用於限定字符串。

MySQL在執行匹配時默認不區分大小寫。

SELECT prod_price, prod_name
FROM products
WHERE prod_name = 'fuses';


<

<=

<>    不等於

!=    不等於


BETWEEN操做符

SELECT prod_price, prod_name
FROM products
WHERE prod_price BETWEEN 5 AND 10;


NULL 無值,它與字段包含0、空字符串或僅僅包含空格不一樣。

SELECT prod_name
FROM products
WHERE prod_price IS NULL;


NULL值的行,表示未知,數據庫不知道它們是否匹配,因此在匹配過濾或不匹配過濾時不返回它們。



AND操做符:用在WHERE子句中。計算優先級大於OR操做符。

OR操做符

圓括號可對相應操做符分組。使用圓括號沒有壞處,還能消除歧義。


IN操做符(與OR操做符完成相同的功能)

WHERE子句中用來指定要匹配值的清單的關鍵字。

SELECT prod_price, prod_name
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;


NOT操做符

WHERE子句中用來否認後跟條件的關鍵字。

SELECT prod_price, prod_name
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;



通配符:用來匹配值的一部分的特殊字符。可在搜索模式中任意位置使用,而且可使用多個通配符。

搜索模式:由字面值、通配符或二者組合構成的搜索條件。


LIKE操做符:它是謂詞,指示MySQL,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。


百分號(%)通配符

    表示任何字符出現任意次數。0次、1次、屢次。

    % 不能匹配 NULL。


下劃線(_)通配符

    匹配單個字符。


通配符使用技巧

    不要過分使用通配符。花費時間更長。

    除非絕對必要,不然不要把通配符用在搜索模式的開始出。

    仔細注意通配符的位置。不要放錯地方。



正則表達式控制數據過濾


REGEXP後所跟的東西做爲正則表達式處理

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORFER BY prod_name;


. 匹配任意一個字符。

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.1000'
ORFER BY prod_name;


LIKE與REGEXP的區別:

LIKE:匹配整個列

REGEXP:在列值內進行匹配。使用^和$定位符才能匹配整個列。


BINARY關鍵字:使MySQL中的正則表達式匹配區分大小寫。


進行OR匹配

SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORFER BY prod_name;


匹配幾個字符之一

SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORFER BY prod_name;

[123]定義一組字符,它的意思是匹配1或2或3.

能夠寫成[1|2|3],但[]不能省略。

[^123]匹配除1 2 3 外的任何東西。

[1-5]匹配範圍

[a-z]


匹配特殊字符:必須用\\爲前導(轉義)。如\\-    \\.    。(MySQL本身解釋一個\,正則表達式庫解釋另外一個)

\\也可用來引用元字符(具備特殊含義的字符)

\\\匹配\自己。



2016/2/23

第十章建立計算字段


字段:計算字段


拼接:將值聯結到一塊兒構成單個值。


使用Concat()函數來拼接兩個列。

SELECT Concat(vend_name, ' (', vend_country, ')')
FROM vendors
ORDER BY vend_name;


RTrim()函數:刪除數據右側多餘的空格。

LTrim()函數:刪除數據左側多餘的空格。

Trim()函數:刪除數據左右兩側多餘的空格。

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
FROM vendors
ORDER BY vend_name;


新計算列沒有名字,它只是一個值。未命名的列不能用於客戶機應用,客戶機沒有辦法引用它。

使用別名,解決這個問題。

SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;


別名(導出列)的其餘用途:重命名。


執行算數計算

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;


SELECT能夠省略FROM子句以便簡單地訪問和處理表達式。



第十章使用數據處理函數


文本處理函數

SELECT vend_name, Upper(vend_name) AS vend_name_upcase
FROM vendors
ORDER BY vend_name;

使用Soundex()函數,匹配發音相似的值。

SELECT cust_name, cust_contact
FROM customers
WHERE Soundex(cust_contact) = Soundex('Y Lie');


日期和時間處理函數


通常,應用程序不使用用來存儲日期和時間的格式,日期和時間函數老是被用來讀取、統計和處理這些值。


SELECT cust_id, order_num
FROM orders
WHERE order_date = '2005-09-01';


Date()    日期。

SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) = '2005-09-01';

Time()    時間


SELECT cust_id, order_num
FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';


SELECT cust_id, order_num
FROM orders
WHERE Year(order_date) 2005 AND Month(order_date) = 9;


數值處理函數



第十二章 彙總數據


彙集函數:運行在行組上,計算和返回單個值的函數。


AVG函數:肯定特定數值列的平均值,列名做爲函數參數。忽略列值爲NULL的行。

SELECT AVG(prod_price) AS avg_price
FROM products;


AVG()肯定特定列或行的平均值。

SELECT AVG(prod_price) AS avg_price
FROM products;


COUNT函數

對錶中行的數目進行計數,無論表列中包含的是空值(NULL)仍是非空值。

SELECT COUNT(*) AS num_cust
FROM customers;


若是指定列名,則指定列的值爲空的行被COUNT()函數忽略。

SELECT COUNT(cust_email) AS num_cust
FROM customers;

MAX()函數:返回指定列中的最大值。要求指定列名。忽略列值爲NULL的行。

MIN()函數

SUM()函數:返回指定列值的和(總計)。

SELECT SUM(quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;


SUM()函數也可用來合計計算值

SELECT SUM(item_price*quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;


彙集不一樣值。

DISTINCT參數。缺省時,默認指定了ALL參數。

SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products;
WHERE vend_id = 1003;


組合彙集函數:單條SELECT語句執行4個彙集計算。



第十三章分組數據


GROUP BY子句指示MySQL分組數據,而後對每一個分組而不是整個結果集進行彙集。

SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;


HAVING子句(與WHERE子句的區別:WHERE過濾行,而HAVING過濾分組

WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。

SELECT cust_id, COUNT(*) AS orders
FROM orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;


通常在使用GROUP BY子句時,應該也給出ORDER BY子句。這是保證數據正確排序的惟一方法。

SELECT order_num, SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;


SELECT子句順序 (pdf 100頁)



第十四章 使用子查詢


查詢:任何SQL語句都是查詢。但此術語通常指SELECT語句。


SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';

SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);

把第一個查詢變爲子查詢組合兩個查詢

SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

在SELECT語句中,子查詢老是從內向外處理。


子查詢通常與IN操做符結合使用,但也能夠用於測試等於(=)、不等於(<>)等。


做爲計算字段使用子查詢

SELECT cust_name, 
      cust_state,
      (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) AS orders

相關子查詢:設計外部查詢的子查詢。

任什麼時候候只要列名可能有多義性,就必須使用這種語法(表名和列名由一個句點分隔)。


逐漸增長子查詢來創建查詢:首先,創建和測試最內層的查詢。而後,用硬編碼數據創建和測試外層查詢,而且僅在確認它正常後才嵌入子查詢。


子查詢最多見的使用是在WHERE子句的IN操做符中,以及用來填充計算列。



第十五章聯結表


關係表:關係表的設計就是要保證把信息分解成多個表,一類數據一個表。各表經過某些經常使用的值(即關係設計中的關係)互相關聯。


主鍵


外鍵:某個表中的一列,它包含另外一個表的主鍵值,定義了兩個表之間的關係。


可伸縮性:可以適應不斷增長的工做量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好。


聯結:用來在一條SELECT語句中關聯表。聯結不是物理實體,它在實際的數據庫表中不存在,它存在於查詢的執行當中。

(聯結是SQL中最重要最強大的特性。)



2016/2/24

建立聯結

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

prod_name, prod_price在表products中,vend_name在表vendors中。

WHERE子句過濾,後面跟的是聯結條件。


笛卡爾積:由沒有聯結條件的表關係返回的結果爲笛卡爾積。檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

返回的數據用每一個供應商匹配了每一個產品。


全部聯結都應由WHERE子句。


叉聯結。


等值聯結:基於兩個表之間的相等測試。也稱爲內部聯結

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;

INNER JOIN指定兩個表之間的關係,ON指定聯結條件。


聯結多個表。

SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id AND orderitems.prod_id = products.prod_id AND order_num = 20005;


性能考慮:聯結的表越多,性能降低越厲害。


用聯結代替子查詢

SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id AND orderitems.order_num = orders.order_num AND prod_id = 'TNT2';



第十六章建立高級聯結


別名除了用於列名和計算字段外,SQL還容許給表名起別名。

給表名起別名的做用:

    縮短SQL語句;

    容許在單條SELECT語句中屢次使用相同的表。


縮短SQL語句;

SELECT cust_name, cust_contact
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 = 'TNT2';

表別名只在查詢執行中使用。與列別名不同,表別名不返回到客戶機。


自聯結

SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id AND p2.prod_id = 'DTNTR';

子查詢

SELECT prod_id, prod_name
FROM  products
WHERE vend_id = (SELECT vend_id
FROM products
        WHERE prod_id = 'DTNTR');


不管什麼時候對錶進行聯結,應該至少有一個列出如今不止一個表中(被聯結的列)。

天然聯結排除屢次出現,使每一個列只返回一次。

對錶使用通配符(SELECT *),選擇那些惟一的列。對全部其餘表的列使用明確的子集來完成。

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 = 'FB';


外部聯結:聯結包含了那些在相關表中沒有關聯的行。

檢索全部客戶,包括那些沒有訂單的客戶。

SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

OUTER JOIN指定聯結的類型,

必須使用LEFT或RIGHT關鍵字指定包括其全部行的表。(RIGHT:OUTER JOIN 右邊的表,LEFT:OUTER JOIN左邊的表)


使用帶彙集函數的聯結

SELECT customers.cust_name,
      customers.cust_id,
      COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;


聯結使用的要點

1)注意聯結類型:內部聯結、外部聯結

2)使用正確的聯結條件

3)應該老是提供一個聯結條件,不然會得出笛卡爾積。



第十七章組合查詢

並(union)/複合查詢:執行多個查詢,並將結果做爲單個查詢結果返回。


須要使用組合查詢的兩種基本狀況:

1)在單個查詢中從不一樣的表返回相似結構的數據;

2)對單個表執行多個查詢,按單個查詢返回數據。


UNION的規則



2016/2/25

UNION從查詢結果集中自動去除重複的行。

UNION ALL:返回全部匹配行,不取消重複的行。


在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出如今最後一條SELECT語句以後。

用來排序全部SELECT語句返回的全部結果。


使用UNION的組合查詢能夠應用不一樣的表。



第十八章全文本搜索

Match()和Against()函數

查詢擴展

布爾方式



第十九章插入數據

INSERT語句:插入(或添加)行到數據庫表。


插入的幾種方式:

1)插入完整的行;

2)插入行的一部分;

3)插入多行;

4)插入某些查詢的結果。


INSERT INTO customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);

對每一個列必須提供一個值,若是某個列沒有值,應該使用NULL,

各個列必須以它們在表定義中出現的次序填充。


編寫依賴於特定列次序的SQL語句是很不安全的。

編寫INSERT語句的更安全的方法:(更煩瑣)(使用列的列表)

INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);


不要使用沒有明確給出列的列表的INSERT語句。


省略列:省略的列必須知足如下某個條件。

1)該列爲定義容許NULL值。

2)在表定義中給出默認值。


LOW_PRIORITY,指示MySQL下降INSERT語句的優先級。


單條語句插入多個值:(列名相同)


插入檢索出的數據:INSERT SELECT



第二十章更新和刪除數據

UPDATE語句:更新(修改)表中的數據

使用UPDATE的兩種方法:

1)更新表中特定行;

2)更新表中全部行;


UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;

WHERE過濾條件不能少,不然會更新整個表。


更新多個列

UPDATE customers
SET cust_name = 'The Fudds',
   cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;


IGNORE關鍵字:UPDATE語句中即便發生錯誤,也繼續更新。


刪除某個列的值,可設置它爲NULL。


DELETE語句:刪除數據。

1)從表中刪除特定的行;(使用WHERE)

2)從表中刪除全部行。


DELETE FROM customers
WHERE cust_id = 10006;


DELETE語句刪除的是行,爲了刪除指定的列,使用UPDATE語句。


TRUNCATE TABLE語句:刪除原來的表並從新建立一個表。速度比使用DELETE刪除表中全部行塊。


使用UPDATE和DELETE的四個習慣。


MySQL沒有撤銷按鈕,使用UPDATE和DELETE時多加當心。

相關文章
相關標籤/搜索