MySQL 增刪查改 必知必會
4.1.13 使用 like 關鍵字進行模糊查詢
-- 說明:模糊查詢,使用查詢關鍵字like,like意思是類似於,像...的意思
-- 模糊查詢,支持兩種字符匹配符號:
-- 下划線_:下划線可以代替單個字符
-- 百分號%:可以代替任意個任意字符(0個、1個或者多個字符)
-- 舉例:查詢員工表中員工編號第二位為2的員工的編號、姓名 SELECT employee_id,first_name,last_name FROM hrdb.`employees` WHERE employee_id LIKE "_2%";
4.1.14 查詢關鍵字 distinct 的用法
-- 說明:distinct意思是有區別的,這里用於在查詢時過濾掉重復數據
-- 舉例:查詢員工表中有哪些職位分類,要求查詢結果不顯示重復數據
SELECT DISTINCT job_id FROM hrdb.`employees`;
-- 舉例:查詢員工表中不同職位的個數
SELECT COUNT(DISTINCT job_id) FROM hrdb.`employees`;
-- distinct 和count()函數配合使用
4.1.15 多字段排序
-- 多字段排序,就是排序時,可以同時使用多個字段對查詢結果數據先后進行排序,“排序字段”之間使用逗號隔開
語法:
ORDER BY 字段1 [[DESC]|[ASC]] ,字段2 [[DESC]|[ASC]]
4.1.16 查詢的優先級
優先級順序:
高:()>NOT>AND>OR 低
-- 舉例:查詢工資低於8000或者高於12000,員工編號大於120的人員的工資、部門編號、員工編號 SELECT salary,department_id,employee_id FROM hrdb.`employees` WHERE (salary <8000 OR salary>12000) AND employee_id>120;
4.2 查詢多個表中的數據
4.2.1 跨表查詢步驟
步驟一:分析需要查詢的數據和給出的條件相關數據分布在哪些表中
步驟二:分析需要查詢的數據所在表和所給條件相關數據所在表之間有哪些聯系(找兩個表的相同字段,存在,即表示兩個表有直接關系)
直接關系:兩個表之間有數據引用(相同字段)
間接關系:兩個表之間通過其他表有數據引用關系(兩兩之間有共同字段)
步驟三:結合其他所給條件,寫查詢需要的 SQL 語句
-- 說明:在 sql 語句中,表的別名可以代替對應表,字段的別名可以代替對應字段,
-- 函數的別名可以代替對應函數
-- 別名作用:可以減少 sql 語句編寫的工作量,標識數據來源
-- 舉例:查看員工表中,員工編號為 100 的員工所在的部門的部門名稱 SELECT e.employee_id,d.department_name,d.department_id FROM hrdb.`employees` AS e,departments AS d WHERE e.`department_id`=d.`department_id` AND employee_id=100;
4.2.2 子查詢(嵌套查詢)
子查詢是一個嵌套在另一個查詢【主查詢】內部中的查詢,子查詢可以達到的查詢目的,使用其他多表連接查詢同樣可以實現,但子查詢更容易閱讀和編寫;
4.2.2.1 子查詢出現在 from 子句中
-- 說明:把內層的子查詢查詢結果當成臨時表,供外層 sql 語句再次查詢
-- 語法:
Select 查詢列表1
from(
select查詢列表2
from 庫名.表名
where 條件表達式
);
-- 外部查詢的查詢列表需要和子查詢的查詢列表相同或者為其子集
1 -- 舉例:查詢hrdb數據庫employees表工資大於7000的名字包括字母c的員工的first_name,salary 2 -- 方法一 3 SELECT first_name,salary 4 FROM hrdb.`employees` 5 WHERE salary>7000 AND first_name LIKE "%c%"; 6 -- 方法二、子查詢寫法 7 SELECT x.first_name,x.salary 8 FROM (SELECT first_name,salary FROM hrdb.`employees` WHERE salary>7000) X 9 WHERE x.first_name LIKE "%c%"; 10 -- 給子查詢加一個別名
4.2.2.2 子查詢出現在where子句中:
-- 說明:指把內層查詢的結果作為外層查詢的比較條件.
-- 語法:
SELECT 字段1
FROM 庫名.表名
WHERE 字段1 關系運算符
(
SELECT 字段1
FROM 庫名.表名
WHERE 字段2 關系運算符 字段值
);
1 -- 舉例:查詢員工表中工資比“員工編號為104的員工的工資”低的員工的姓名、員工編號、工資 2 SELECT first_name,last_name,employee_id,salary 3 FROM hrdb.`employees` 4 WHERE salary< 5 ( 6 SELECT salary 7 FROM hrdb.`employees` 8 WHERE employee_id=104 9 );
4.2.2.3 子查詢出現在having子句中
-- 語法
SELECT 查詢列表
FROM 庫名.表名
GROUP BY 字段1
HAVING 字段1 比較運算符(SELECT 字段1 FROM 庫名.表名 WHERE 條件);
1 -- 舉例:查詢員工表中"部門編號大於|first_name為Bruce的員工所在部門的部門編號|",的部門的編號 2 SELECT department_id 3 FROM hrdb.`employees` 4 GROUP BY department_id 5 HAVING department_id> 6 ( 7 SELECT department_id 8 FROM hrdb.`employees` 9 WHERE first_name="Bruce" 10 );
4.2.2.4 子查詢操作符ALL的用法
-- 說明:
ALL操作符有三種用法:
-- <>ALL:等價於 NOT IN
-- >ALL :比子查詢中最大的值還要大
-- <ALL :比子查詢中最小的值還要小
-- 特別說明:“= All”不存在
語法:
SELECT 字段1
FROM 庫名.表名
WHERE 字段1 關系運算符 ALL
(
SELECT 字段1
FROM 庫名.表名
WHERE 字段2 關
系運算符 字段值
);
1 -- 舉例:查詢工資與"job_id為IT_PROG的職位中所有人工資"都不同的人員姓名、工資 2 方法一、 3 SELECT first_name,last_name,salary 4 FROM hrdb.`employees` 5 WHERE salary NOT IN(SELECT salary FROM hrdb.`employees` WHERE job_id="IT_PROG"); 6 方法二、 7 SELECT first_name,last_name,salary 8 FROM hrdb.`employees` 9 WHERE salary <>ALL(SELECT salary FROM hrdb.`employees` WHERE job_id="IT_PROG");
4.2.2.5 子查詢操作符any的用法
-- = ANY:與子查詢中的數據任何一個相等
-- >ANY : 比子查詢中的數據最低的高
-- <ANY : 比子查詢中的數據最高的低
1 -- 舉例:查詢工資與job_id為IT_PROG的職位中所有人工資相等的人員姓名、工資(=ANY 與任何一個相等) 2 SELECT first_name,last_name,salary 3 FROM hrdb.`employees` 4 WHERE salary=ANY( 5 SELECT salary 6 FROM hrdb.`employees` 7 WHEREjob_id="IT_PROG" 8 );
1 -- 舉例:查詢工資比job_id為IT_PROG的職位中最低工資高的人員姓名、工資(>ANY 比最低的高) 2 SELECT first_name,last_name,salary 3 FROM hrdb.`employees` 4 WHERE salary>ANY( 5 SELECT salary 6 FROM hrdb.`employees` 7 WHEREjob_id="IT_PROG" 8 );
4.2.3內連接&外連接查詢
4.2.3.1內連接【等值連接】查詢
-- 說明:
在進行跨表內連接查詢數據時,查詢結果只返回符合查詢條件的數據;
跨表內連接查詢的結果和使用where的多表查詢結果相同。
-- 語法:
SELECT 別名1.字段名1,別名2.字段名2
FROM 庫名.表名1 [AS] 別名1
INNER JOIN 庫名.表名2 [AS] 別名2
ON 別名1.字段名3=別名2.字段名3;
1 -- 舉例:查詢員工表中,員工編號為100的員工所在部門的部門名稱,查詢結果顯示員工編號、部門名稱 2 -- 方法一、 3 SELECT e.employee_id,d.department_name 4 FROM hrdb.`employees` e,hrdb.`departments` d 5 WHERE e.department_id=d.department_id 6 AND e.employee_id=100; 7 -- 方法二、內連接寫法 8 SELECT e.employee_id,d.department_name 9 FROM hrdb.`employees` e 10 INNER JOIN hrdb.`departments` d 11 ON e.department_id=d.department_id 12 AND e.employee_id=100;
1 -- 舉例:查詢在城市Seattle中工作的人員有哪些(跨三個表查詢數據) 2 SELECT l.city,e.employee_id 3 FROM hrdb.`locations` l 4 INNER JOIN hrdb.`departments` d 5 ON l.location_id=d.location_id 6 INNER JOIN hrdb.`employees` e 7 ON d.department_id=e.department_id 8 AND l.city="Seattle";
4.2.3.2外連接((左外連接、右外連接、全連接)查詢)
4.2.3.2.1左外連接(簡稱左連接)
-- 左表:進行左連接查詢時,在你寫的sql語句中首先(第一個)出現的表,稱為左表;
-- 說明:使用多表查詢時,如果某個表中的數據需要全部顯示,
-- 查詢時,如果使用左連接進行查詢,需要將這個表作為左表,
-- 查詢完成后,左表的數據都全部顯示在結果中,
-- 右表【除第一個表以外的表都稱為右表】中符合查詢條件的數據顯示在查詢結果中,
-- 右表中不符合查詢條件的數據,也顯示在結果中,不符合條件的數據以null填充。
-- 語法:
SELECT 別名1.字段名1,別名2.字段名2
FROM 庫名.表名1 [AS] 別名1
LEFT JOIN 庫名.表名2 [AS] 別名2
ON 別名1.字段名3=別名2.字段名3 ;
1 --舉例:查詢部門表中哪些部門沒有員工、哪些部門有員工,查詢結果顯示部門名稱、員工編號 2 SELECT department_name,employee_id 3 FROM hrdb.`departments` d 4 LEFT JOIN hrdb.`employees` e 5 ON d.department_id=e.department_id;
4.2.3.2.2右外連接(簡稱右連接)查詢
-- 右表:右連接查詢中,進行多表連接查詢時,最后出現的表,稱為右表;
-- 說明:進行多表查詢時,如果某個表中的數據需要全部顯示,
-- 如果使用右連接查詢時,需要將這個表作為右表,查詢后,右表中的數據全部顯示,左表【除右表以外的表都稱為左表】中符合條件的數據顯示在查詢結果中,左表中不符合條件的數據,也顯示在結果中,但相關數據以null填充。
語法:
SELECT 別名1.字段名1,別名2.字段名2
FROM 庫名.表名1 [AS] 別名1
RIGHT JOIN 庫名.表名2 [AS] 別名2
ON 別名1.字段名3=別名2.字段名3; -- 連接條件
1 -- 舉例:查詢部門表中哪些部門沒有員工,哪些部門有員工,查詢結果顯示部門名稱、員工編號 2 -- 右連接寫法 3 SELECT d.department_name,e.employee_id 4 FROM hrdb.`employees` e 5 RIGHT JOIN hrdb.`departments` d 6 ON e.department_id=d.department_id;
4.2.3.2.1聯合查詢關鍵字UNION的用法
1 舉例:查詢員工表中員工編號分別為110和115的人員的工資、入職日期 2 -- 方法一 3 SELECT salary,hire_date 4 FROM hrdb.`employees` 5 WHERE employee_id=110 6 OR employee_id=115; 7 -- 方法二 聯合查詢寫法 8 SELECT salary,hire_date 9 FROM hrdb.`employees` 10 WHERE employee_id=110 11 UNION 12 SELECT salary,hire_date 13 FROM hrdb.`employees` 14 WHERE employee_id=115;
5、用戶及權限管理
5.1 mysql用戶分類角度1(權限不同):
(1) 管理員用戶:root,具有最高權限,具有創建用戶的權限,可以為其他用戶授權
(2) 普通用戶:普通用戶由root用戶創建,權限由root用戶分配
5.2 mysql用戶分類角度2(訪問主機不同)
(1)本地用戶
-- 只能在安裝mysql的機器上訪問mysql數據庫的用戶,在創建用戶時,使用的IP地址為localhost
(2)遠程訪問用戶
-- 在安裝mysql的機器以外的機器上訪問mysql數據庫的相關用戶
2.1 只能在指定IP對應的機器上訪問遠程mysql數據庫的用戶,創建用戶時,只能使用指定的具體IP地址:如172.30.70.149所在的機器訪問遠程數據庫
2.2 在除安裝mysql數據庫對應機器以外的任何一台機器上可以訪問遠程mysql數據庫的用戶 ,在創建用戶時,使用的IP地址為百分號%(常用)
5.3 MySQL添加新用戶
-- 在mysql中,添加一個可用的新用戶,共分為三步:
步驟一:添加用戶
步驟二:為用戶授權
步驟三:使授權生效
5.3.1、用戶創建
語法:
INSERT INTO mysql.`user`(HOST,USER,PASSWORD) VALUES("IP地址","用戶名",PASSWORD("密碼")); -- 創建用戶
-- PASSWORD() 加密函數
舉例:創建遠程訪問用戶test1,
為該用戶在數據庫hrdb中的所有表上授予select、insert權限,
使該用戶在遠程任何一台主機上可以訪問數據庫,該用戶的密碼為123456
-- 步驟一、創建用戶
INSERT INTO mysql.user(HOST,USER,PASSWORD)
VALUES("%","test1",PASSWORD("123456"));
-- 步驟二、 為新用戶授權
GRANT SELECT,INSERT ON hrdb.* TO "test1"@"%" IDENTIFIED BY "123456";
-- 步驟三、使授權生效
FLUSH PRIVILEGES; -- 刷新授權表,效果相當於重啟mysql服務
SHOW GRANTS;