《SQL必知必會》閱讀筆記

【自言自語】對於數據庫sql語言,以前都是用的時候再查,沒有系統的瞭解,用了一天半把這個書看完了,因此須要總結一下,不過,我沒有寫遊標、存儲過程這些,由於我以爲書中講的過淺了。等下一本書看完,或許有更好的理解。到時候,再寫關於那幾個方面的我以爲是不錯的。這段時間抓緊時間啃書啊,書越借越多。

SQL和Java、C不同,他只有不多的詞。他不是某個特定數據庫提供商專有的語言。幾乎全部重要的DBMS都支持SQL,可是有些細節地方仍是要去看該DBMS的詳細文檔。web

數據庫增刪改查操做

1、建立數據庫

CREATE DATABASE test;sql

2、查看數據庫

  1. SHOW DATABASES;
  2. 查看當前數據庫
    • SELECT DATABASE();直接能夠看出數據庫名稱
    • SHOW TABLES;查看全部表操做也能夠顯示出數據庫名稱

3、切換指定數據庫

USE test;數據庫

4、建立表

CREATE TABLE client( ​ id INT, ​ age INT, ​ name VARCHAR(20), ​ gender VARCHAR(1) );svg

5、查看錶數據

DESC client;函數

6、增刪改查

1. 增

  • INSERT INTO client VALUES(1,20,'zhangsan','female'); 插入全部字段
  • INSERT INTO client(id,name) VALUES(2,'zhansgan'); 插入部分字段
    • 省略的列須要被定義爲容許NULL值(無值或空值)
    • 在表中給出默認值。表示若是不給出值,將使用默認值。
  • INSERT INTO client(id,name) SELECT id,name from oldClient;
    • 插入檢索出的語句,它能夠用一條INSERT插入多行,無論SELECT返回多少行,都將被INSERT插入。
  • Create TABLE CustCopy AS SELECT * from Customers;
    • 建立一個新表,將Customers表的總體內容複製到新表中。

2. 改

  • UPDATE client SET gender='female'; 修改全部數據(使用較少),修改範圍較大。
  • UPDATE client SET gender='mael' WHERE id=1; 修改部分數據(使用較多),修改範圍較小
  • UPDATE client SET gender='male' , age=30 WHERE id=2;修改多個字段,中間用英文逗號分隔。

3. 刪

  • DELETE FROM client;刪除該表的全部數據,能夠帶條件刪除。
    • 若執行該指令,只會刪除table的全部數據,可是不能刪除表的約束。例如自增加的繼續增加。
    • 使用該指令,刪除的數據能夠回滾。
  • DELETE FROM client WHERE id=2;刪除帶條件的數據。
  • TRUNCATE TABLE client;全表刪除,不能帶條件刪除。

4. 查詢數據(基於一張表)

查詢出來的順序未必是按照 存放的順序。性能

4.1 查詢全部列

SELECT * FROM client查詢全部列 *表明全部
``學習

4.2 查詢制定列

SELECT id,name,FROM client;
SELECT id, AS '編號',name AS '姓名' FROM client AS 's';查詢時指定別名(as),再多表查詢時,常用!測試

4.3 查詢時添加常量列

SELECT id,name ,'常量列' AS ‘常數列的表頭’ FROM cilent;spa

4.4 查詢是合併列

SELECT id,name (a2+a3) AS '新項目' FROM client;只能合併數值類型code

4.5 查詢時去除重複記錄

SELECT DISTINCT gender FROM client;
SELECT DISTINCT(gender) FROM client;

**PS:**不能部分使用DISTINCT:

  • 該關鍵字做用於全部的列,不只僅是跟在其後的那一列。
  • 例如你指定select distinct id,name,除非指定的兩列徹底相同,不然全部的行都會被檢索出來。
4.6 條件查詢
  • 邏輯條件 and or
    SELECT * FROM client WHERE id=2 AND name='zhangsan';兩個字段以上的之間必定會有邏輯關係!

  • 比較條件 > 、<、 >=、 <=、 ==、 <>或!=(不等於) between and
    SELECT * FROM client WHERE 指定項>=70 AND 指定項2<=90;
    SELECT * FROM client WHERE 制定項 BETWEEN 70 AND 95
    SELECT * FROM client WHERE gender <> 'male';尋找性別不爲男的數據。

    SELECT * FROM client WHERE age in (16,18)

    • IN:Where子句中用來指定要匹配值的清單的關鍵字,功能和OR至關。
    • IN操做符通常比一組OR操做符執行的更快。
  • 判空(null / 空字符串) is null /is not null
    NULL :沒有值
    空字符串 :有值。
    SELECT * FROM client WHERE address IS NULL ;判斷NULL
    SELECT * FROM client WHERE address='';判斷空字符串
    SELECT * FROM client WHERE address IS NULL OR address='';包括NULL和空字符串。

    SELECT * FROM client WHERE address IS NOT NULL AND address<>'';

  • 模糊查詢

    只適用於字符串類型。

    一般使用如下替換標記

    • %:表示任意字符出現任意次數(能夠是0次)
    • _:(下劃線)表示一個字符。
    • []:指定一個字符集,
    • SELECT * FROM client WHERE name LIKE 'zhang%';
      SELECT * FROM client WHERE name LIKE 'zhang_' ;
4.7 彙集函數

經常使用的彙集函數:sum() avg() max() min() count()

這些函數都很高效,它們返回的結果通常比你在本身的客戶端應用程序中計算要快得多。

  • AVG()返回某列的平均值
    • select avg(prod_price) AS avg_price from products;
    • 該函數忽略列值爲NULL的行。
  • COUNT()返回某列的行數
    • 使用count(*)對錶中的行數目進行計數。(不忽略NULL值)
    • 使用count(列名)一樣也是對錶中該列的行數目進行計數。(忽略NULL值)
  • MAX()返回某列的最大值
    • 用於文本數據時,MAX()返回該列排序後的最後一行。
    • 忽略值爲NULL的行
  • MIN()返回某列的最小值
    • 用於文本數據時,MAX()返回該列排序後的最前面的行。
    • 忽略值爲NULL的行
  • SUM()返回某列值之和
    • 忽略值爲NULL的行
    • select sum(item_price*quantity) AS total_price from OrderItems where order_num = 20005;
4.8 分頁查詢 (limit 起始行,查詢幾行)

起始行從0開始
select * from client limit 0,2;

4.9 查詢排序(order by
4.9.1 按多個列排序

select prod_id,prod_price,prod_name from products order by prod_price,prod_name;
先按照 prod_price進行排序,而後按照prod_name進行排序。

4.9.2 按列位置排序

select prod_id,prod_price,prod_name from products order by 2,3;
select清單中指定的是列的相對位置而不是列名。
order by 2.3表示先按prod_price排序,再按照prod_name進行排序。

4.9.3 指定排序方向

**PS:**若是想在多個列上進行降序排序,必須對每一列指定DESC關鍵字。
asc:順序,反序。數值:遞增,字母:天然順序。
desc:反序。

4.11分組查詢(group by)

分組篩選後查詢

七. 數據處理

1. 建立計算字段
  • 拼接字段(例如:拼接兩個字符串)
    • select province + '('+county+')' AS userAddress from address order by county;
  • 執行算術計算
    • select id,count,price,count*price AS money from OrderItems;
    • 算術操做符有四種。+-*/
2. 使用函數處理數據

​ 因爲每一個DBMS都有本身的特性,因此這裏就不列出每一個DBMS的函數。只舉例說明如何運用。

2.1 文本處理函數
  • UPPER()將文本轉換成大寫。
    • select vend_name,UPPER(vend_name) AS vend_name_upcase from vendors order by vend_name
  • RTRIM()去掉字符串右邊的空格。
  • LTRIM()去掉字符串左邊的空格。
  • TRIM()去掉字符串中的空格。
2.2數值處理函數
  • abs()返回一個數的絕對值
  • cos()返回一個角度的餘弦
  • exp()返回一個數的指數值
  • PI()返回圓周率
2.3 日期處理函數
  • Year()返回日期的年份。(Mysql)
3 分組數據
3.1 建立分組

select vend_id,count(*) as num_prods from products group by vend_id;

  • Group By子句能夠包含任意數目的列,於是能夠對分組進行嵌套。
  • Group By子句必須出如今Where子句以後,Order By子句以前。1
3.2 過濾分組

select vend_id,count(*) AS orders from Orders Group By cust_id HAVING count(*) >=2

Having來過濾分組,上一句SQL語句的意思是 對小於兩個訂單的分組進行過濾。

wherehaving的區別:

  • 前者是在數據分組前進行過濾,後者實在數據分組後進行過濾。
  • where排除的行不在這些分組中。
  • 使用HAVING時應該結合GROUP BY子句,而WHERE子句用於標準的行級過濾。
3.3 分組和排序

Group byORDER BY常常完成相同的工做,但他們很是不一樣。

  • 前者對行進行分組,但輸出可能不是分組的順序;後者對產生的輸出排序。
  • 通常在使用GROUP BY 子句時,應該也給出ORDER BY子句,這是保證數據正確排序的惟一方法。

select order_num , count(*) AS items from orderItems group by oredr_num having count(*) >=3 order by items,oredr_num;

3.4 SELECT 子句的順序

select(必) .....from.....where ....group by .... having .....order by

4. 子查詢

sql中容許子查詢,即嵌套在其餘查詢中的查詢。

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

select cust_id from orders where order_num IN ( select order_num from orderItems where prod_id = 'RGAN01'); select cust_id from orders where order_num IN ( select order_num from orderItems where prod_id = 'RGAN01');

在實際的DBMS中,實際上執行了兩個操做。

再好比:

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 = '45274' ) ); 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 = '45274' ) );

上述sql代碼執行了三個 select子語句。

對於能嵌套的子查詢的數目沒有限制,不過在實際使用時因爲性能的限制,不能嵌套太多的子查詢。

PS:

  • 做爲子查詢的select語句能查詢單個列
  • 使用子查詢並不老是執行這類數據檢索的最有效的方法。
select cust_name,cust_state,( select count(*) from orders where orders.cust_id = Customers.cust_id) As orderNUM ) from customers order by cust_name; select cust_name,cust_state,( select count(*) from orders where orders.cust_id = Customers.cust_id) As orderNUM ) from customers order by cust_name;

order是一個計算字段,她是由圓括號中的子查詢創建的。該子查詢對檢索出的每一個顧客執行一次。

cuwstomers.cust_id.是全限定列名。

5. 聯結表

關於什麼 是聯結,請上百度搜索,百度比我講的清楚。我只簡單的點一下。

數據存儲在多個表中,有些業務須要將他們聯繫起來,檢索出來。

聯結是一種機制,用來在一條SELECT語句中關聯表,所以稱爲聯結

使用特殊的語法,能夠聯結多個表返回一組輸出。

5.1 建立聯結

簡單寫法:

select vend_name,prod_name,prod_price from vendors,Products where vendors.vend_id = Products.vend_id; select vend_name,prod_name,prod_price from vendors,Products where vendors.vend_id = Products.vend_id;

**PS:**在引用的列名會產生歧義時,必須使用徹底限定列名。

上邊使用的聯結方式稱爲等值聯結,它基於兩個表之間的相等測試,這種聯結也成爲內聯結

另一種標準寫法:

select vend_name,prod_name,prod_price from vendors INNER JOIN Products on vendors.vend_id = Products.vend_id; select vend_name,prod_name,prod_price from vendors INNER JOIN Products on vendors.vend_id = Products.vend_id;

兩個表之間的關係是以INNER JOIN指定的部分FROM子句。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE

至於選用哪一種方法就須要看具體的DBMS文檔。

5.2 聯結多個表
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 = 20007; 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 = 20007;

不要聯結沒必要要的表,聯結的表越多,性能降低的越厲害。

6 建立高級聯結
6.1 使用表別名
  • 使用表別名 from 表名 AS 別名

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

6.2 使用不一樣類型的聯結
  • 自聯結

    一般做爲外部語句喲個來替代從相同表中檢索數據的子查詢語句。雖然結果相同,可是使用聯結要比使用子查詢效率高不少。

    • 使用子查詢:select id, name,address from user where address = (select address from user where age = 15);
    • 使用自聯結:select c1.name from user as c1,user as c2 where c1.address = c2.address and c2.age = 15;
  • 天然聯結

    • 實際上,咱們創建的每一個內聯結都是天然聯結。
  • 外聯結

    有兩種外聯結形式,它們之間的惟一差異是所關聯的表的順序。

    • 左外聯結LEFT OUTER JOIN 包含其全部行的表在左邊
    • 右外聯結RIGHT OUTER JOIN包含其全部行的表在右邊

8、使用視圖

1. 視圖是什麼?

視圖是虛擬的表。與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。

他不包含任何列和數據,包含的只是一個查詢。

2. 視圖有什麼做用?

  • 簡化複雜的SQL操做。在編寫查詢業務時,直接重用,不須要知道實現的細節。
  • 保護數據(能夠受權用戶訪問表的特定部分的權限,而不是整個表的訪問權限)
  • 更改數據格式和表示。

3. 如何建立視圖?

那先說一下 視圖的規則和限制。(詳細的仍是要根據所使用的DBMS來決定)

  • 與表同樣,視圖必須惟一命名。
  • 建立視圖,必須有足夠的訪問權限

建立視圖:

CREATE VIEW ProductCustomers AS Select cust_name,cust_contact,prod_id from customers,Orders,OrderItems where customers.cust_id = Orders.cust_id and OrderItems.order_num = Orders.order_num; CREATE VIEW ProductCustomers AS Select cust_name,cust_contact,prod_id from customers,Orders,OrderItems where customers.cust_id = Orders.cust_id and OrderItems.order_num = Orders.order_num;

這個 叫ProductCustomers的視圖,他聯結了三個表,返回已訂購了任意產品的全部顧客的列表。

好比,咱們檢索訂購了產品id爲0001紀梵希的顧客。

select cust_name,cust_contact from ProductCustomers where prod_id = '0001'; select cust_name,cust_contact from ProductCustomers where prod_id = '0001';

實際執行上邊的sql語句,視圖中的select會先執行。

用視圖重更新格式化檢索出的數據

create view viewTest AS select RTRIM(province) + '('+RTRIM(county)+')' AS address from User; create view viewTest AS select RTRIM(province) + '('+RTRIM(county)+')' AS address from User;

該試圖將用戶的省份和國籍進行格式化輸出。

End

SQL基本的會用以後,學習原理就相對來講簡單,更有針對性。

相關文章
相關標籤/搜索