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關係型數據庫設計原則

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

分開存放的好處:

  • 相同的信息不會重複出。
  • 在變更信息的時候,只需要修改一個地方就可以了。
  • 由於數據不重複,數據一致好保證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章