1. 程式人生 > >SQL-基本學習I-基本SQL語法與概念

SQL-基本學習I-基本SQL語法與概念

目錄


最近參加了一些公司的實習生招聘的面試,發現很多基本的知識和概念已經很模糊了,很多東西需要重新學習一下,所以準備在學習的過程中,寫一些部落格,用來整理一下自己的思路。第一篇就從日常積累的SQL開始吧。

SQL注意

  • SQL的部分語法不是對所有的DBMS都統一的。許多DBMS廠商對SQL進行了擴充套件。本文主要是MySql為基礎。
  • SQL語句不區分大小寫。
  • SQL語句會忽略所有的空格。

1檢索

1.1基本檢索

1.1.1檢索單個列
select prod_name from products;

Note查詢結果未經過排序

1.1.2檢索多個列
select prod_id, prod_name, prod_price 
from products;
1.1.3檢索所有列
select * from products;
1.1.4檢索不同的值
select distinct vend_id from products;

Notedistinct關鍵字作用於所有的列,不僅僅是跟在其後的那一列。

1.1.5限制結果
select prod_name 
from products limit 5 offset 5;

Notelimit 5 offset 5返回從第5行起的5行資料。

1.2排序檢索

1.2.1按單個列排序
select prod_name 
from products 
order by prod_name;
1.2.2按多個列排序
select prod_id, prod_price, prod_name 
from products 
order by prod_price, prod_name;
1.2.3按列序號進行排序
select prod_id,prod_price,prod_name 
from products 
order by 2,3;

Note:在Sql注入中,經常使用這種方式進行資料表有多少列的判斷。

1.2.4降序排序
select prod_id, prod_price, prod_name 
from products 
order by prod_price desc;

Noteorder by 應該保證它是select語句中最後一條子句。

1.3過濾檢索

1.3.1使用where子句
select prod_name,prod_price 
from products 
where prod_price = 3.49;
1.3.2where子句操作符號
  • =
  • !=
  • <
  • >
  • <=
  • >=
  • between
  • is null
1.3.3組合where子句
select prod_name,prod_price 
from products 
where vend_id = 'DLL01' or vend_id = 'BRS01' and prod_price >= 10;
1.3.4使用IN
select prod_name,prod_price 
from products 
where vend_id in ('DLL01','BRS01') 
order by prod_name;
1.3.5使用LIKE

1%表示任何字元出現任意次數

select prod_id,prod_name 
from products 
where prod_name like '%Fish%';

2_只匹配單個字元

select prod_id,prod_name 
from products 
where prod_name like '__ inch teddy bear';

Note萬用字元的搜尋要耗費更長的處理時間

1.4處理檢索

1.4.1建立計算欄位
select prod_id,quantity,item_price,quantity*item_price as expanded_price 
from orderitems 
where order_num = 20008;
1.4.2聚集函式
select AVG(prod_price) as avg_price 
from products;
select COUNT(*) as num_cust 
from customers;
select max(prod_price) as max_price 
from products;
select min(prod_price) as min_price 
from products;
select sum(quantity) as items_ordered 
from orderitems 
where order_num =2005;
select count(*) as num_items, min(prod_price) as price_min,max(prod_price) as price_max,avg(prod_price) as price_avg 
from products;
1.4.3分組資料
select vend_id,count(*) as num_prods 
from products 
group by vend_id;
select cust_id,count(*) as orders 
from orders 
group by cust_id 
having count(*)>=2;

Notehaving用於分組中的條件查詢

1.4.4使用子查詢
select cust_id from orders 
where order_num in (select order_num from orderitems where prod_id = 'rgan01');

Note先執行子查詢,再執行外邊的查詢

1.4.5組合查詢

union將多個查詢作為一個查詢結果集返回,取多個查詢的並集,並自動去除重複行

select cust_name,cust_contact,cust_email from customers 
where cust_state in('IL','IN','MI')
union
select cust_name,cust_sontact,cust_emial from customers 
where cust_name = 'Fun4All';

2其他操作

2.1插入資料

insert into customers(cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country,cust_contact,cust_email)
values ('100000006','Toy Land','123 Any Street','New york','NY','11111','USA',NULL,NULL);

2.2更新資料

update customers set cust_email = '[email protected]'
where cust_id = '100005';

2.3刪除資料

delete from customers where cust_id = '100006';

2.4建立表

CREATE TABLE `tb_test` 
(
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`en_name` VARCHAR(10) NULL DEFAULT '',
	`ch_name` VARCHAR(10) NULL DEFAULT '',
	`sex` VARCHAR(5) NULL DEFAULT '',
	`school` VARCHAR(100) NULL DEFAULT '',
	`age` DOUBLE(10,2) NULL DEFAULT '0.00',
	`test3` VARCHAR(100) NULL DEFAULT '',
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci';

2.5刪除表

drop table `tb_test`;

3擴充套件

3.1SQL執行順序

from>join>on>where>*
group by>avg sum>having>
select>distinct>union>order by
Note在給表起別名的時候,要放在from子句中

3.2聯結表

3.2.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 inner join products on vendors.vend_id = products.vend_id;
3.2.2外聯結

外連結會包括沒有關聯的行。
比如:每個顧客下的訂單進行計數,包括那些至今尚未下訂單的顧客

select customers.cust_id,orders.order_num 
from customers left join orders on customers.cust_id = orders.cust_id;

Note左聯結:左邊是一個大表,右邊是一個小表;以customers為基礎填表,orders不足填空

select customers.cust_id,orders.order_num 
from customers right outer join orders on orders.cust_id = customers.cust_id;

Note以orders為基礎,進行填表,不足補null

3.3檢視

  • 簡化複雜的sql操作,在編寫查詢後,可以方便地重用它而不必知道其基本查詢細節。
  • 使用表的一部分而不是整個表。
  • 檢視實際上是一些邏輯上的組合表。
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;

3.4事務處理

為了保證資料的一致性

  • 事務(transaction):指一組SQL語句。
  • 回退(rollback):指撤銷指定SQL語句的過程。
  • 提交(commit):指將未儲存的SQL語句結果寫入資料庫表。
  • 保留點(savepoint):事務可回退的時間點。
begin transaction 
... 
commit transaction

NoteSQL Server的一種寫法

3.5約束

3.5.1主鍵
3.5.2外來鍵

外來鍵必須為另一個表中的主鍵
外來鍵的用途是確保資料的引用完整性。它通常包括以下幾種:

  • 實體完整性,確保每個實體是唯一的(通過主鍵來實施)
  • 域完整性,確保屬性值只從一套特定可選的集合裡選擇
  • 關聯完整性,確保每個外來鍵或是NULL(如果允許的話)或含有與相關主鍵值相配的值

“外來鍵”約束的主要目的是控制儲存在外來鍵表中的資料,但它還可以控制對主鍵表中資料的修改。例如,如果在 publishers表中刪除一個出版商,而這個出版商的ID在titles表中記錄書的資訊時使用了,則這兩個表之間關聯的完整性將被破壞,titles表中該出版商的書籍因為與publishers表中的資料沒有連結而變得孤立了。

外來鍵約束防止這種情況的發生。如果主鍵表中資料的更改使之與外來鍵表中資料的連結失效,則這種更改是不能實現的,從而確保了引用完整性。

如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個表的外來鍵約束值相關,則該操作不可實現。若要成功更改或刪除外來鍵約束的行,可以先在外來鍵表中刪除外來鍵資料或更改外來鍵資料,然後將外來鍵連結到不同的主鍵資料上去。

外來鍵是用來控制資料庫中資料的資料完整性的,就是當你對一個表的資料進行操作和他有關聯的一個或更多表的資料能夠同時發生改變。這就是外來鍵的作用。

3.5.3唯一約束

保證數值只出現一次

3.5.4檢查約束

保證數值滿足一組指定的條件

3.6索引

可以給被建立索引的欄位進行恰當的排序,以加強搜尋常用列的效率。

3.7觸發器

為某些操作,指定一些特定的方法,當執行這些操作的時候,就會觸發方法。

3.8關係型資料庫設計原則

  • 相同的資料出現多次決不是一個件好事,這是關係資料庫設計的基礎。
  • 一類資料一個表,各表通過某些共同的值相互關聯。(這就是關係資料庫)

分開存放的好處:

  • 相同的資訊不會重複出。
  • 在變更資訊的時候,只需要修改一個地方就可以了。
  • 由於資料不重複,資料一致好保證。