整理了一下 mysql 操作語言,不是很全,部分地方也許需要修改,先放上來,有時間再慢慢完善。
一、數據庫操作
連接數據庫
$ sudo mysql [-h ip] -u root -p [-P 3306]
初始化數據庫
$ mysql_secure_installation
備份數據庫
# 備份一個或多個數據庫
$ sudo mysqldump [options] --databases 數據庫名,... > 備份文件# 備份所有數據庫
$ sudo mysqldump [options] --all-databases > 備份文件# 備份一個或多個表
$ sudo mysqldump [options] 數據庫名 [表名,...] > 備份文件
常用的 options:
- -u, --user= username :數據庫用戶名。
- -p, --password[= password]:數據庫密碼。
- -P, --port= portnumber :指定端口。
- -h, --host= hostname :指定主機名。
- -r, --result-file= filename :將導出結果保存到指定的文件中,等同于“>”。
- -t:只備份數據。
- -d:只備份表結構。
還原數據庫
$ sudo mysql [-h 主機名] [-P 3306] -u 用戶名 -p 數據庫名 < 已備份文件
二、數據庫系統變量操作
mysql 系統變量有全局變量和會話變量兩類。
- 全局變量(global variables)的修改只在當前 mysql 服務有效,當 mysql 服務重啟后變量將重新初始化;
- 會話變量(session variables)的修改只在當前會話中有效,關閉會話并重新打開會話后該變量設置失效。
-- 查看所有全局|會話變量,省略參數則默認為會話變量
mysql> show [global|session] variables;
-- 查看字符集變量
mysql> show variables like '%character%';
-- 查看密碼規則變量
mysql> show variables like 'validate_password%';
-- 修改密碼策略(0 low,1 medium,2 strong)
mysql> set global validate_password.policy=0;
注意:用 set 修改全局變量,mysql重啟失效;修改會話變量后,關閉會話失效。
三、數據庫用戶管理
mysql 的用戶信息(用戶名、允許訪問的地址、密碼驗證策略、有關權限等等)存儲在 mysql.user 表中。
-- 創建數據庫用戶
mysql> create user '用戶名'@'主機名' identified [with 密碼驗證規則] by '密碼';
主機名表示在哪臺主機上可以登錄 mysql,可以是 ip 地址,并且可以使用 % 通配符。其中:localhost 表示本機,% 通配符則表示任意 ip。
通過 create 創建的用戶沒有任何權限,需要通過 grant 來對用戶授權。
-- 給數據庫用戶賦權
mysql> grant privileges on 數據庫名.數據庫對象名 to '用戶名'@'主機名' [with grant option];
priveleges 表示用戶的操作權限,如
select
,insert
,update
等,多個權限之間?逗號分開。如果要授予所有的權限則使用all
。
數據對象名主要為:表、視圖、存儲過程、存儲函數等。*.*表示所有任意數據庫的任意對象。
with grant option
:可選參數,表示該用戶可以給將??擁有的權限授權給別?。
-- 刷新權限,賦權之后通常要刷新權限
mysql> flush privileges;
-- 查看用戶權限
mysql> show grants [for '用戶名'@'主機名'];
-- 撤銷用戶權限,參數與 grant 賦權的參數含義相同
mysql> revoke privileges on 數據庫名.表名 from '用戶名'@'主機名';
-- 修改數據庫用戶
mysql> alter user '用戶名'@'主機名' identified [with 密碼驗證規則] by '密碼';
-- 刪除數據庫用戶
mysql> drop user [if exists] '用戶名'@'主機名';-- 因為數據庫用戶存儲在mysql.user表中,因此可以通過表操作語言來刪除,但記得要調用flush privileges 來刷新權限。
mysql> delete from mysql.user where user='用戶名' and host='主機名';
mysql> flush privileges;
四、數據庫管理
-- 創建數據庫
mysql> create database [if not exists] 數據庫名 [character set 字符集名];-- 顯示所有數據庫
mysql> show databases;-- 選擇數據庫
mysql> use 數據庫名;-- 修改數據庫
mysql> alter database 庫名 character set 字符集名;-- 刪除數據庫
mysql> drop database [if exists] 庫名;
五、表相關語法
-- 創建表
mysql> create table [if not exists] 表名(…字段名 字段類型 [約束],...);-- 查看表結構
mysql> desc table_name;-- 查看所有表
mysql> show tables;-- 添加列
mysql> alter table 表名 add column 列名 類型 [first|after 字段名];-- 修改列類型&約束
mysql> alter table 表名 modify column 列名 新類型 [新約束];-- 修改列名稱
mysql> alter table 表名 change column 舊列名 新列名 類型;-- 刪除列
mysql> alter table 表名 drop column 列名;-- 修改表名
mysql> alter table 表名 rename [to] 新表名;-- 刪除表
mysql> drop table[if exists] 表名;-- 復制表
mysql> create table 表名 like 舊表;-- 復制表結構&數據
mysql> create table 表名 select 查詢列表 from 舊表[where 篩選];-- 創建索引
mysql> create [unique|fulltext|spatial] index index_name[using index_type] on table_name (index_col_name,...)-- 刪除索引
mysql> alter table table_name drop index index_name;-- 查看索引
mysql> show index from table_name;
插入數據語法
-- 插入多行
mysql> insert into 表名(字段名,…) values(值,…);-- 子查詢插入
mysql> insert into 表名 (查詢語句);
刪除數據語法
mysql> delete from 表名 [where 篩選條件][limit 條目數];
修改數據語法
mysql> update 表名 set 字段=值,字段=值 [where 篩選條件];
查詢數據語法
-- 綜合
mysql> select 查詢列表 from 表1 [別名 連接類型 join 表2 on 連接條件 where 篩選 group by 分組列表 having 篩選 order by排序列表 limit 起始條目索引,條目數];-- 通配符
mysql> select 查詢列表 from 表名 where 列名 like 'test%'-- 子查詢
mysql> select 查詢列表 from 表名 where 列名 in(子查詢)-- 子查詢為真才有結果
mysql> select 查詢列表 form 表名 where exists (子查詢)
表連接查詢語法
-- 返回兩個表中聯結字段相等的行
mysql> select * from table1 A inner join table2 B on A.id=B.id;-- 左表中的所有記錄和右表中聯結字段
mysql> select * from table1 A left join table2 B on A.id=B.id;相等的記錄-- 右表中的所有記錄和左表中聯結字段相等的記錄
mysql> select * from table1 A right join table2 B on A.id=B.id;
視圖相關語法
-- 創建視圖
mysql> create view 視圖名 as select 語句;-- 刪除視圖
mysql> drop view 視圖名
union集語法
-- 不重復并集
mysql> [SELECT 語句 1] UNION [SELECT 語句 2];-- 重復并集
mysql> [SELECT 語句 1] UNION ALL [SELECT 語句 2];
case語法
select case (列名) when '條件1' then '結果1' when '條件2' then '結果2'[else '結果N']endfrom 表名
六、存儲過程
存儲過程創建的格式為:CREATE PROCEDURE 過程名 ([過程參數[,...]])[特性 ...] 過程體
,其中過程體是以 BEGIN
作為開始標志,以 END
作為結束標志的,下面進行簡單的演示:
創建存儲過程
mysql> use mysql; --選擇 mysql 數據庫
mysql> DELIMITER $$ --聲明分隔符為 $$ (默認分隔符是分號,聲明 $$ 分隔符后再碰到分號,就不會立即執行語句了)
mysql> CREATE PROCEDURE Proc(IN p1 varchar(32)) --創建存儲過程,過程名為Proc,帶字符型輸入參數 p1-> BEGIN --過程體以關鍵字 BEGIN 開始-> select user,host from user where user=p1; --過程體語句,查找用戶名為 p1 的用戶-> END --過程體以關鍵字 END 結束-> $$ --輸入 $$ 分隔符,執行上面的語句,也就是完成了存儲過程的創建
mysql> DELIMITER ; --將語句的結束符號恢復為分號
調用存儲過程
mysql> SET @p1='root' --因此上面的存儲過程有一個輸入參數,所以先定義一個變量 @p1
mysql> call Proc(@p1); --調用存儲過程
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)
查看存儲過程
mysql> show procedure status where db='mysql'; --查看 mysql 數據庫中所有的存儲過程狀態信息
+-------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| mysql | proc | PROCEDURE | root@localhost | 2023-12-09 22:03:36 | 2023-12-09 22:03:36 | DEFINER | | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+-------+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)mysql> select routine_name from information_schema.routines where routine_schema='mysql'; --查看 mysql 數據庫中所有的存儲過程名
+--------------+
| ROUTINE_NAME |
+--------------+
| proc |
+--------------+
1 row in set (0.00 sec)mysql> SHOW CREATE PROCEDURE mysql.Proc; --查看某個存儲過程的具體信息
刪除存儲過程
mysql> DROP PROCEDURE IF EXISTS Proc; --僅當存在時刪除,如果指定的過程不存在,則產生一個錯誤
有關函數
1)數學函數
SQRT(number) --求平方根
ABS(number) --絕對值
CEILING(number2) --向上取整
CONV(number2,from_base,to_base) --進制轉換
FLOOR(number2) --向下取整
FORMAT(number,decimal_places) --保留小數位數
BIN(decimal_number) --十進制轉二進制
HEX (DecimalNumber) --十進制轉十六進制,HEX()中還傳入字符串,返回值是其ASC-11碼,如HEX('DEF')返回4142143
GREATEST(x1,x2…) --求最大值
LEAST(number , number2 [,..]) --求最小值
MOD(numerator ,denominator) --求余
POWER(number ,power) --求指數
RAND([seed]) --隨機數
ROUND(number,decimals) --四舍五入,decimals 為小數位數
2)聚合函數
avg() --平均值
count() --個數
min() --最大值
max() --最小值
sum() --求和
3)字符串函數
SPACE(count) --生成count個空格
REVERSE(str) --字符串反轉
CHARSET(str) --返回字串字符集
CONCAT(str [,... ]) --連接字串
LCASE(str ) --轉換成小寫,也可用lower(str)
UCASE(str ) --轉換成大寫,也可用UPPER(str )
LEFT (str ,length ) --從str中的左邊起取length個字符
RIGHT(str ,length ) --從str中的右邊起取length個字符
LENGTH (str ) --返回長度
LOAD_FILE (file_name ) --從文件讀取內容
INSTR (str,substring ) --返回substring首次在str中出現的位置,不存在返回0
LOCATE (substring , string [,start_position ] ) --同INSTR,但可指定開始位置
LPAD (str ,length ,pad ) --重復用pad加在string開頭,直到字串長度為length
LTRIM (str ) --去除前端空格
REPEAT (str ,count ) --重復count次
REPLACE (str ,search_str ,replace_str ) --在str中用replace_str替換search_str
RPAD (str ,length ,pad) --在str后用pad補充,直到長度為length
RTRIM (str ) --去除后端空格
STRCMP (str1 ,str2 ) --逐字符比較兩字串大小,返回-1,0,1
SUBSTRING (str , position [,length ]) --從str的position開始,取length個字符
4) 日期時間函數
ADDTIME (date2 ,time_interval ) --將time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) --轉換時區
CURRENT_DATE ( ) --當前日期
CURRENT_TIME ( ) --當前時間
CURRENT_TIMESTAMP ( ) --當前時間戳
DATE (datetime ) --返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) --在date2中加上日期或時間
DATE_FORMAT (datetime ,FormatCodes ) --使用formatcodes格式顯示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) --在date2上減去一個時間
DATEDIFF (date1 ,date2 ) --兩個日期差
DAY (date ) --返回日期的天
DAYNAME (date ) --英文星期
DAYOFWEEK (date ) --星期(1-7) ,1為星期天
DAYOFYEAR (date ) --一年中的第幾天
EXTRACT (interval_name FROM date ) --從date中提取日期的指定部分
MAKEDATE (year ,day ) --給出年及年中的第幾天,生成日期串
MAKETIME (hour ,minute ,second ) --生成時間串
MONTHNAME (date ) --英文月份名
NOW ( ) --當前時間
SEC_TO_TIME (seconds ) --秒數轉成時間
STR_TO_DATE (string ,format ) --字串轉成時間,以format格式顯示
TIMEDIFF (datetime1 ,datetime2 ) --兩個時間差
TIME_TO_SEC (time ) --時間轉秒數]
WEEK (date_time [,start_of_week ]) --第幾周
YEAR (datetime ) --年份
DAYOFMONTH(datetime) --月的第幾天
HOUR(datetime) --小時
LAST_DAY(date) --date的月的最后日期
MICROSECOND(datetime) --微秒
MONTH(datetime) --月
MINUTE(datetime) --分返回符號,正負或0