0. README
本篇文章主要總結(jié)SELECT語句的具體用法, 包含條件查詢, 順序查詢, 分組查詢, 結(jié)合聚集函數(shù)的查詢, 多表查詢.
本文行文思路結(jié)構(gòu)
DQL(數(shù)據(jù)查詢語言)
一. 單表查詢
1. 條件查詢
2. 順序查詢
3. 分組查詢
4. 結(jié)合聚集函數(shù)的查詢
二. 多表查詢
1. 多表操作
2. 內(nèi)連接
3. 外連接
三. 總結(jié)
一. 單表查詢
與查詢數(shù)據(jù)(select)相關(guān)的查詢語句:
SHOW TABLES [FROM database_name]; -- 查看數(shù)據(jù)庫中的所有表
SELECT * FROM table_name; -- 查看一個表中的所有記錄數(shù) (*代表表中所有的列名)
1. 條件查詢
格式:
SELECT 列名 FROM 表名 [WHERE 條件表達(dá)式];
條件表達(dá)式中常用的符號
< > <= >= = <> (不等于)
WHERE子句中相關(guān)關(guān)鍵字的用法:
in(范圍內(nèi)取內(nèi)容)
not in
示例:
(準(zhǔn)備階段)假設(shè)已存在一個數(shù)據(jù)庫mydb, 里面已創(chuàng)建一個表mytable, 表結(jié)構(gòu)如下:
表內(nèi)已插入6條記錄:
-- in的用法
SELECT * FROM mytable WHERE id IN (1, 3, 4);
SELECT * FROM mytable WHERE id NOT IN (1, 3, 4);
執(zhí)行結(jié)果:
like(模糊查詢的關(guān)鍵字)
寫法:
下劃線和%區(qū)別:都是占位符, _只有一個字符, %可以有零個或多個字符.
%寫法:
like '%李'; 結(jié)果: XXX李
like '李%'; 結(jié)果: 李XXX
like '%李%'; 結(jié)果: 只要有李就行
示例:
-- 查詢username中含有'a'的元組(即一行)
SELECT * FROM mytable WHERE username LIKE '%a%';
執(zhí)行結(jié)果:
as
可以使用別名:使用as設(shè)置別名, 并且as可以省略
示例:
-- as設(shè)置別名, 也可以省略, 兩種情況得到同樣的結(jié)果
SELECT id AS 'ID' FROM mytable;
SELECT id 'ID' FROM mytable;
執(zhí)行結(jié)果:
其它重要關(guān)鍵字:
is null -- 判斷是否為null
and -- 并且
or -- 或者
not -- 不成立
2. 順序查詢
- 排序, 使用order by, 升序?yàn)槟J(rèn)的(asc)/降序(desc)
- 同時出現(xiàn)select的語句最末尾
-- 按id升序排列信息, 兩種情況得到同樣的結(jié)果
SELECT * FROM mytable ORDER BY id;
SELECT * FROM mytable ORDER BY id ASC;
執(zhí)行結(jié)果:
3. 分組查詢
格式:
SELECT * FROM 表名 [group by 列名 having 條件表達(dá)式];
4. 結(jié)合聚集函數(shù)的查詢
count 獲取數(shù)量
sum 求和
avg 求平均數(shù)
max 最大值
min 最小值
示例:
SELECT MAX(id) FROM mytable
GROUP BY password;
執(zhí)行結(jié)果:
完整的SELECT語句:
格式:
SELECT * FROM 表名 [WHERE 條件表達(dá)式]
[GROUP BY 列名 HAVING 條件表達(dá)式]
[ORDER BY ASC/DESC];
示例:
SELECT id, username, password, COUNT(*) FROM mytable
WHERE id > 1
GROUP BY password
HAVING password <> '111'
ORDER BY id;
執(zhí)行結(jié)果:
二. 多表查詢
1. 多表操作
- 首先重新提供數(shù)據(jù), 有一個部門的表dept宽档,還有一個員工表emp.
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(30)
);
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
salary DOUBLE,
dno INT
);
INSERT INTO dept VALUES(NULL, '研發(fā)部');
INSERT INTO dept VALUES(NULL, '銷售部');
INSERT INTO dept VALUES(NULL, '人事部');
INSERT INTO emp VALUES(NULL, '小王', 10000, 1);
INSERT INTO emp VALUES(NULL, '小李', 10000, 2);
INSERT INTO emp VALUES(NULL, '小鳳', 10000, 3);
INSERT INTO emp VALUES(NULL, '東東', 800, NULL);
INSERT INTO emp VALUES(NULL, '波波', 1000, NULL);
之后, 表dept中所有數(shù)據(jù)如下:
表dept中所有數(shù)據(jù)如下:
外鍵約束
因?yàn)榘蜒邪l(fā)部刪除, 研發(fā)部下有人員, 該操作不合理奕短。
所以, 引入外鍵約束, 作用是保證數(shù)據(jù)的完整性间唉。
添加外鍵
語法:
ALTER TABLE 當(dāng)前表名 ADD FOREIGN KEY 當(dāng)前表名(dno) REFERENCES 關(guān)聯(lián)的表(did);
給emp員工表添加外鍵:
ALTER TABLE emp ADD FOREIGN KEY emp(dno) REFERENCES dept(did);
查看emp表結(jié)構(gòu):
在介紹內(nèi)連接, 外連接之前, 有必要了解一下笛卡爾積:
舉個例子:
表A 表B
aid aname bid bname
a1 aa1 b1 bb1
a2 aa2 b2 bb2
b3 bb3
查詢的語法
SELECT * FROM 表A, 表B;
返回的結(jié)果就是笛卡爾積, 表A中有兩條記錄, 表B中有三條記錄, A和B的笛卡爾積中就有2*3=6條記錄.
2. 內(nèi)連接
普通內(nèi)連接
前提條件:需要有外鍵的.
提交關(guān)鍵字 inner join ... on + 條件
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dno;隱式內(nèi)連接(用的是最多的)
可以不使用inner join ... on關(guān)鍵字
SELECT * FROM dept,emp WHERE dept.did = emp.dno;
執(zhí)行結(jié)果(兩者相同):
3. 外連接
-
左外連接(看左表樟遣,把左表所有的數(shù)據(jù)全部查詢出來)
前提條件:需要有外鍵的.
語法: 使用關(guān)鍵字 left [outer] join ... on + 條件
SELECT * FROM dept LEFT OUTER JOIN emp ON dept.did = emp.dno;
執(zhí)行結(jié)果:
右外連接(看右表汹碱,把右表所有的數(shù)據(jù)全部查詢出來)
前提條件:需要有外鍵的要尔。
語法: 使用關(guān)鍵字 right [outer] join ... on
SELECT * FROM dept RIGHT JOIN emp ON dept.did = emp.dno;
執(zhí)行結(jié)果:
三. 總結(jié)
個人博客主頁
到此, 所有的內(nèi)容就總結(jié)完了! 當(dāng)然, 還有部分有關(guān)查詢的關(guān)鍵詞, 如ALL, DISTINCT等等, 自己也可以去看看它們的用法.
最后, 非常歡迎各位小伙伴評論和指點(diǎn)我的文章, 如果您覺得寫得還不太差勁或者對您有一丁點(diǎn)的幫助, 麻煩動個小手點(diǎn)個贊, 好人萌萌噠, 也很感謝您耐心認(rèn)真地看完!
本文寫于 2017/05/14 20:42