目錄
一. 字符串函數
二. group?by分組
2.1 作用
2.2 格式
2.3 舉例
三.?order by排序
3.1 格式
3.2 舉例
四.?limit
4.1 作用
4.2 舉例
五.?having
5.1 作用
5.2 舉例
六. 正則表達式
七. 多表查詢
7.1 定義
7.2?子查詢
7.3 聯合查詢 縱向合并
7.4?交叉連接 橫向合并(不常用)
7.5?內連接
7.5 外連接
7.6 自連接
7.7 三表查詢
八. 視圖
8.1 創建視圖
?8.2 刪除視圖
九. 函數
十. 存儲過程(了解)
十一. 用戶管理
11.1?新建用戶
11.2?查看用戶信息
11.3?重命名用戶
11.4 刪除用戶?
11.5?修改當前登錄用戶密碼
11.6修改其他用戶密碼
11.7 破解密碼
11.8 遠程登錄
十二. 數據庫用戶授權
12.1 授予權限
12.2 查看權限
12.3 撤銷權限
一. 字符串函數
函數名 | 函數意義 |
---|---|
concat(x,y) | 將提供的參數 x 和 y 拼接成一個字符串 |
substr(x,y) | 獲取從字符串 x 中的第 y 個位置開始的字符串 |
substr(x,y,z) | 獲取從字符串 x 中的第 y 個位置開始長度為 z 的字符串 |
length(x) | 返回字符串 x 的長度 |
replace(x,y,z) | 將字符串 z 替代字符串 x 中的字符串 y |
left(x,y) | 返回字符串 x 的前 y 個字符 |
right(x,y) | 返回字符串 x 的后 y 個字符 |
repeat(x,y) | 將字符串 x 重復 y 次 |
space(x) | 返回 x 個空格 |
strcmp(x,y) | 比較x和y,返回的值可以為-1,0,1 |
reverse(x) | 將字符串x反轉 |
upper(x) | 將字符串 x 的所有字母變成大寫字母 |
lower(x) | 將字符串 x 的所有字母變成小寫字母 |
示例:
#concat
select concat(name,classid) from students where stuid=1; #將姓名字段和班級字段合在一起
select concat(name,' ',classid) from students where classid=1; #加空格
?
#substr
select substr(name,1,3) from students;
#獲取students表中name字段的前1到3個字符select substr(name,3) from students where stuid=25;
#從students表中查找stuid為25的學生記錄,提取該學生name字段的子字符串,從第3個字符開始直到結束select substr(name,1,3) from students where stuid=25;
#從students表中查找stuid為25的學生記錄,提取該學生name字段的子字符串,從第1個字符開始,總共提取3個字符
運行結果如下:?
#了解select length(name) from students where stuid=1; #返回數據的長度
select replace(name,"y",11) from students where stuid=1; #將name字段中的y換成11
select left(name,3) from students where stuid=1; #顯示name字段 左邊三個字符 即最開始的三個
select right(name,3) from students where stuid=1; #顯示name字段 右邊三個字符 即最后三個
select repeat(name,2) from students where stuid=1; #將name字段重復顯示2次
select lower(name) from students; #返回結果全是小寫字母
select reverse(name) from students where stuid=1; #反向顯示字符串
二. group?by分組
2.1 作用
根據指定的一個或多個列的值將查詢結果分成多個組,通常與聚合函數(如COUNT, SUM, AVG, MAX, MIN等)一起使用
2.2 格式
SELECT "字段1", 聚合函數("字段2") FROM "表名" GROUP BY "字段1";
2.3 舉例
select classid from students group by classid; #以classid字段進行分組
select gender from students group by gender; #以性別進行分組
select age from students group by age; #以年齡進行分組select classid,count(*) from students group by classid; #按classid分組,并顯示每一組的人數
select age,count(*) from students group by age; #按年齡分組,并顯示每一組的人數select gender,avg(age) from students group by gender; #按性別分組,求男女的平均年齡
?運行結果如下
?
注意:凡是在 SELECT 后面出現的、且未在聚合函數中出現的字段,必須出現在 GROUP BY 后面??
#錯誤示例
select classid,name from students group by classid;
三.?order by排序
3.1 格式
SELECT "字段" FROM "表名" [WHERE "條件"] ORDER BY "字段" [ASC, DESC];
#ASC 是按照升序進行排序的,是默認的排序方式。
#DESC 是按降序方式進行排序。
3.2 舉例
select * from students order by age; #年齡升序排列
select * from students order by age desc; #年齡降序排select * from students where classid=1 order by age; #找出1班的人按升序排序
?
四.?limit
4.1 作用
對查詢的結果進行輸出行數數量限制
4.2 舉例
select * from students limit 5; #取前5個數據
select * from students limit 3,5; #跳過前3個,往后取 5個
select * from students order by stuid desc limit 3; #顯示最后三個
?
五.?having
5.1 作用
HAVING 語句的存在彌補了 WHERE 關鍵字不能與聚合函數聯合使用的不足
5.2 舉例
select classid,count(classid) from students group by classid having classid > 3;
#先對所有數據按classid分組,然后使用篩選出classid大于3的組。select classid,count(classid) from students where classid > 3 group by classid;
#先使用篩選出classid大于3的記錄,然后再對這些記錄按classid分組。
?
六. 正則表達式
匹配 描述
^ 匹配文本的開始字符
$ 匹配文本的結束字符
. 匹配任何單個字符
* 匹配零個或多個在它前面的字符
+ 匹配前面的字符 1 次或多次字符串 匹配包含指定的字符串
p1|p2 匹配 p1 或 p2
[…] 匹配字符集合中的任意一個字符
[^…] 匹配不在括號中的任何字符
{n} 匹配前面的字符串 n 次
{n,m} 匹配前面的字符串至少 n 次,至多 m 次
{,m} 最多m次
{n,} 最少n次
? 匹配一個字符
舉例
select name from students where name regexp '^s'; #查找所有以字母's'開頭的學生姓名
select name from students where name regexp 's'; #查找所有姓名中包含字母's'的學生select name from students where name regexp 's.i';
#查找姓名中包含模式's+任意一個字符+i'的學生
select name from students where name regexp '^s|l';
#查找所有以's'開頭或者包含字母'l'的學生姓名
?
七. 多表查詢
7.1 定義
多表查詢是指在單個SQL查詢中同時從兩個或多個表中檢索數據的操作。
7.2?子查詢
定義
子查詢是嵌套在另一個查詢中的查詢。
舉例
select avg(age) from students; #求平均年齡
select * from students where age > (select avg(age) from students); #再找出比平均年齡大的
#類似的SELECT avg(Age) FROM teachers #先計算出 教師表的 平均年齡
update students set Age=(SELECT avg(Age) FROM teachers) where stuid=25; # 再把第25個學生的年齡改成 教師表的平均年齡
7.3 聯合查詢 縱向合并
返回兩個表的笛卡爾積(即第一個表的每一行與第二個表的每一行的所有可能組合)。
格式:
-- 去除重復行
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;-- 保留重復行
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
舉例:?
select name,age from students union select name,age from teachers;
#將students表和teachers表中的name和age列合并在一起。
?
#默認union是會自動去重的,union all是不會去重的select * from teachers union select *from teachers;
select * from teachers union all select *from teachers;
7.4?交叉連接 橫向合并(不常用)
通過cross join操作將兩個或多個表中的相關數據組合在一起,基于指定的連接條件。
交叉連接生成的記錄可能會非常多,建議慎用
格式:
SELECT * FROM table1 CROSS JOIN table2;
舉例:?
select * from students cross join teachers;
#students表和teacher表合并
7.5?內連接
返回兩個表中滿足連接條件的記錄。
格式:
SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column;
舉例:
select * from students inner join teachers on students.teacherid=teachers.tid;
#學生表中的teacherid和教師表中的tid相同的行
?
7.5 外連接
外連接可以分為:左連接和右連接
左連接: 以左表為主根據條件查詢右表數據﹐如果根據條件查詢右表數據不存在使用null值填充
右連接: 以右表為主根據條件查詢左表數據﹐如果根據條件查詢左表數據不存在使用null值填充
格式:
-- 左外連接:保留左表所有行
SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column;-- 右外連接:保留右表所有行
SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;
舉例:?
select * from students s left join teachers t on s.teacherid=t.tid;
#左外連接學生表都有,教師表留一部分select * from students s right join teachers t on s.teacherid=t.tid;
#右外連接教師表全部,學生表一部分
7.6 自連接
自連接, 即表自身連接自身
格式:
-- 使用內連接的自連接
SELECT a.column, b.column
FROM table a INNER JOIN table b ON a.column = b.related_column;-- 使用左外連接的自連接
SELECT a.column, b.column
FROM table a LEFT JOIN table b ON a.column = b.related_column;
舉例:?
#構建新表,如下圖所示
create table emp (id int, name varchar(10),leaderid int);
insert emp values(1,'cxk',null),(2,'wyf',1),(3,'zhang',2),(4,'li',3);
select * from emp e left join emp l on e.leaderid=l.id;
#查找每個員工及其對應的領導信息。
7.7 三表查詢
select * from students inner join scores on students.stuid=scores.stuid;
select st.name,sc.CourseID,sc.score from students st inner join scores sc on st.stuid=sc.stuid;
select st.name,co.CourseID,sc.score from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid;
select * from students st inner join scores sc on st.stuid=sc.stuid inner join courses co on sc.courseid=co.courseid;
八. 練習
導入hellodb.sql生成數據庫
1. 在students表中,查詢年齡大于25歲,且為男性的同學的名字和年齡
select name,age from students where age>25 and gender='m'; 2. 以ClassID為分組依據,顯示每組的平均年齡
select classid,avg(age) from students group by classid; 3. 顯示第2題中平均年齡大于30的分組及平均年齡
select classid,avg(age) from students group by classid having avg(age) > 30; 4. 顯示以L開頭的名字的同學的信息
select *from students where name like "l%";5. 顯示TeacherID非空的同學的相關信息
select * from students where TeacherID is not null; 6. 以年齡排序后,顯示年齡最大的前10位同學的信息
select * from students order by age desc limit 10 ;7. 查詢年齡大于等于20歲,小于等于25歲的同學的信息
select * from students where age >= 20 and age <= 25; 8. 以ClassID分組,顯示每班的同學的人數select classid,count(*) from students group by classid;9. 以Gender分組,顯示其年齡之和
select gender,sum(age) from students group by gender;10. 以ClassID分組,顯示其平均年齡大于25的班級
select classid,avg(age) from students group by classid having avg(age) > 25;11. 以Gender分組,顯示各組中年齡大于25的學員的年齡之和
select gender from students where age >25 group by gender;
八. 視圖
將復雜的 SQL 查詢封裝成一個簡單的虛擬表,用戶只需查詢視圖即可獲取所需數據,無需重復編寫復雜的查詢語句。
8.1 創建視圖
語法:
create view 視圖名字 as 查詢語句
舉例:
create view v1 as select * from students where stuid=5;
#創建一個查詢stuid為5的學生的視圖select * from v1;
#運行視圖,效果與執行代碼select * from students where stuid=5;一樣
8.2 刪除視圖
語法:
drop view 視圖名稱
舉例:
drop view v1;
九. 函數
MySQL中的函數分為內置函數和自定義函數
系統內置函數參考網頁:
https://dev.mysql.com/doc/refman/8.0/en/sql-function-reference.html
https://dev.mysql.com/doc/refman/5.7/en/sql-function-reference.html
自定義函數
語法:
create function 函數名字
執行語句
return
舉例:
DELIMITER //
CREATE FUNCTION deleteById(id SMALLINT UNSIGNED)
RETURNS VARCHAR(20)
DETERMINISTIC
MODIFIES SQL DATA
BEGINDELETE FROM students WHERE stuid = id;RETURN (SELECT COUNT(*) FROM students);
END//
DELIMITER ;函數作用:
接收一個無符號小整數類型的參數id
從students表中刪除stuid等于傳入id值的記錄
刪除操作完成后,計算并返回students表中剩余的記錄總數(作為VARCHAR(20)類型返回)
?
十. 存儲過程(了解)
存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要時從數據庫中直接調用,省去了編譯的過程,提高了運行速度,同時降低網絡數據傳輸量
存儲過程與自定義函數的區別
存儲過程實現的過程要復雜一些,而函數的針對性較強存儲過程可以有多個返回值,而自定義函數只有一個返回值存儲過程一般可獨立執行,而函數往往是作為其他SQL語句的一部分來使用無參數的存儲過程執行過程中可以不加(),函數必須加 ( )
十一. 用戶管理
11.1?新建用戶
create user '用戶名'@'源地址' identified by '密碼';'用戶名'
指定將創建的用戶名'來源地址'
指定新創建的用戶可在哪些主機上登錄
可使用IP地址、網段、主機名的形式
本地用戶可用localhost
允許任意主機登錄可用通配符%'密碼'
若使用明文密碼,直接輸入'密碼',插入到數據庫時由Mysql自動加密;若使用加密密碼,需要先使用select password('密碼'); 獲取密文,再在語句中添加 password '密文';若省略“identified by”部分,則用戶的密碼將為空(不建議使用)
11.2?查看用戶信息
#創建后的用戶保存在 mysql 數據庫的 user 表里
use mysql;
select user,authentication_string,Host from user;
11.3?重命名用戶
rename user 'zhangsan'@'localhost' to 'lisi'@'localhost';
11.4 刪除用戶?
drop user 'lisi'@'localhost';
11.5?修改當前登錄用戶密碼
#修改當前用戶的密碼
set password = password('abc123');
11.6修改其他用戶密碼
#方式一
set password for 'user1'@'localhost' = PASSWORD('abc123');#方式二
alter user '用戶名'@'源地址' identified by '密碼';#例子
alter user 'root'@'%' indentified by 'abc123'
11.7 破解密碼
常用于忘記 root 密碼
方法一.?修改 mysql配置文件/etc/my.cnf
?,不使用密碼直接登錄到 mysql
vim /etc/my.cnf
[mysqld]
skip-grant-tables #添加,使登錄mysql不使用授權表
skip-networking ? #MySQL8.0不需要systemctl restart mysqldmysql #直接登錄
方法二.?使用?update
?修改 root 密碼,刷新數據庫
use mysql;update user set authentication_string=password('密碼') where user='root';FLUSH PRIVILEGES;
quitmysql -u root -pabc123#注意:最后再把 /etc/my.cnf 配置文件里的 skip-grant-tables 刪除,并重啟 mysql 服務。
11.8 遠程登錄
mysql -utest -h要登陸的mysql服務IP -p'密碼' -P端口號
十二. 數據庫用戶授權
12.1 授予權限
GRANT語句:專門用來設置數據庫用戶的訪問權限。當指定的用戶名不存在時,GRANT語句將會創建新的用戶;當指定的用戶名存在時, GRANT 語句用于修改用戶信息。 ?
grant 權限列表 on 數據庫名.表名 to '用戶名'@'來源地址' [indentified by '密碼'];#權限列表:用于列出授權使用的各種數據庫操作,以逗號進行分隔,如“select,insert,update”。使用“all”表示所有權限,可授權執行任何操作。
#數據庫名.表名:用于指定授權操作的數據庫和表的名稱,其中可以使用通配符“*”。例如,使用“kgc.*”表示授權操作的對象為 kgc數據庫中的所有表。
#'用戶名@來源地址':用于指定用戶名稱和允許訪問的客戶機地址,即誰能連接、能從哪里連接。
#來源地址可以是域名、IP地址,還可以使用“%”通配符,表示某個區域或網段內的所有地址,如“%.byyb.com”、“192.168.80.%”等。
#IDENTIFIED BY:用于設置用戶連接數據庫時所使用的密碼字符串。在新建用戶時,若省略“IDENTIFIED BY”部分,則用戶的密碼將為空。#舉例
GRANT ALL [PRIVILEGES] ON *.* TO 'lisi'@'%' IDENTIFIED BY '123456';
#允許用戶 lisi 在所有終端遠程連接 mysql ,并擁有所有權限。
?
12.2 查看權限
show grants for 用戶名@來源地址;#舉個例子
show grants for root;
12.3 撤銷權限
revoke 權限列表 on 數據庫名.表名 from 用戶名@來源地址;#例子
revoke all on *.* from zhou@"192.168.91.%";
#撤銷用戶"zhou"從192.168.91.x網段連接時對整個MySQL的所有權限。