MySQL基本操作


寫在前面

最近在學習數(shù)據(jù)庫,將學習概要記錄于此栖袋,學習的知識主要來源于 <<MySQL必知必會>>塘幅,下文中涉及相關(guān)的數(shù)據(jù)表均來源于書中提供的樣例表create.sql,populate.sql


  • 創(chuàng)建數(shù)據(jù)庫

create database study;
  • 查看數(shù)據(jù)庫

show databases;
  • 使用數(shù)據(jù)庫

use study;
  • 導入數(shù)據(jù)表

source create.sql;
source populate.sql;
  • 查看表結(jié)構(gòu)信息

DESC tablename;
  • 檢索數(shù)據(jù)

- 檢索單列
SELECT cust_name FROM customers;
- 檢索多列
SELECT cust_id,cust_name, cust_address FROM customers;
- 檢索所有列
SELECT * FROM customers;
- 檢索不同的行
SELECT DISTINCT cust_country FROM customers;

說明:
DISTINCT關(guān)鍵字是作用于所有的列,而不僅僅是前置它的列钝尸,例如SELECT DISTINCT cust_country, cust_id FROM customers; 意思是customers表中cust_countrycust_id都不同的行有哪些

- 限制結(jié)果
-- 指示返回不多于2行
SELECT cust_name FROM customers LIMIT 2;
-- 指示返回行數(shù)從行1開始的2行結(jié)果
SELECT cust_name FROM customers LIMIT 1,2;

說明:
行的下標起始從0開始珍促,行0是第一行,行1是第二行

- 限定表名/數(shù)據(jù)庫名檢索
SELECT customers.cust_name FROM customers;
SELECT customers.cust_name FROM study.customers;
- 排序數(shù)據(jù)檢索
SELECT cust_id,cust_name FROM customers ORDER BY cust_id;
- 多列排序檢索
SELECT cust_id, cust_name FROM customers ORDER BY cust_name, cust_id;
- 指定方向檢索
SELECT cust_id, cust_name FROM customers ORDER BY cust_id DESC;

說明:
默認ASC升序

- 過濾數(shù)據(jù)檢索
-- where子句操作符號
SELECT prod_name, prod_price FROM products where prod_price = 2.5;
SELECT prod_name, prod_price FROM products where prod_price BETWEEN 2.5 AND 10;
-- 空值檢索
SELECT prod_name, prod_price FROM products where prod_price IS NULL;

MySQL子句操作符

操作符 說明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的兩個值之間
- where子句組合過濾
-- AND且操作
SELECT prod_name, prod_price FROM products where prod_price >2.5 and prod_id < 5
-- OR或操作
SELECT vend_id,prod_name FROM products WHERE vend_id = 1001 OR vend_id = 1002;

說明:
ANDOR 操作符組合建立一個WHERE子句,SQL在處理OR操作符前锦积,優(yōu)先處理AND操作符
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 and prod_price >= 10;等同于
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR (vend_id = 1003 and prod_price >= 10);

- IN操作符
SELECT vend_id,prod_name,prod_price FROM products WHERE vend_id IN (1002,1003);
-- 等同于:
SELECT vend_id,prod_name,prod_price FROM products WHERE vend_id = 1002 or vend_id = 1003;
- NOT操作符
SELECT vend_id,prod_name,prod_price FROM products WHERE vend_id NOT IN(1002,1003);

說明:
MySQL數(shù)據(jù)NOT可支持對IN, BETWEENEXISTS子句取反

- 通配符過濾
-- LIKE 操作符
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

說明:
"%"匹配0/1/N多個字符背蟆,"_"匹配單個字符

- 正則檢索
-- 基本字符
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '1000';

-- '或'匹配
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '1000|2000';

-- 幾個字符之一匹配
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[123] ton';
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '1|2|3 ton';
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[^123] ton';

-- 范圍匹配
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[1-5] ton';

--特殊字符匹配(特殊字符需要前置'\\'進行引導)
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '\\.';

-- 匹配字符類
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[:alnum:]';

匹配字符類

字符類 說明
[:alnum:] 任意字母和數(shù)字([a-zA-Z0-9])
[:alpah:] 任意字符([a-zA-Z])
[:blank:] 空格和制表([\\t])
[:cntrl:] ASCII控制字符(ASCII 031127)
[:digit:] 任意數(shù)字([0-9]
[:graph:] [:print:]相同志珍,但是不包括空格
[:lower:] 任意小寫字母([a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在內(nèi)的任意字符
[:upper:] 任意大寫字母([A-Z])
[:xdigit:] 任意十六進制數(shù)字([a-fA-F0-9])
- 匹配多個實例
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '.anvil';
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP "a*il";

正則表達式重復元字符

元字符 說明
* 0個或多個匹配
+ 1個或多個匹配({1,})
? 0個或1個匹配({0,1})
{n} 指定數(shù)目匹配
{n,} 不少于指定數(shù)目的匹配
{n,m} 匹配數(shù)目的范圍(m不超過255)

說明:
*在通配符和正則表達式中有其不一樣的地方敛纲,在通配符中*可以匹配任意的0個或多個字符载慈,而在正則表達式中他是重復之前的一個或者多個字符,不能獨立使用的寡具。比如通配符可以用*來匹配任意字符童叠,而正則表達式不行,他只匹配任意長度的前面的字符,通過使用.*匹配任意字符杜秸。

- 定位符
SELECT prod_id, prod_name FROM products WHERE prod_name REGEXP "^[0-9].*";

定位元字符

元字符 說明
^ 文本開始
$ 文本結(jié)尾
[[:<:]] 詞的開始
[[:>:]] 詞的結(jié)尾
- 計算別名
SELECT prod_id, quantity,item_price, quantity * item_price AS expanded_price FROM orderitems;
  • 函數(shù)

- 拼接函數(shù)
SELECT CONCAT(quantity,' : ', item_price) AS result FROM orderitems;
- 文本處理函數(shù)
SELECT vend_name, UPPER(vend_name) FROM vendors;
SELECT vend_name, LEFT(vend_name,1) FROM vendors;
SELECT vend_name, LENGTH(vend_name) FROM vendors;
SELECT vend_name, LOCATE('LT',vend_name) FROM vendors;
SELECT vend_name, LTRIM(vend_name)FROM vendors;
SELECT vend_name, SUBSTRING(vend_name FROM 1 FOR 2)FROM vendors;
SELECT vend_name, SUBSTRING(vend_name,1,2)FROM vendors;substring

常用處理函數(shù)

文本函數(shù) 說明
LEFT() 返回串左邊的字符
RIGHT() 返回串右邊的字符
LENGTH() 返回串的長度
LOCATE() 返回串的一個子串
LOWER() 將串轉(zhuǎn)換為小寫
UPPER() 將串轉(zhuǎn)換為大寫
LTRIM() 將串左邊的空格去掉
RTRIM() 將串右邊的空格去掉
SUBSTRING() 返回子串的字符
日期和時間處理函數(shù) 說明
ADDDATE() 增加一個日期(天其障、周等)
ADDTIME() 增加一個時間(時粮揉、分等)
CURDATE() 返回當前日期
CURRENT_TIME() 返回當前時間
DATE() 返回日期時間的日期部分
DATEDIFF() 計算兩個日期之差
DATE_ADD() 高度靈活的日期運算函數(shù)
DATE_FORMAT() 返回一個格式化的日期或時間串
DAY() 返回一個日期的天數(shù)部分
DAYOFWEEK() 返回一個日期對應(yīng)的星期幾
HOUR() 返回一個時間的小時部分
MINUTE() 返回一個時間的分鐘部分
MONTH() 返回一個日期的月份部分
NOW() 返回當前日期和時間
SECOND() 返回一個時間的秒部分
TIME() 返回一個日期時間的時間部分
YEAR() 返回一個日期的年份部分
例: SELECT order_num FROM orders where DATE(order_date) = '2005-09-01';

說明:
數(shù)值處理函數(shù)
ABS()/COS()/EXP()/MOD()/PI()/RAND()/SIN()/SQRT()/TAN()
SELECT ABS(order_num) from orders ;
聚集函數(shù)
AVG()/COUNT()/MAX()/MIN()/SUM()

  • 分組

- 創(chuàng)建分組
SELECT vend_id,COUNT(*) FROM products GROUP BY vend_id;
- 過濾分組
SELECT vend_id,COUNT(*) FROM products GROUP BY vend_id HAVING COUNT(*) >= 2;
- 分組和排序
SELECT vend_id,COUNT(*) AS num FROM products GROUP BY vend_id ORDER BY num;

說明:
1.SELECT 子句書寫順序總結(jié)(SELECT->FROM->WHERE->GROUP BY->HAVING->ORDER BY->LIMIT)
2.執(zhí)行順序:FROM->WHERE->GROUP BY->聚集函數(shù)計算->HAVING->SELECT->ORDER BY

  • 子查詢

- 子查詢
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders
WHERE orders.cust_id = customers.cust_id) as od FROM customers ORDER BY cust_name;
  • 聯(lián)結(jié)表

- 創(chuàng)建聯(lián)結(jié)表
SELECT vend_name, prod_name FROM vendors, products WHERE vendors.vend_id = products.vend_id;

- 內(nèi)部聯(lián)結(jié)
SELECT vend_name, prod_name FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;

- 自聯(lián)結(jié)
SELECT p1.prod_id, p1.prod_name FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.vend_id;

- 外部聯(lián)結(jié)
SELECT customers.cust_id, orders.order_num FROM customers RIGHT OUTER JOIN orders ON orders.cust_id = customers.cust_id;
SELECT customers.cust_id, orders.order_num FROM customers LEFT OUTER JOIN orders ON orders.cust_id = customers.cust_id;

說明:
與內(nèi)部聯(lián)結(jié)關(guān)聯(lián)兩個表中的行不同的是膨蛮,外部聯(lián)結(jié)還包括沒有關(guān)聯(lián)行的行敞葛。左外部聯(lián)結(jié)、右外部聯(lián)結(jié)之間的差別是所關(guān)聯(lián)的表的順序不一樣

  • 組合查詢

SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price <= 5
UNION
SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN(1001,1002);

說明:
UNION 從查詢結(jié)果集中自動去除重復的行氨肌,如果想返回所有匹配行,可使用 UNION ALL.

  • 插入數(shù)據(jù)

-- 插入完整的行
INSERT INTO
customers
(
    cust_name,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
)
VALUES('Jack','100 street','Los Angeles','CA','9004','USA');

--插入多行
INSERT INTO
customers
(
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
)
VALUES('Jack','100 street','Los Angeles','CA','9004','USA')
VALUES('mao','100 street','Los Angeles','CA','9004','USA');

--插入檢索出的數(shù)據(jù)
INSERT INTO
customers
(
    cust_id,
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
)SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country FROM customers;
  • 更新與刪除數(shù)據(jù)

UPDATE customers SET cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;
UPDATE customers SET cust_email = 'elmer@fudd.com',cust_name = 'The Fudds' WHERE cust_id = 10005;
UPDATE customers SET cust_email = NULL WHERE cust_id = 10005;
DELETE FROM customers WHERE cust_id = 10006;
TRUNCATE TABLE customers;
  • 創(chuàng)建表

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;

說明:
1.NULL 不是空串, NULL 值是沒有值贩虾,它不是空串捧灰, ' '空串是一個有效的值
2.AUTO_INCREMENT,本列每增加一行時自動增量
3.PRIMARY KEY 指定表的主鍵,用于唯一標識表中每個行的列蔽午,主鍵不允許NULL值得列
4.ENGINEInnoDB(可靠的事務(wù)處理引擎)/MyISAM(性能高抽莱,但不支持事務(wù)處理)/MEMORY(數(shù)據(jù)存儲在內(nèi)存,不在磁盤中,速度快斟叼,一般適用于臨時表)

  • 更新表

ALTER TABLE vendors ADD vend_phone CHAR(20);
  • 刪除表

DROP TABLE customers;
  • 重命名表

RENAME TABLE customers TO customers2;
RENAME TABLE backup_customers TO customers, backup_vendors TO vendors;
  • 視圖

創(chuàng)建視圖: CREATE VIEW
查看視圖:SHOW CREATE VIEW viewname;
刪除視圖:DROP VIEW viewname;

具體事例:
- 創(chuàng)建視圖
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;

- 查詢視圖
SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = 'TNT2';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢床,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖伟众,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先紫,死亡現(xiàn)場離奇詭異本冲,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門性昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧求,“玉大人,你說我怎么就攤上這事耗帕》卤悖” “怎么了体啰?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗽仪。 經(jīng)常有香客問我荒勇,道長,這世上最難降的妖魔是什么闻坚? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任枕屉,我火速辦了婚禮,結(jié)果婚禮上鲤氢,老公的妹妹穿的比我還像新娘搀擂。我一直安慰自己西潘,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布哨颂。 她就那樣靜靜地躺著喷市,像睡著了一般。 火紅的嫁衣襯著肌膚如雪威恼。 梳的紋絲不亂的頭發(fā)上品姓,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音箫措,去河邊找鬼腹备。 笑死,一個胖子當著我的面吹牛斤蔓,可吹牛的內(nèi)容都是我干的植酥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弦牡,長吁一口氣:“原來是場噩夢啊……” “哼友驮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驾锰,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卸留,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后椭豫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耻瑟,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年赏酥,在試婚紗的時候發(fā)現(xiàn)自己被綠了匆赃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡今缚,死狀恐怖算柳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姓言,我是刑警寧澤瞬项,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站何荚,受9級特大地震影響囱淋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜餐塘,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一妥衣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦税手、人聲如沸蜂筹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艺挪。三九已至,卻和暖如春兵扬,著一層夾襖步出監(jiān)牢的瞬間麻裳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工器钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留津坑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓傲霸,卻偏偏與公主長得像疆瑰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狞谱,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355