MySQL基礎(二):數據的查詢、插入、更新與刪除

一:單表查詢

       SELECT查詢語句語法結構:正則表達式

       SELECT [DISTINCT] 字段名1[,字段名2,...] FROM 表名
       WHERE 過濾條件
       GROUP BY 分組依據
       HAVING 過濾條件
       ORDER BY 排序依據

       LIMIT 數字sql

       各關鍵字執行順序:
    FROM-->WHERE-->GROUP BY-->HAVING-->ORDER BY-->SELECT-[DISTINCT]-->LIMIT
數據庫

       1,DISTINCT函數

       DISTINCT 應用於全部列而不只是其後面的第一個列
性能

       如:distinct vend_id   取出全部不一樣的vend_id;distinct vend_id,prod_name  取出不一樣的vend_id和prod_name的組合,只有當vend_id和prod_name都相同時,纔會去掉測試

       2,字段名spa

       字段:包括表中的列,計算字段,拼接字段
       計算字段:字段間進行運算(+、-、*、/)產生的,子查詢獲得的、使用數據處理函數或彙集函數獲得的新字段
       拼接字段:使用concat()函數進行拼接獲得的新字段
3d

       用 AS 給計算字段和拼接字段取別名:計算或拼接成的新字段只有值沒有名字,沒法被應用程序引用,能夠取個別名解決code

       3,WHEREblog

WHERE子句操做符總結
操做符  說明 操做符  說明
=   等於
IS NULL  爲空值
<>  不等於 IS NOT NULL  不爲空值
!=  不等於 AND

 邏輯

所有條件匹配成功,纔算匹配成功

<  小於 OR

 邏輯或

有一個條件匹配成功,就算匹配成功

<=  小於等於 NOT  邏輯非,條件取反
>  大於 IN

IN(a,b,c)   功能與OR至關

指定條件範圍,逐個進行匹配

>=  大於等於 LIKE  用於通配符搜索 (% 、_)
BETWEEN...AND  在兩個值之間          REGEXP  正則表達式
       補充:

       like操做符:用於通配符搜索

       通配符:wildcard 用來匹配值的一部分的特殊字符
       百分號 % 匹配任意個字符,包括0個字符
       下劃線 _ 匹配單個字符,不能多也不能少

       使用通配符的技巧:
       1,不要過度使用通配符,若是其餘操做符能達到相同的目的,應該使用其餘操做符
       2,儘可能不要在搜索模式的開始處使用通配符,把通配符置於搜索模式的開始處搜索起來是最慢的
       3,仔細注意通配符的位置

       正則表達式:REGEXP '匹配字符'

SELECT * FROM t1 
    WHERE name REGEXP 'ock';

       4,GROUP BY & HAVING

       GROUP BY 子句能夠包含任意數目的列
       大多數SQL實現不容許GROUP BY列帶有長度可變的數據類型(如文本)
       除彙集計算語句外,select語句中的每一個列都必須在GROUP BY 子句中給出

       GROUP BY 子句必須出如今WHERE子句以後,ORDER BY子句以前。

       HAVING 過濾分組;   WHERE 過濾行;  它倆的句法是相同的
       WHRER用於分組前過濾;    HAVING通常用於分組後過濾

       5,ORDER BY

       排序,默認升序 ASC
       降序,需指定 DESC 關鍵字;想在多個列上進行降序排序,必須對每一個列指定DESC關鍵字

--方式一:
SELECT prod_id,prod_price,prod_name 
	FROM Products
	ORDER BY prod_price,prod_name;

--方式二:按相對列位置進行排序,該相對位置必須在select清單中
SELECT prod_id,prod_price,prod_name 
	FROM Products
	ORDER BY 2,3 [DESC];

       6,LIMIT

       LIMIT 5;   限制返回5行
       LIMIT 5,5;  指示從行5(即第6行)開始取5行(第一行爲行0)

       LIMIT 4 OFFSET 3;  從行3開始取4行  同 LIMIT 3,4;


二:數據處理函數與彙集函數

       1,數據處理函數




       2,彙集函數

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

SQL彙集函數
函數  說明
AVG() 返回某列的平均值
COUNT() 返回某列的行數
MAX() 返回某列的最大值
MIN() 返回某列的最小值
SUM() 返回某列值之和
AVG()                   只能用於單個列;會忽略列值爲NULL的行
COUNT(*)            對錶中的行的數目進行計數,包括NULL

COUNT(column)  對特定列中具備值的行進行計數,忽略NULL


三:子查詢

       子查詢:subquery 嵌套在其餘查詢中的查詢

       可用於where子句的IN操做符中和建立計算字段

       1,用於where子句的IN操做符中

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

       2,用於建立計算字段

SELECT cust_name,cust_state,(SELECT COUNT(*)
				FROM orders
				WHERE orders.cust_id = customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;

       在SELECT語句中,子查詢老是從內向外處理;對於能嵌套的子查詢的數目沒有限制,不過在實際使用時因爲性能的限制,不能嵌套太多的子查詢


四:表的聯結、多表查詢與組合查詢

       聯結是利用SQL的SELECT能執行的最重要的操做!!!

       在聯結兩個表時,實際上作的是將第一個表中的每一行與第二個表中的每一行配對;WHERE子句做爲過濾條件,全部結果只包含那些匹配給定條件的行。

       聯結表不是物理實體,即它在實際的數據庫表中不存在,只存在於查詢的執行當中

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


       1,內部聯結:也叫等值聯結,它基於兩個表之間的相等測試

       1.1 兩種聯結形式:

--形式一:
SELECT vend_name,prod_name,prod_price
	FROM vendors,products
	WHERE vendors.vend_id = products.vend_id;

--形式二:使用INNER JOIN關鍵字聯結表,推薦使用這種方式
SELECT vend_name,prod_name,prod_price
	FROM vendors INNER JOIN products
	--關鍵字ON給出聯結條件
	ON vendors.vend_id = products.vend_id;

       1.2 自聯結:兩張相同的表相聯結,這時爲了不表名的二義性,須要給表取別名

       能夠給表起別名;表別名只在查詢執行中使用,與列別名不同,表別名不返回到客戶機

SELECT c1.cust_id,c1.cust_name,c1.cust_contact
	FROM customers AS c1,customers AS c2
	WHERE c1.cust_name = c2.cust_name AND c2.cust_contact = 'Jim Jones';
       用自聯結而不用子查詢:自聯結一般做爲外部語句用來替代從相同表中檢索數據使用的子查詢語句;由於許多DBMS處理聯結遠比處理子查詢快得多。

       2,外部聯結

       聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結稱爲外部聯結;外部聯結分兩種類型:左外部聯結與右外部聯結

       左外部聯結:即包含了左表中那些與右表沒有關聯關係的行

--左外部聯結:使用關鍵字 LEFT OUTER JOIN
SELECT customers.cust_id,orders.order_num
	FROM customers LEFT OUTER JOIN orders
	ON customers.cust_id = orders.cust_id;

--右外部聯結:RIGHT OUTER JOIN

       3,組合查詢

       組合查詢:使用UNION操做符來組合數條SQL查詢,並將它們的結果組合成單個結果集返回

       UNION規則:
       (1) UNION 中的每一個查詢必須包含相同的列、表達式或彙集函數(次序能夠不一樣)
       (2) UNION 從查詢結果集中自動去除了重複的行;若是想返回全部匹配行,可以使用UNION ALL

       (3) 只能使用一條ORDER BY 子句來排序,在最後一條SELECT語句以後使用。

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

五:數據的插入、更新、刪除

       1,數據的插入 INSERT INTO

--方式一:高度依賴於表中列的定義次序,各個列必須以它們在表定義中出現的次序填充
INSERT INTO customers 
	VALUES
	(value1,value2,...);

--方式二:在表名後的括號裏明確地給出列名   (推薦使用這種寫法!)
INSERT INTO customers(cust_id,cust_name,...)
	VALUES
	(value1,value2,...);
--同時插入多行數據
INSERT INTO customers(cust_id,cust_name,...)
	VALUES
	(value1_1,value1_2,...),
	(value2_1,value2_2,...);
--插入檢索出的數據:INSERT SELECT
INSERT INTO customers(cust_id,cust_name,...)
	--不必定要求列名匹配,填充數據使用的是列的位置  
	SELECT cust_id,cust_name,...
	FROM custnew;            

--使用INSERT SELECT從custnew中將全部數據導入customers;表custnew有多少行就插入多少行

--MySQL中複製表:
CREATE TABLE newt1 as
	SELECT * FROM t1;

       2,數據的更新 UPDATE

       語法:
       UPDATE 表名 SET 列名1 = 值1,
                    列名2 = 值2

                     WHERE 過濾條件; (不要忘了使用WHERE子句,否則就會更新表中的全部行)

--更新一列
UPDATE customers
	SET cust_email = 'elmer@fudd.com'
	WHERE cust_id = 10005;

--更新多列
UPDATE customers
	SET cust_name = 'Fudds',
	    cust_email = 'elmer@fudd.com'
	WHERE cust_id = 10005;

--爲了刪除某個列的值,可設置它爲NULL(假定容許NULL值)
UPDATE customers
	SET cust_email = NULL
	WHERE cust_id = 10005;

       3,數據的刪除 DELETE

       語法:

       DELETE FROM 表名 WHERE 過濾條件;

DELETE FROM customers
	WHERE cust_id = 10006;