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時多加當心。