【自言自語】對於數據庫sql語言,以前都是用的時候再查,沒有系統的瞭解,用了一天半把這個書看完了,因此須要總結一下,不過,我沒有寫遊標、存儲過程這些,由於我以爲書中講的過淺了。等下一本書看完,或許有更好的理解。到時候,再寫關於那幾個方面的我以爲是不錯的。這段時間抓緊時間啃書啊,書越借越多。
SQL和Java、C不同,他只有不多的詞。他不是某個特定數據庫提供商專有的語言。幾乎全部重要的DBMS都支持SQL,可是有些細節地方仍是要去看該DBMS的詳細文檔。web
CREATE DATABASE test;
sql
SHOW DATABASES;
SELECT DATABASE();
直接能夠看出數據庫名稱SHOW TABLES;
查看全部表操做也能夠顯示出數據庫名稱USE test;
數據庫
CREATE TABLE client( id INT, age INT, name VARCHAR(20), gender VARCHAR(1) );
svg
DESC client;
函數
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;
Create TABLE CustCopy AS SELECT * from Customers;
UPDATE client SET gender='female';
修改全部數據(使用較少),修改範圍較大。UPDATE client SET gender='mael' WHERE id=1;
修改部分數據(使用較多),修改範圍較小UPDATE client SET gender='male' , age=30 WHERE id=2;
修改多個字段,中間用英文逗號分隔。DELETE FROM client;
刪除該表的全部數據,能夠帶條件刪除。
DELETE FROM client WHERE id=2;
刪除帶條件的數據。TRUNCATE TABLE client;
全表刪除,不能帶條件刪除。查詢出來的順序未必是按照 存放的順序。性能
SELECT * FROM client
查詢全部列 *表明全部
``學習
SELECT id,name,FROM client;
SELECT id, AS '編號',name AS '姓名' FROM client AS 's';
查詢時指定別名(as),再多表查詢時,常用!測試
SELECT id,name ,'常量列' AS ‘常數列的表頭’ FROM cilent;
spa
SELECT id,name (a2+a3) AS '新項目' FROM client;
只能合併數值類型code
SELECT DISTINCT gender FROM client;
SELECT DISTINCT(gender) FROM client;
**PS:**不能部分使用DISTINCT
:
select distinct id,name
,除非指定的兩列徹底相同,不然全部的行都會被檢索出來。邏輯條件 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至關。判空(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_' ;
經常使用的彙集函數:sum()
avg()
max()
min()
count()
。
這些函數都很高效,它們返回的結果通常比你在本身的客戶端應用程序中計算要快得多。
AVG()
返回某列的平均值
select avg(prod_price) AS avg_price from products;
NULL
的行。COUNT()
返回某列的行數
count(*)
對錶中的行數目進行計數。(不忽略NULL
值)count(列名)
一樣也是對錶中該列的行數目進行計數。(忽略NULL
值)MAX()
返回某列的最大值
MIN()
返回某列的最小值
SUM()
返回某列值之和
select sum(item_price*quantity) AS total_price from OrderItems where order_num = 20005;
起始行從0開始
select * from client limit 0,2;
order by
)select prod_id,prod_price,prod_name from products order by prod_price,prod_name;
先按照 prod_price
進行排序,而後按照prod_name
進行排序。
select prod_id,prod_price,prod_name from products order by 2,3;
select清單中指定的是列的相對位置而不是列名。
order by 2.3
表示先按prod_price
排序,再按照prod_name
進行排序。
**PS:**若是想在多個列上進行降序排序,必須對每一列指定DESC
關鍵字。
asc
:順序,反序。數值:遞增,字母:天然順序。
desc
:反序。
分組篩選後查詢
select province + '('+county+')' AS userAddress from address order by county;
select id,count,price,count*price AS money from OrderItems;
+
、-
、*
、/
。 因爲每一個DBMS都有本身的特性,因此這裏就不列出每一個DBMS的函數。只舉例說明如何運用。
UPPER()
將文本轉換成大寫。
select vend_name,UPPER(vend_name) AS vend_name_upcase from vendors order by vend_name
RTRIM()
去掉字符串右邊的空格。LTRIM()
去掉字符串左邊的空格。TRIM()
去掉字符串中的空格。abs()
返回一個數的絕對值cos()
返回一個角度的餘弦exp()
返回一個數的指數值PI()
返回圓周率Year()
返回日期的年份。(Mysql)select vend_id,count(*) as num_prods from products group by vend_id;
Group By
子句能夠包含任意數目的列,於是能夠對分組進行嵌套。Group By
子句必須出如今Where子句以後,Order By
子句以前。1select vend_id,count(*) AS orders from Orders Group By cust_id HAVING count(*) >=2
用Having
來過濾分組,上一句SQL語句的意思是 對小於兩個訂單的分組進行過濾。
where
與having
的區別:
HAVING
時應該結合GROUP BY
子句,而WHERE
子句用於標準的行級過濾。Group by
和ORDER 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;
select(必) .....from.....where ....group by .... having .....order by
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 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
加.
是全限定列名。
關於什麼 是聯結,請上百度搜索,百度比我講的清楚。我只簡單的點一下。
數據存儲在多個表中,有些業務須要將他們聯繫起來,檢索出來。
聯結是一種機制,用來在一條SELECT語句中關聯表,所以稱爲聯結。
使用特殊的語法,能夠聯結多個表返回一組輸出。
簡單寫法:
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文檔。
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;
不要聯結沒必要要的表,聯結的表越多,性能降低的越厲害。
使用表別名 from 表名 AS 別名
表別名只在查詢執行中使用,與列別名不同,表別名不返回到客戶端。
自聯結
一般做爲外部語句喲個來替代從相同表中檢索數據的子查詢語句。雖然結果相同,可是使用聯結要比使用子查詢效率高不少。
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
包含其全部行的表在右邊視圖是虛擬的表。與包含數據的表不同,視圖只包含使用時動態檢索數據的查詢。
他不包含任何列和數據,包含的只是一個查詢。
那先說一下 視圖的規則和限制。(詳細的仍是要根據所使用的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;
該試圖將用戶的省份和國籍進行格式化輸出。
SQL基本的會用以後,學習原理就相對來講簡單,更有針對性。