SQL指令學習( MySQL )

一. 開始使用

(下面所有的SQL語句是基于MySQL 5.7運行)

MySQL 為關系型數(shù)據(jù)庫(Relational Database Management System)翔曲,一個關系型數(shù)據(jù)庫由一個或數(shù)個表格組成, 如圖所示的一個表格:

data.jpg
  • 表頭(header): 每一列的名稱;
  • 列(col): 具有相同數(shù)據(jù)類型的數(shù)據(jù)的集合;
  • 行(row): 每一行用來描述某個人/物的具體信息;
  • 值(value): 行的具體信息, 每個值必須與該列的數(shù)據(jù)類型相同;
  • 鍵(key): 表中用來識別某個特定的人\物的方法, 鍵的值在當前列中具有唯一性。

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

語句:create database 數(shù)據(jù)庫名稱;

-- 創(chuàng)建一個名為 samp_db 的數(shù)據(jù)庫染服,數(shù)據(jù)庫字符編碼指定為 gbk
create database samp_db character set gbk;
drop database samp_db; -- 刪除 庫名為samp_db的庫
show databases;        -- 顯示 數(shù)據(jù)庫列表窑眯。
use samp_db;      -- 選擇 創(chuàng)建的數(shù)據(jù)庫samp_db
show tables;      -- 顯示 samp_db下面所有的表名字
describe 表名;    -- 顯示 數(shù)據(jù)表的結(jié)構(gòu)
delete from 表名; -- 清空 表中記錄

2. 創(chuàng)建表

語法:create table 表名稱(列聲明);

-- 如果數(shù)據(jù)庫中存在user_accounts表氏淑,就把它從數(shù)據(jù)庫中drop掉
DROP TABLE IF EXISTS `user_accounts`;
CREATE TABLE `user_accounts` (
  `id`             int(100) unsigned NOT NULL AUTO_INCREMENT primary key,
  `password`       varchar(32)       NOT NULL DEFAULT '' COMMENT '用戶密碼',
  `reset_password` tinyint(32)       NOT NULL DEFAULT 0 COMMENT '用戶類型:0-不需要重置密碼读整;1-需要重置密碼',
  `mobile`         varchar(20)       NOT NULL DEFAULT '' COMMENT '手機',
  `create_at`      timestamp(6)      NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
  `update_at`      timestamp(6)      NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  -- 創(chuàng)建唯一索引,不允許重復
  UNIQUE INDEX idx_user_mobile(`mobile`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
COMMENT='用戶表信息';

數(shù)據(jù)類型的屬性解釋

  • NULL:數(shù)據(jù)列可包含NULL值罐氨;
  • NOT NULL:數(shù)據(jù)列不允許包含NULL值臀规;
  • DEFAULT:默認值;
  • PRIMARY:KEY 主鍵岂昭;
  • AUTO_INCREMENT:自動遞增以现,適用于整數(shù)類型;
  • UNSIGNED:是指數(shù)值類型只能為正數(shù)约啊;
  • CHARACTER SET name:指定一個字符集邑遏;
  • COMMENT:對表或者字段說明;

二. 增刪改查( 重點 )

1. SELECT

SELECT 語句用于從表中選取數(shù)據(jù)恰矩。

語法:SELECT 列名稱 FROM 表名稱;
語法:SELECT * FROM 表名稱;

-- 從表 Persons 選取 LastName 列的數(shù)據(jù)
SELECT LastName FROM Persons;

-- 從表 users 選取 id=3 的數(shù)據(jù)记盒,并只取一條數(shù)據(jù)
SELECT * FROM users where id=3 limit 1;

2. UPDATE

Update 語句用于修改表中的數(shù)據(jù)。

語法:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

-- 更新表 orders 中 id=1 的那一行數(shù)據(jù)外傅,更新它的 title 字段
UPDATE orders set title='標題' WHERE id=1;

3. INSERT

INSERT INTO 語句用于向表格中插入新的行纪吮。

語法:INSERT INTO 表名稱 VALUES (值1, 值2,....);
語法:INSERT INTO 表名稱 (列1, 列2,...) VALUES (值1, 值2,....);

-- 向表 Persons 插入 字段 LastName = Wang 和 字段 Address = shanghai
INSERT INTO Persons (LastName, Address) VALUES ('wang', 'shanghai');

-- 向表 meeting 插入 字段 a=1 和 字段 b=2
INSERT INTO meeting SET a=1,b=2;

4. DELETE

DELETE 語句用于刪除表中的行。

語法:DELETE FROM 表名稱 WHERE 列名稱 = 值;

-- 在不刪除table_name表的情況下刪除所有的行萎胰,清空表碾盟。
DELETE FROM table_name;
-- 或者
DELETE * FROM table_name;

-- 刪除 表Person 字段 LastName = wang 
DELETE FROM Person WHERE LastName = 'wang';

-- 刪除 表meeting id 為2和3的兩條數(shù)據(jù)
DELETE from meeting where id in (2,3);

三. WHERE

WHERE 子句用于規(guī)定選擇的標準。

語法:SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值;

-- 從 表Persons 中選出 Year 字段大于 1965 的數(shù)據(jù)
SELECT * FROM Persons WHERE Year>1965;

四. AND 和 OR

AND - 如果第一個條件和第二個條件都成立技竟;
OR - 如果第一個條件和第二個條件中只要有一個成立冰肴;

1. AND

-- 刪除 meeting 表字段 
-- id=2 并且 user_id=5 的數(shù)據(jù)  和
-- id=3 并且 user_id=6 的數(shù)據(jù) 
DELETE from meeting where id in (2,3) and user_id in (5,6);

-- 使用 AND 來顯示所有姓為 "Carter" 并且 名為 "Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';

2. OR

-- 使用 OR 來顯示所有姓為 "Carter" 或者 名為 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter';

五. ORDER BY

語句默認按照升序?qū)τ涗涍M行排序。
ORDER BY - 語句用于根據(jù)指定的列對結(jié)果集進行排序。
DESC - 按照降序?qū)τ涗涍M行排序熙尉。
ASC - 按照順序?qū)τ涗涍M行排序( 默認 )联逻。

-- Company在表Orders中為字母,則會以字母順序顯示公司名稱
SELECT Company, OrderNumber FROM Orders ORDER BY Company;

-- 后面跟上 DESC 則為降序顯示
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC;

-- Company以降序顯示公司名稱检痰,并OrderNumber以順序顯示
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC;

六. IN

IN - 操作符允許我們在 WHERE 子句中規(guī)定多個值包归。
IN - 操作符用來指定范圍,范圍中的每一條铅歼,都進行匹配公壤。IN取值規(guī)律,由逗號分割椎椰,全部放置括號中境钟。

語法:SELECT "字段名"FROM "表格名"WHERE "字段名" IN ('值一', '值二', ...);

-- 從表 Persons 選取 字段 LastName 等于 Adams、Carter
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter');

七. NOT

NOT - 操作符總是與其他操作符一起使用俭识,用在要過濾的前面。

SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name;

八. UNION

UNION - 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集洞渔。

-- 列出所有在中國表(Employees_China)和美國(Employees_USA)的不同的雇員名
SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA;

-- 列出 meeting 表中的 pic_url套媚,
-- station 表中的 number_station 別名設置成 pic_url 避免字段不一樣報錯
-- 按更新時間排序
SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FROM station  ORDER BY update_at;

-- 通過 UNION 語法同時查詢了 products 表 和 comments 表的總記錄數(shù),并且按照 count 排序
SELECT 'product' AS type, count(*) as count FROM `products` union select 'comment' as type, count(*) as count FROM `comments` order by count;

九. AS

as - 可理解為:用作磁椒、當成堤瘤,作為;別名
一般是重命名列名或者表名浆熔。

語法:select column_1 as 列1,column_2 as 列2 from table as 表;

SELECT * FROM Employee AS emp;
-- 這句意思是查找所有Employee 表里面的數(shù)據(jù)本辐,并把Employee表格命名為 emp。
-- 當你命名一個表之后医增,你可以在下面用 emp 代替 Employee.
-- 例如 SELECT * FROM emp.

SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders;
-- 列出表 Orders 字段 OrderPrice 列最大值慎皱,
-- 結(jié)果集列不顯示 OrderPrice 顯示 LargestOrderPrice

-- 顯示表 users_profile 中的 name 列
SELECT t.name from (SELECT * from users_profile a) AS t;

十. JOIN

用于根據(jù)兩個或多個表中的列之間的關系,從這些表中查詢數(shù)據(jù)叶骨。

  • JOIN: 如果表中有至少一個匹配茫多,則返回行
  • INNER JOIN:在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行忽刽。
  • LEFT JOIN: 即使右表中沒有匹配天揖,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配跪帝,就返回行(MySQL 是不支持的今膊,通過 LEFT JOIN + UNION + RIGHT JOIN 的方式 來實現(xiàn))
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName;

十一. SQL 函數(shù)

1. COUNT

COUNT 讓我們能夠數(shù)出在表格中有多少筆資料被選出來。

語法:SELECT COUNT("字段名") FROM "表格名";

-- 表 Store_Information 有幾筆 store_name 欄不是空白的資料伞剑。
-- "IS NOT NULL" 是 "這個欄位不是空白" 的意思斑唬。
SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL; 

-- 獲取 Persons 表的總數(shù)
SELECT COUNT(1) AS totals FROM Persons;

-- 獲取表 station 字段 user_id 相同的總數(shù)
select user_id, count(*) as totals from station group by user_id;

2. MAX

MAX 函數(shù)返回一列中的最大值。NULL 值不包括在計算中。

語法:SELECT MAX("字段名") FROM "表格名"

-- 列出表 Orders 字段 OrderPrice 列最大值赖钞,
-- 結(jié)果集列不顯示 OrderPrice 顯示 LargestOrderPrice
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders

十二. 觸發(fā)器

語法:
create trigger <觸發(fā)器名稱>
{ before | after} # 之前或者之后出發(fā)
insert | update | delete # 指明了激活觸發(fā)程序的語句的類型
on <表名> # 操作哪張表
for each row # 觸發(fā)器的執(zhí)行間隔腰素,for each row 通知觸發(fā)器每隔一行執(zhí)行一次動作,而不是對整個表執(zhí)行一次雪营。
<觸發(fā)器SQL語句>

delimiter $
CREATE TRIGGER set_userdate BEFORE INSERT 
on `message`
for EACH ROW
BEGIN
  set @statu = new.status; -- 聲明復制變量 statu
  if @statu = 0 then       -- 判斷 statu 是否等于 0
    UPDATE `user_accounts` SET status=1 WHERE openid=NEW.openid;
  end if;
END
$
DELIMITER ; -- 恢復結(jié)束符號

OLD和NEW不區(qū)分大小寫

  • NEW 用NEW.col_name弓千,沒有舊行。在DELETE觸發(fā)程序中献起,僅能使用OLD.col_name洋访,沒有新行。
  • OLD 用OLD.col_name來引用更新前的某一行的列

十三. 添加索引

1. 普通索引(INDEX)

語法:ALTER TABLE 表名字 ADD INDEX 索引名字 (字段名字);

-- 直接創(chuàng)建索引
CREATE INDEX index_user ON user(title);

-- 修改表結(jié)構(gòu)的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length));

-- 給 user 表中的 name字段 添加普通索引(INDEX)
ALTER TABLE `table` ADD INDEX index_name (name);

-- 創(chuàng)建表的時候同時創(chuàng)建索引
CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
    `time` int(10) NULL DEFAULT NULL ,
    PRIMARY KEY (`id`),
    INDEX index_name (title(length))
);

-- 刪除索引
DROP INDEX index_name ON tablel

2. 主鍵索引(PRIMARY key)

語法:ALTER TABLE 表名字 ADD PRIMARY KEY (字段名字);

-- 給 user 表中的 id字段 添加主鍵索引(PRIMARY key)
ALTER TABLE `user` ADD PRIMARY key (id);

3. 唯一索引(UNIQUE)

語法:ALTER TABLE 表名字 ADD UNIQUE (字段名字);

-- 給 user 表中的 creattime 字段添加唯一索引(UNIQUE)
ALTER TABLE `user` ADD UNIQUE (creattime);

4. 全文索引(FULLTEXT)

語法:ALTER TABLE 表名字 ADD FULLTEXT (字段名字);

-- 給 user 表中的 description 字段添加全文索引(FULLTEXT)
ALTER TABLE `user` ADD FULLTEXT (description);

5. 添加多列索引

語法:ALTER TABLE 表名字 ADD INDEX index_name (column1, column2, column3);

-- 給 user 表中的 name谴餐、city姻政、age 字段添加名字為name_city_age的普通索引(INDEX)
ALTER TABLE user ADD INDEX name_city_age (name(10),city,age); 

6. 建立索引的時機

在'WHERE'和'JOIN'中出現(xiàn)的列需要建立索引,但也不完全如此:

  • MySQL只對 <岂嗓,<=汁展,=>厌殉,>=食绿,BETWEENIN 使用索引
  • 某些時候的 LIKE 也會使用索引公罕。
  • LIKE 以通配符%和_開頭作查詢時器紧,MySQL不會使用索引。
-- 此時就需要對city和age建立索引楼眷,
-- 由于mytable表的userame也出現(xiàn)在了JOIN子句中铲汪,也有對它建立索引的必要。
SELECT t.Name  
FROM mytable t LEFT JOIN mytable m ON t.Name=m.username 
WHERE m.age=20 AND m.city='上海';

SELECT * FROM mytable WHERE username like'admin%'; 
-- 而下句就不會使用:
SELECT * FROM mytable WHEREt Name like'%admin'; 
-- 因此罐柳,在使用LIKE時應注意以上的區(qū)別掌腰。

索引的注意事項

  • 索引不會包含有NULL值的列
  • 使用短索引
  • 不要在列上進行運算 索引會失效

十四. 創(chuàng)建后表的修改

1. 添加列

語法:alter table 表名 add 列名 列數(shù)據(jù)類型 [after 插入位置];

-- 在表students的最后追加列 address: 
alter table students add address char(60);

-- 在名為 age 的列后插入列 birthday: 
alter table students add birthday date after age;

-- 在名為 number_people 的列后插入列 weeks: 
alter table students add column `weeks` varchar(5) not null default "" after `number_people`;

2. 修改列

語法:alter table 表名 change 列名稱 列新名稱 新數(shù)據(jù)類型;

-- 將表 tel 列改名為 telphone: 
alter table students change tel telphone char(13) default "-";

-- 將 name 列的數(shù)據(jù)類型改為 char(16): 
alter table students change name name char(16) not null;

-- 修改 COMMENT 前面必須得有類型屬性
alter table students change name name char(16) COMMENT '這里是名字';

-- 修改列屬性的時候 建議使用modify,不需要重建表
-- change用于修改列名字,這個需要重建表
alter table meeting modify `weeks` varchar(20) NOT NULL DEFAULT "" COMMENT "開放日期 周一到周日:0~6硝清,間隔用英文逗號隔開";

-- `user`表的`id`列辅斟,修改成字符串類型長度50,不能為空芦拿,`FIRST`放在第一列的位置
alter table `user` modify COLUMN `id` varchar(50) NOT NULL FIRST ;

3. 刪除列

語法:alter table 表名 drop 列名稱;

-- 刪除表students中的 birthday 列: 
alter table students drop birthday;

4. 重命名表

語法:alter table 表名 rename 新表名;

-- 重命名 students 表為 workmates: 
alter table students rename workmates;

5. 清空表數(shù)據(jù)

方法一:delete from 表名;
方法二:truncate from "表名";

  • DELETE:1. DML語言; 2. 可以回退; 3. 可以有條件的刪除;
  • TRUNCATE:1. DDL語言; 2. 無法回退; 3. 默認所有的表內(nèi)容都刪除; 4. 刪除速度比delete快士飒。
-- 清空表為 workmates 里面的數(shù)據(jù),不刪除表蔗崎。 
delete from workmates;
-- 刪除workmates表中的所有數(shù)據(jù)酵幕,且無法恢復
truncate from workmates;

6. 刪除整張表

語法:drop table 表名;

-- 刪除 workmates 表: 
drop table workmates;

7. 刪除整個數(shù)據(jù)庫

語法:drop database 數(shù)據(jù)庫名;

-- 刪除 samp_db 數(shù)據(jù)庫: 
drop database samp_db;

十五. 參考手冊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缓苛,隨后出現(xiàn)的幾起案子芳撒,更是在濱河造成了極大的恐慌邓深,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笔刹,死亡現(xiàn)場離奇詭異芥备,居然都是意外死亡,警方通過查閱死者的電腦和手機舌菜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門萌壳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人日月,你說我怎么就攤上這事袱瓮。” “怎么了爱咬?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵尺借,是天一觀的道長。 經(jīng)常有香客問我精拟,道長燎斩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任蜂绎,我火速辦了婚禮瘫里,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘荡碾。我一直安慰自己,他們只是感情好局装,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布坛吁。 她就那樣靜靜地躺著,像睡著了一般铐尚。 火紅的嫁衣襯著肌膚如雪拨脉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天宣增,我揣著相機與錄音玫膀,去河邊找鬼。 笑死爹脾,一個胖子當著我的面吹牛帖旨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灵妨,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼解阅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泌霍?” 一聲冷哼從身側(cè)響起货抄,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蟹地,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體积暖,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年怪与,在試婚紗的時候發(fā)現(xiàn)自己被綠了夺刑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡琼梆,死狀恐怖性誉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茎杂,我是刑警寧澤错览,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站煌往,受9級特大地震影響倾哺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刽脖,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一羞海、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲管,春花似錦却邓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至檬某,卻和暖如春撬腾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恢恼。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工民傻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人场斑。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓漓踢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漏隐。 傳聞我的和親對象是個殘疾皇子彭雾,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容