MySQL語法學習筆記
學習之道,非盡心竭力者不能進也!我是唧唧又唧唧,歡迎查看我的筆記,有問題歡迎交流探討。
SQL是一種結構查詢語言,用於查詢關係數據庫的標準語言,包括若干關鍵字和一致的語法,便於數據庫元件(表、索引、字段等)的建立和操縱。
1.MySQL建庫
1.1建庫語句
create database emp #建庫 名爲 emp
default character set utf-8 #設置該庫的默認編碼格式爲 utf-8
collate utf8_general_ci; #設置數據庫校對規則。不區分大小寫
示例中 utf8_bin將字符串中的每一個字符用二進制數據存儲,區分大小寫。utf8_genera_ci不區分大小寫,ci爲case insensitive的縮寫,即大小寫不敏感。utf8_general_cs區分大小寫,cs爲case sensitive的縮寫,即大小寫敏感。
1.2刪除庫
drop database emp;
2.建表
2.1建表模板
CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;
2.2 主鍵(PRIMARY KEY)
主鍵值必須唯一:表中的每個行必須具有唯一的主鍵值。
如果主鍵使用單個列,則它的值必須唯一。
迄今爲止我們看到的CREATE TABLE例子都是用單個列作爲主鍵。
PRIMARY KEY (cust_id)
如果使用多個列,則這些列的組合值必須唯一 。
創建由多個列組成的主鍵,應該以逗號分隔的列表給出各列名。
PRIMARY KEY (order_num,order_item)
主鍵中只能使用不允許NULL值的列,允許NULL值的列不能作爲唯一標識。
2.3AUTO_INCREMENT
AUTO_INCREMENT定義列爲自增的屬性,一般用於主鍵,每次執行一個INSERT操作時,數值會自動加1
使用的最簡單的編號是下一個編號,所謂下一個編號是大於當前最大編號的編號。例如,如果cust_id的最大編號爲10005,則插入表中的下一個顧客,可以具有等於10006的 cust_id 。
2.4 默認值
如果在插入行時沒有給出值,MySQL允許指定此時使用的默認值。默認值 用CREATE TABLE語句的列定義中的DEFAULT關鍵字指定
2.5 存儲引擎(ENGINE=InnoDB)
與其他DBMS一樣,MySQL有一個具體管理和處理數據的內部引擎。
在你使用CREATE TABLE語句時,該引擎具體創建表。
而在你使用SELECT語句 或進行其他數據庫處理時,該引擎在內部處理你的請求。
多數時候,此引擎 都隱藏在DBMS內,不需要過多關注它。
以下是幾個需要知道的引擎:
-
InnoDB是一個可靠的事務處理引擎,它不支持全文本搜索;
-
MEMORY在功能等同於MyISAM,但由於數據存儲在內存(不是磁盤)中,速度很快(特別適合於臨時表);
-
MyISAM是一個性能極高的引擎,它支持全文本搜索但不支持事務處理 。
2.6 ALTER TABLE 語句
ALTER TABLE 語句用於在已有的表中添加、刪除或修改列。
-- 表中添加列
ALTER TABLE customers
ADD cust_phone char(10)
-- 刪除表中的列(請注意,某些數據庫系統不允許這種在數據庫表中刪除列的方式)
ALTER TABLE customers
DROP COLUMN cust_phone
-- 改變表中列的數據類型
-- 修改數量字段的默認值爲80
ALTER TABLE customers
MODIFY COLUMN quantity int(11) null default 80 after prod_id
2.7 刪除表
DROP TABLE customers
3.SQL處理數據的基本方法
3.1 數據檢索(select 語句)
Select 語句語法
Select 檢索所有列
Select 檢索單個列
Select 檢索不同行
Select 的結果限定
# 描述表
DESC products;
# select 語句 檢索所有列
SELECT * FROM products;
# select 語句 檢索指定的多個列
SELECT prod_id,prod_name,prod_price FROM products;
# select 語句 檢索指定的一個列
SELECT vend_id FROM products;
# 去重,DISTINCT 關鍵詞用於返回唯一不同的值
SELECT distinct vend_id FROM products;
# 第1行開始,取前3行
SELECT * FROM products limit 3;
# 第4行開始,取3行
SELECT * FROM products limit 3,3;
3.2 數據排序
ORDER BY 關鍵字用於對結果集按照一個列或者多個列進行排序。
ORDER BY 關鍵字默認按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,可以使用 DESC 關鍵字。
# 先查看一下這次用的products表
SELECT * from products;
# 單個字段的排序 升序 降序
SELECT prod_id,prod_price from products
ORDER BY prod_price;
# 默認(ASC)是升序,desc 是降序,默認可以不寫
SELECT prod_id,prod_price from products
ORDER BY prod_price desc;
# 默認排序a-z ,反序就是z-a
SELECT prod_id,prod_price from products
ORDER BY prod_name desc;
# 多字段排序
SELECT prod_name,prod_price from products
ORDER BY prod_price,prod_name;
# 找出最便宜的產品
SELECT prod_name,prod_price from products
ORDER BY prod_price LIMIT 1;
# 找出最貴的產品
SELECT * from products
ORDER BY prod_price DESC LIMIT 1;
3.3 數據過濾
數據庫表一般包含大量的數據,很少需要檢索表中所有行。
通常只會根據特定操作或報告的需要提取表數據的子集。
只檢索所需數據需要指定搜索條件(search criteria)
搜索條件也稱爲過濾條件(filter condition)。
在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。
WHERE子句在表名 (FROM子句)之後給出。
3.3.1 使用Where子句
檢查單個值
不匹配檢查
# 篩選價格是2.5的產品
select * from products where prod_price = 2.5;
# 篩選價格是2.5的產品,並只顯示特定的字段
select prod_name,prod_price from products
where prod_price = 2.5;
# WHERE 條件操作符:=、>、<、>=、<=、<>/!=、between * and *(包含首尾)
select prod_name,prod_price from products
where prod_price >= 2.5 and prod_price <10
order by prod_price;
select prod_name,prod_price from products
where prod_price BETWEEN 2.5 and 10
order by prod_price;
練習:
找出價格低於10元的產品
找出價格不是供應商1003製造的產品
找出供應商1001,1003 製造的產品
select prod_name,prod_price from products
where prod_price < 10
order by prod_price;
select vend_id,prod_name,prod_price from products
where vend_id != 1003
order by prod_price;
select vend_id,prod_name,prod_price from products
where vend_id = 1001 or vend_id = 1003;
order by prod_price;
3.3.2 空值檢查
select * from products
where prod_desc is null
3.3.3 And、Or、In、Not操作及其計算次序
- AND & OR 運算符用於基於一個以上的條件對記錄進行過濾。
- 如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
- 如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
- 先and語句後執行or語句
# where 組合子句之 and 操作(交集)
select * from products where vend_id=1003 and prod_price <=10
ORDER BY prod_price;
# where 組合子句之 or 操作(並集)
select * from products where vend_id=1003 or vend_id =1002;
# where 組合子句之 AND 和 OR 的結合使用(使用圓括號來組成複雜的表達式)
SELECT * FROM products
WHERE prod_price <=10
AND (vend_id=1003 or vend_id =1002);
- IN 操作符允許在 WHERE 子句中規定多個值
- ‘=’ 規定一個值
# where 組合子句之 in 操作
select * from products where
vend_id in (1001,1005,1002);
# where 組合子句之 in 與 = 的轉換
select * from products where
vend_id = 1001 or vend_id = 1005 or vend_id = 1002;
# where 組合子句之 not 操作
select * from products where
vend_id not in (1002);
- not操作
# where 組合子句之 not 操作
select * from products where
vend_id not in (1002);
3.3.4 通配符(模糊匹配)
- 通配符可用於替代字符串中的任何其他字符。
- % 替代 0 個或多個字符
- “_” 替代1個字符。
- LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式
# 找到以 jet開頭的產品
select prod_id ,prod_name from products
where prod_name like 'jet%'
select prod_id ,prod_name from products
where prod_name like '%anvil%'
select prod_id ,prod_name from products
where prod_name like 's%e'
select prod_id ,prod_name from products
where prod_name like '_ ton anvil'
select prod_id ,prod_name from products
where prod_name like '__ ton anvil'
注意:
- 不要過度使用通配符,如果其他操作符能達到相同的目的,應優先使用其他操作符。
- 非必要情況下,不要把通配符用在搜索模式的開始處,因爲這樣搜索起來是最慢的。
- 仔細注意通配符的位置,如果放錯地方可能不會返回想要的數據。
4.SQL處理數據高級方法
4.1正則表達式
正則表達式 用特殊的字符集合與一個文本串進行比較,過濾檢索出想要的數據
- 正則表達式是用來匹配文本的特殊的串(字符集合)
- 如果你想從一個文本文件中提取電話號碼,可以使用正則表達式。
- 如果你需要查找名字中間有數字的所有文件,可以使用一個 正則表達式。
- 如果你想在一個文本塊中找到所有重複的單詞,可以使用一 個正則表達式。
- 如果你想替換一個頁面中的所有URL爲這些URL的實際 HTML鏈接,也可以使用一個正則表達式(對於最後這個例子,或者是兩個正則表達式)。
4.1.1基本字符串匹配
# 使用 like 關鍵字和通配符 %
select prod_name from products
where prod_name like '%1000';
# 使用正則表達式 REGEXP
select prod_name from products
where prod_name REGEXP '1000';
# 可以檢索出prod_name 中所有含有‘1000’的行
4.1.2 特殊字符“ .” 的使用
“ .” 在正則表達式中表示匹配任意一個字符
# 使用 like 關鍵字和通配符 _
select prod_name from products
where prod_name like 'JetPack _000';
# 使用正則表達式 REGEXP 和特殊字符“.”
select prod_name from products
where prod_name REGEXP '.000';
- 在這裏會不會有人覺得奇怪,“.” 表示的是匹配任意一個字符,但結果顯示的 JetPack 1000、JetPack
2000,000的前面可不止一個字符,爲什麼能這樣匹配呢? - 好好理解這句話 “正則表達式是用來匹配文本的特殊的串”
你會發現利用正則表達式我們可以匹配出相應字段中所有含有需要匹配的文本的行。例子中我們需要匹配的是‘.000’,.
可以代表任何一個字符,所以我們把 JetPack 1000、JetPack 2000
匹配出來了,1000,2000就是我們想要匹配的文本。不管他們前後還有沒有別的字符都會被查詢的到。 - 對比 關鍵字 like 與通配符的聯合使用就無法達到這種效果了。
4.1.3 使用 or 進行匹配(條件匹配)
此 or 不是真的 or ,而是使用豎線 “|” 表示搜索 兩個匹配文本串的其中一個
# 檢索prod_name 中所有含有‘1000’或者‘2000’的行
select prod_name from products
where prod_name REGEXP '1000|2000';
正則表達式中可使用多個 or 條件
select prod_name from products
where prod_name REGEXP '1000|2000|anvil';
4.1.4 []匹配
”[]“代表需要匹配[]中所包含的任意一個字符
4.1.4.1 匹配幾個字符之一
select prod_name from products
where prod_name REGEXP '[12] ton';
這裏使用正則表達式 [12] ton 。 [12] 定義了一組字符1,2;可以匹配 1 ton 或者 2 ton.
其實,[] 是另一種形式的 or 語句
4.1.4.2 匹配範圍
[]匹配[]中所包含的任意一個字符
[0-9] 匹配0到9的任意數字字符
[1-3] 匹配1到3的任意數字字符
[6-9] 匹配6到9的任意數字字符
[a-z] 匹配a到z 的任意字母字符
select prod_name from products
where prod_name REGEXP '[1-5] ton';
# 匹配1到5任意一個數字,所以返回了1 ton、2 ton、5 ton
4.1.4.3 排他符[^]
- [^] 匹配未包含在[]中的任意字符。即,將匹配除指定字符外的任何東西。
- 在集合開始處放置一個 ^
- 例如,[^12],會匹配除1,2外的任何東西
select prod_name from products
where prod_name REGEXP '[^345] ton'
# 不會出現 3 ton、4 ton、5 ton
4.1.5 特殊字符的匹配(. [] | -)
匹配特殊字符(. [] | -)時,需要使用 轉義符(兩個反斜槓\\)
\\- 表示查找 -,\\.表示查找 .
select prod_name from products
where prod_name REGEXP '\\.';
#查找 .
\\也用來引用元字符(具有特殊含義的字符)
元字符 | 說明 |
---|---|
\\f | 換頁 |
\\n | 換行 |
\\r | 回車 |
\\t | 製表 |
\\v | 縱向製表 |
4.1.6 匹配字符類
[:digit:] 任意數字 (同[0-9])
[:alnum:] 任意字母和數字 (同[a-zA-Z0-9])
[:alpha:] 任意字母 (同[a-zA-Z])
[:lower:] 任意小寫字母 (同[a-z])
[:upper:] 任意大寫字母 (同[A-Z])
select prod_name from products
where prod_name REGEXP '[[:digit:]]{4}'
4.1.7 匹配多個實例,重複元字符
元字符 | 說明 |
---|---|
* | 0個或多個匹配 |
+ | 1個或多個匹配 (同{1,}) |
? | 0個或1個匹配(同{0,1}) |
{n} | 指定數目的匹配 |
{n,} | 不少於指定數目的匹配 |
{n,m} | 匹配數目的範圍(m不超過255) |
#匹配連在一起的任意4位數字的行
select prod_name from products
here prod_name REGEXP '[[:digit:]]{4}';
select prod_name from products
where prod_name REGEXP '[0-9][0-9][0-9][0-9]';
select prod_name from products
where prod_name REGEXP '\\([0-9] sticks?\\)';
# \\( 、\\) 使用轉義符,[0-9]匹配1到9任意數字
#s? 中 使用 ?表示 s 可以出現0次或1次,所以出現了結果stick、sticks
- ? 匹配它前面的任何字符的0次或1次出現,換句話說,?前面的字符有(1個)或者沒有(0個)都能被匹配
4.1.8 定位符,元字符
元字符 | 說明 |
---|---|
^ | 文本的開始 |
$ | 文本的結尾 |
[[:<:]] | 詞的開始 |
[[:>:]] | 詞的結尾 |
select prod_name from products
where prod_name REGEXP '^[\\.]'
在這裏,我們可以回顧一下排他符[^ ]
總結一下^ 的用途:
1.在集合中 [^],表示不匹配集合所包含的字符
2.匹配輸入字符串的開始位置。