一、數據庫基礎
1. 連接數據庫
- mysql --host=localhost --user=root --password test
- mysql -h localhost -u root -p test;
- mysql -u root -p
2. 斷開MySQL服務器
quit
3. 創建數據庫
create database 數據庫名;
4. 查看數據庫
- select version():查看MySQL版本
- select current_date / curdate()、select current_time / curtime():查看當前日期、時間 = select now();
- show databases:查看數據庫
- show tables:查看數據表
- show columns from 數據表名[from 數據庫名]:查看錶結構
- describe 數據表名 列名;describe簡寫desc:查看錶結構
5. 選擇數據庫
- use 數據庫名;
- mysql -d 所選擇的數據庫名 -h 主機名 -u 用戶名 -p;
6. 刪除數據庫
drop database 數據庫名;
7. 創建數據表
create [temporary] table [if not exists] 數據表名 [(create_definition,...)][table_options][select_statement];
參數 | 說明 |
temporary | 如果使用該關鍵字,表示創建一個臨時表 |
if not exists | 該關鍵字用於避免表不存在時MySQL報告的錯誤 |
create_definition | 表的列屬性部分,MySQL要求在創建表時,表至少包含一列 |
table_options | 表的一些特性參數 |
select_statement | select語句描述部分,用它可以快速地創建表 |
參數 | 說明 |
col_name | 字段名 |
type | 字段類型 |
NOT NULL | NULL | 指出該列是否允許是空值,系統一般默認允許爲空值,當不允許爲空值設置NOT NULL; |
DEFAULT default_values | 表示默認值 |
AUTO_INCREMENT | 表示是否是自動編號,每個表只能有一個AUTO_INCREMENT列,並且必需被索引 |
PRIMARY KEY | 表示是否爲主鍵,一個表只能有一個PRIMARY KEY。 |
reference_definition | 爲字段添加註釋 |
8. 插入數據
insert [into] 表明 [(列名1,列名2,列名3,...)] values (值1,值2,值3,...);
9. 查詢表中的數據
select 列名稱 from 表名稱 [where 條件];
10. 更新表中的數據
update 表名稱 set 列名稱 = 新值 where 更新條件;
11. 刪除表中的數據
delete from 表名稱 where 刪除條件;
12. 創建後表的修改
- 添加列:alter table 表名 add 列名 列數據類型 [after 插入位置];
- 修改列:alter table 表名 change 列名稱 列新名稱 新數據類型。
- 刪除列:alter table 表名 drop 列名稱;
- 重命名錶:alter table 表名 rename 新表名;
- 刪除整張表:drop table 表名;
- 刪除整個數據庫:drop database 數據庫名;
- 修改子句定義字段:modify 列名 列數據類型;
修改root 用戶密碼
mysql admin -u root -p password 新密碼;
二、MySQL數據庫備份和恢復
1. 數據的備份
mysqldump -u root -p 需要備份的數據庫 >“c:\users\simple\desktop\test.txt”(備份的路徑以及文件名,注意命令末尾不能加分號";",否則報錯)
2. 數據的恢復
mysql -u root -p test < "c:\users\simple\desktop\test.txt"
三、其他
1. MySQL所處狀態的含義
提示 | 含義 |
mysql> | 準備好進行新查詢 |
-> | 等待多行查詢的下一行 |
'> | 等待下一行,等待以單引號開頭的字符串的完成( ' ) |
"> | 等待下一行,等待以雙引號開頭的字符串的完成( " ) |
`> | 等待下一行,等待以反引號( ` )開頭的標識符的完成 |
/*> | 等待下一行,等待以 # 開頭的評論完成 /* |
在執行某語句時,鍵入 \c 可以切換回來,mysql>
2. 信息功能
名稱 | 描述 |
---|---|
BENCHMARK() |
反覆執行表達式 |
CHARSET() |
返回參數的字符集 |
COERCIBILITY() |
返回字符串參數的歸類強制性值 |
COLLATION() |
返回字符串參數的排序規則 |
CONNECTION_ID() |
返回連接的連接ID(線程ID) |
CURRENT_USER() , CURRENT_USER |
經過身份驗證的用戶名和主機名 |
DATABASE() |
返回默認(當前)數據庫名稱 |
FOUND_ROWS() |
對於帶有LIMIT子句的SELECT,返回的行數沒有LIMIT子句 |
LAST_INSERT_ID() |
最後一次INSERT的AUTOINCREMENT列的值 |
ROW_COUNT() |
行數已更新 |
SCHEMA() |
DATABASE()的同義詞 |
SESSION_USER() |
USER()的同義詞 |
SYSTEM_USER() |
USER()的同義詞 |
USER() |
客戶端提供的用戶名和主機名 |
VERSION() |
返回表示MySQL服務器版本的字符串 |
3. 將文本加載數據表中
mysql> load data local infile "文件路徑及名稱" into table 數據表;
4. 將 .sql 文件導入到MySQL的數據庫中
mysql> source 文件路徑及文件名稱.sql;
5. 使用 distinct 去除重複的數據。
mysql> select distinct name from users;
6. 排序行
mysql> select * from users order by name [asc];(默認爲升序)
mysql> select * from users order by name desc;(按降序排序)
對多個列進行排序,並且可以按不同方向對不同列進行排序:mysql> select name,gender,email from users order by gender ,email desc; (DESC
關鍵字僅適用於緊鄰其前面的列名,它不會影響對gender列排序)
7. where 運算符
操作符 | 描述 |
---|---|
= | 等於 |
<> | 不等於 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
BETWEEN | 在某個範圍內 |
LIKE |
搜索某種模式 |
查詢使用death IS NOT NULL
而不是death <> NULL
因爲 NULL
是一個特殊值
8. 規定要返回的數據記錄數目
mysql> select * from users limit 需要返回數據的數目(數字)
9. 通配符
通配符 | 描述 |
---|---|
% | 替代一個或多個字符 |
_ | 僅替代一個字符 |
10. Alias(別名):返回的數據是別名的字段
- 表的Alias語法:select column_name(s) from table_name as alias_name
- 列的Alias語法:select column_name as alias_name from table_name;
11. join用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據
- 內連接查詢:使用關鍵字join、cross join或inner join
語法:select column_name(s) from table_name1 inner join table_name2 on table_name1.uid=table_name2.id
- 外連接查詢:左外查詢left join、右外查詢right join
語法:select column_name(s) from table_name1 left join table_name2 on table_name1.uid=table_name2.id
LEFT JOIN 關鍵字會從左表 (table_name1) 那裏返回所有的行,即使在右表 (table_name2) 中沒有匹配的行
語法:select column_name(s) from table_name1 right join table_name2 on table_name1.uid=table_name2.id
RIGHT JOIN 關鍵字會右表 (table_name2) 那裏返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。
- 全連接 full join
語法:select column_name(s) from table_name1 full join table_name2 on table_name1.column_name=table_name2.column_name;
只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行
12. union 操作符
union操作符用於合併兩個或多個select語句的結果集
語法:select column_name(s) from table_name1 union select column_name(s) from table_name2;
默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL,另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
語法:select column_name(s) from table_name1 union all select column_name(s) from table_name2;
13. 日期和時間函數
名稱 | 描述 |
---|---|
ADDDATE() |
將時間值(間隔)添加到日期值 |
ADDTIME() |
添加時間 |
CONVERT_TZ() |
從一個時區轉換爲另一個時區 |
CURDATE() |
返回當前日期 |
CURRENT_DATE() , CURRENT_DATE |
CURDATE()的同義詞 |
CURRENT_TIME() , CURRENT_TIME |
CURTIME()的同義詞 |
CURRENT_TIMESTAMP() , CURRENT_TIMESTAMP |
同義詞NOW() |
CURTIME() |
返回當前時間 |
DATE() |
提取日期或日期時間表達式的日期部分 |
DATE_ADD() |
將時間值(間隔)添加到日期值 |
DATE_FORMAT() |
格式化日期指定 |
DATE_SUB() |
從日期中減去時間值(間隔) |
DATEDIFF() |
減去兩個日期 |
DAY() |
DAYOFMONTH()的同義詞 |
DAYNAME() |
返回工作日的名稱 |
DAYOFMONTH() |
返回當月的日期(0-31) |
DAYOFWEEK() |
返回參數的工作日索引 |
DAYOFYEAR() |
返回一年中的某一天(1-366) |
EXTRACT() |
提取部分日期 |
FROM_DAYS() |
將日期號碼轉換爲日期 |
FROM_UNIXTIME() |
將Unix時間戳格式化爲日期 |
GET_FORMAT() |
返回日期格式字符串 |
HOUR() |
提取小時 |
LAST_DAY |
返回參數的月份的最後一天 |
LOCALTIME() , LOCALTIME |
NOW()的同義詞 |
LOCALTIMESTAMP , LOCALTIMESTAMP() |
NOW()的同義詞 |
MAKEDATE() |
創建年份和年中的日期 |
MAKETIME() |
從小時,分鐘,秒創建時間 |
MICROSECOND() |
從參數返回微秒 |
MINUTE() |
從論證中返回分鐘 |
MONTH() |
從過去的日期返回月份 |
MONTHNAME() |
返回月份名稱 |
NOW() |
返回當前日期和時間 |
PERIOD_ADD() |
添加一個月到一個月 |
PERIOD_DIFF() |
返回句點之間的月數 |
QUARTER() |
從日期參數返回季度 |
SEC_TO_TIME() |
將秒轉換爲'HH:MM:SS'格式 |
SECOND() |
返回第二個(0-59) |
STR_TO_DATE() |
將字符串轉換爲日期 |
SUBDATE() |
使用三個參數調用時DATE_SUB()的同義詞 |
SUBTIME() |
減去時間 |
SYSDATE() |
返回函數執行的時間 |
TIME() |
提取傳遞的表達式的時間部分 |
TIME_FORMAT() |
格式化爲時間 |
TIME_TO_SEC() |
返回轉換爲秒的參數 |
TIMEDIFF() |
減去時間 |
TIMESTAMP() |
使用單個參數,此函數返回日期或日期時間表達式; 有兩個參數,參數的總和 |
TIMESTAMPADD() |
在datetime表達式中添加間隔 |
TIMESTAMPDIFF() |
從日期時間表達式中減去間隔 |
TO_DAYS() |
返回轉換爲days的日期參數 |
TO_SECONDS() |
返回自0年以來轉換爲秒的日期或日期時間參數 |
UNIX_TIMESTAMP() |
返回Unix時間戳 |
UTC_DATE() |
返回當前的UTC日期 |
UTC_TIME() |
返回當前的UTC時間 |
UTC_TIMESTAMP() |
返回當前的UTC日期和時間 |
WEEK() |
返回週數 |
WEEKDAY() |
返回工作日索引 |
WEEKOFYEAR() |
返回日期的日曆周(1-53) |
YEAR() |
迴歸年份 |
YEARWEEK() |
返回年份和星期 |
14. 正則表達式
- ^:匹配字符串的開頭
- $:匹配字符串的結尾
- . :匹配任何字符(包括回車和換行符)
- a*:匹配零個或多個
a
字符的任何序列 - a+:匹配一個或多個
a
字符的任何序列(至少有一個) - a?:匹配零個或一個
a
字符(至多一個) - de|abc:匹配任何序列de或abc(輪換)
- (abc)*:匹配序列的零個或多個實例abc
- {n},{m,n}:匹配完全匹配的實例(
m
並且n
必須在範圍從0
到RE_DUP_MAX
(默認255),包括端值。) - [a-dX],[^a-dX]:匹配任何字符,該字符(或不是,如果
^
被使用)任一a
,b
,c
,d
或X
。
15. 聚合(Group By)功能
AVG()
返回參數的平均值BIT_AND()
按位返回ANDBIT_OR()
按位返回ORBIT_XOR()
按位返回異或COUNT()
返回返回的行數COUNT(DISTINCT)
返回許多不同值的計數GROUP_CONCAT()
返回一個連接的字符串MAX()
返回最大值MIN()
返回最小值STD()
返回人口標準差STDDEV()
返回人口標準差STDDEV_POP()
返回人口標準差STDDEV_SAMP()
返回樣本標準差SUM()
歸還總和VAR_POP()
返回人口標準差異VAR_SAMP()
返回樣本方差VARIANCE()
返回人口標準差異
16. 使用用戶定義的變量
mysql>select @min_id:=min(id),@max_id:=max(id) from users;
mysql>select * from users where id=@min_id or id=@max_id;
17. 計算數據總數並去除重複的數據
- select bit_count(bit_or(column_name)) as alias_name from table_name;
- select count(distinct column_name) from table_name;
五、mysql 數據庫優化
優化查詢的注意考慮因素:
1. 要select...where加快查詢速度,首先要檢查的是是否可以添加索引。在where子句中使用的列上設置索引,以加快評估,過濾和結果的最終檢索。爲避免浪費磁盤空間,請構建一小組索引,以加快應用程序中使用的許多相關查詢。
2. 隔離並調整查詢的任何部分,例如函數調用,這回佔用過多時間。根據查詢的結構,可以爲結果集中的每一行調用一次函數,甚至可以爲表中的每一行調用一次函數,從而大大減輕任何低效率。
3. 最大限度地減少查詢中的全表掃描次數,尤其是對大型表。
4. 通過analyze table定期使用語句使表統計信息保持最新,因此優化程序具有構建有效執行計劃所需的信息。
5. 瞭解特定於每個表的存儲引擎的調優技術,索引技術和配置參數,雙方InnoDB並MyISAM有兩套準則的實現和維持查詢高性能。
6. 如果其中一個基本準則無法輕鬆解決性能問題,通過閱讀查詢調用特定查詢的內部詳細信息explain計劃並調整索引、where子句、連接子句。
7. 調整MySQL用於緩存的內存區域的大小和屬性,通過有效使用InnoDB緩衝池,MyISAM密鑰緩存和MySQL查詢緩存,重複查詢運行的更快,用爲第二次以及以後的時間從內存中檢索結果