MySQL語法基礎
今天把整理的數據的簡單查詢筆記分享出來,如果需要這個demo文件,歡迎添加公衆號SUMER 回覆 demo 索要sql文件
數據的簡單查詢
基本全部查詢
- 基本目標列查詢
- 重命名查詢
show databases;
-- 使用目標數據庫
use imooc_demo;
-- 查找全部字段
SELECT * from t_emp;
-- 查找這三列從t_emp表
SELECT empno, ename, sal from t_emp;
-- 改名查詢
SELECT ename,empno,sal*12 AS income_year FROM t_emp;
數據分頁
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-B6EffcuF-1578655229470)(./_image/2020-01-10-10-53-46.png)]
- 偏移量 0,20 從0 到後取20條
- 20往後取20 就是 20,20
-- 分頁查詢 下邊含義是0-5條
SELECT empno ,ename,sal FROM t_emp LIMIT 0,5;
-- 下邊等價於0-10的意思
SELECT empno ,ename,sal FROM t_emp LIMIT 10;
FROM -> SELECT -> LIMIT
結果集排序
按照某種順序 必須使用ORDER BY
執行順序: SELECT…FROM… ORDER BY 列名 [asc | desc]
-- 排序--升序
SELECT empno ,ename,sal,deptno FROM t_emp ORDER BY sal ASC;
-- 排序--降序
SELECT empno ,ename,sal,deptno FROM t_emp ORDER BY sal DESC;
多字段排序
- 規定 首要 \ 次要 排序條件
-- 多個排序字段,工資相同按入職排序
SELECT empno ,ename,sal,hiredate,deptno FROM t_emp ORDER BY sal DESC ,hiredate ASC;
-- 查看前五的
SELECT empno,ename,sal FROM t_emp ORDER BY sal DESC LIMIT 0,5;
執行順序: FROM -> SELECT -> ORDER BY -> LIMIT
去除重複記錄
比如從員工表中查詢多少種職業,可能出現重複記錄
加上 DISTINCT
字段
-- 查詢job 不去重
SELECT job FROM t_emp;
-- 查詢job 去重
SELECT DISTINCT job FROM t_emp ;
- 注意:
- distinct 的select只能查詢一列數據,如果查詢多列,重複記錄就會失效
-- 不能重複用--兩個字段,功能消失
SELECT DISTINCT job, ename FROM t_emp ;
-- 不能重複用--兩個字段都加,報錯
SELECT DISTINCT job,DISTINCT ename FROM t_emp ;
-- 不能重複用--後個字段加,報錯
SELECT job,DISTINCT ename FROM t_emp ;
條件查詢
SELECT…FROM …WHERE 條件 and or 條件…
-- 條件查詢 10部門 底薪大於2000的
SELECT empno,ename,sal FROM t_emp WHERE deptno=10 AND sal >=2000;
-- 條件查詢:10 20 兩個部門,薪資大於2000的
SELECT empno,ename,sal , deptno FROM t_emp WHERE (deptno=10 OR deptno=20) AND sal >=2000;
where 四類運算符
- 數學運算符 + - * / %
- 比較運算符
- 邏輯運算符
- 按位運算符
-- 部門10 ,年薪=底薪+提成,12個月大於15000的,
SELECT empno , ename , sal, hiredate
FROM t_emp
WHERE deptno=10 and (sal+ifnull(comm,0))*12>=15000;
and datediff(now(),hiredate)/365>=20;
比較符號運算
表達式 | 意義 | 例子 |
---|---|---|
IS NULL | 爲空 | comm IS NULL |
IS NOT NULL | 不爲空 | comm IS NOT NULL |
BETWEEN AND | 範圍 | sal BETWEEN 2000 AND 3000 |
LIKE | 模糊查詢 | ename LIKE ‘A%’ %代表0-多個字符 |
REGEXP | 正則表達式 | ename REGEXP ‘[a-zA-Z]{4}’ |
下邊是mysql的寫法
-- 測試 IS NOT NULL
SELECT *
FROM t_emp
WHERE comm IS NOT NULL;
-- 測試 BETWEEN AND
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000;
-- 測試 BETWEEN AND + LIKE %佔位符
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "%A%"; -- 前後都是可能有東西
-- 測試 BETWEEN AND + LIKE _佔位符
SELECT *
FROM t_emp
WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_lake"; -- 這是記住了前邊有1位,後邊是lake的
-- 測試 BETWEEN AND + 正則表達式
SELECT *
FROM t_emp
WHERE comm IS NOT NULL -- 它有佣金
AND sal BETWEEN 1000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
邏輯運算符
表達式 | 意義 | 例子 |
---|---|---|
AND | 與 關係 | age >18 AND sex=‘男’ |
OR | 或 關係 | empno = 8000 OR deptno =20 |
NOT | 非 關係 | NOT deptno =20 |
XOR | 異或 關係 | age > 18 XOR sex=“男” |
練習代碼如下
-- 10和20部門之外
SELECT ename,deptno
FROM t_emp
WHERE NOT deptno IN(10,20) ;
-- 10和20部門之外 異或關係 不是10,20部門的 異或 工資大於2000的
SELECT ename,deptno,sal
FROM t_emp
WHERE NOT deptno IN(10,20) XOR sal>=2000
ORDER BY deptno,sal;
二級制按位運算
- 二進制位運算的實質是將參與運算的兩個操作數,按對應的二進制數逐位進行邏輯運算
表達式 | 意義 | 例子 |
---|---|---|
& | 位與關係 | 3&7 |
丨 | 位或關係 | 3丨7 |
~ | 位取反 | ~10 |
^ | 位異或 | 3^7 |
<< | 左移 | 10<<1 |
>> | 右移 | 10>>1 |
-- 按位運算符測試
SELECT 3&7; -- 答案3
SELECT 3 | 7; -- 答案7
SELECT ~ 7; -- 答案18446744073709551608
SELECT 3 ^ 7; -- 答案4
SELECT 10 << 1; -- 答案20
SELECT 10 >> 1; -- 答案5
where子句注意事項
- where子句中,條件執行順序從左往右,應該吧索引條件,或者篩選掉最多紀錄的條件寫在最左邊
- 例如:
-- where注意事項:寫左邊
SELECT empno,ename FROM t_emp
WHERE ename = "FORD" AND sal>=2000;
SELECT empno,ename FROM t_emp
WHERE deptno=10 AND sal>=2000;
各種子句執行順序
FROM -> WHERE -> SELECT -> ORDER BY -> LIMIT