MySQL暑假學習(一)
MySQL暑假學習(一)
目錄
MySQL的體系結構術語
MySQL採用的是“客戶端/服務端”
- 服務端:
mysqld
- 客戶端:
mysql
兩個主要用於管理客戶端程式
- mysqldump
用於把表的內容匯出到檔案裡
- mysqladmin
主要用來檢查資料庫伺服器的工作狀態,以及執行一些資料庫管理象關的任務
簡單的建立資料庫使用者(以後還會涉及到)
CREATE USER '使用者名稱'@'資料庫服務機器IP地址' IDENTIFIED BY '密碼';
GRANT ALL ON 資料庫名稱.* TO '使用者名稱'@'資料庫服務端機器IP地址'
back
資料庫的連線和斷開
連線
連線到mysql程式,需要在cmd視窗下,或者shell下使用命令,命令如mysql option;
來進行連線到資料庫。請注意,option是還沒有的命令形式,其部分可為空。
最常見的形式是:
mysql -h host_name -p -u user_name
對於上面,其中:
-h host_name
指定執行服務端的主機名稱(另一種形式:--host=host_name
)
-u user_name
指定mysql的使用者名稱(另一種形式:--user=user_name
)
-p
要求輸入密碼(另一種形式:--password
)
back
斷開
斷開與mysql的連線,我們使用exit;
的指令來終止對話(或者\q
)
back
執行SQL語句
對於sql語句,在每一句的最後的位置,都必須以;
分號或者\g
結束。請注意,\g
和\G
不一樣。
\g
是要求mysql立即執行該查詢語句,使用橫向的方式顯示\G
是要求mysql執行查詢語句,並且使用垂直的方式顯示
如果sql語句不以;
或者\g
結尾,那麼mysql會等待結束命令,一直到你輸入語句結束符為止。
如果輸入了一條多行的sql語句,如果不需要執行,那麼輸入\c
可以清楚這條語句並且不執行。
SQL不分大小寫
back
基本表操作
建立表
使用CREATE TEBLE 表名字(表列)
去建立表,語句還可以包含各種索引的定義,如果有索引定義,能夠加快查詢速度
在建立完成表之後,我們可以使用
DESCRIBE 表名字
,用來查看錶的結構(也可以使用DESC
或者EXPLAIN
,SHOW
語句)
DESCRIBE 表名字
DESC 表名字
EXPLAIN 表名字
SHOW COLUMNS FROM 表名字
SHOW FIELDS FROM 表名字
建立表的時候指明資料庫引擎,類似於下面的寫法
CREATE TABLE mytable
(
id INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(id) REFERENCES newtable(column)
)ENGINE = InnoDB;
上面的寫法,建立了一個表,表名為mytable
,表中有一個項,為id。該表主鍵為id,並且該表設定的儲存引擎為InnoDB
。指名id為外來鍵,與newtable
中的column
行有對應關係。
建立外來鍵會有一種依賴的關係,可以按照一定的順序去建立表和刪除表。
上面的寫法是,必須存在newtable
之後,才能存在mytable
。否則會報錯。而刪除則必須先刪除mytable
之後才能刪除newtable
,否則也會報錯。
back
新增新行
對於建立一個新的表,我們當然要往裡面新增點東西。
一:
- 使用INSERT進行插入
這種方式是一種利用SQL語句進行資料插入的方式,可以用它來指定要插入資料行的那個表以及要插入的資料
INSERT 語句有多種格式
INSERT INTO tbl_name VALUES(value1,value2...)
- 一次性插入全部的值。使用這個語法的時候,首先應該知道
tbl_name
中的每個列的屬性以及順序。可以使用上面介紹的DESCRIBE tbl_name
去查詢(tbl_name
是表名稱)- 可以插入多個值,格式例如
INSERT INTO tbl_name VALUES (value1-1,value1-2...),(values2-1,values2-2...),...
。將每個行的值括起來的括號不可少
INSERT INTO tbl_name(col_name1,col_name2...) VALUES(values1,values2)
這樣的一種方式是命名賦值列。對於這個INSERT語句中沒有涉及到的列,將會被設定為初始狀態值,也就是
default
的狀態。
- 使用"列/值"的形式進行賦值,需要用到SET子句的實現,也就是如同
INSERT INTO tbl_name SET col_name1=value1,col_name2...
這樣的實現請注意,這樣的實現中,是無法進行多行插入的,只能單行插入,對於沒有被賦值的列項,將會自動初始化為預設值。
二:
- 利用檔案的方式新增新行
mysql可以直接從檔案中讀取資料,然後轉換到資料庫中。檔案可以包含INSERT語句或者原始資料。比如有一個檔案(字尾.sql),裡面包含著INSERT語句,那麼有兩種方式可以進行新增
- 如果是在命令列中,而非mysql中,可以使用
mysql db_name < file_name.sql
,使用<
進行重定向,從而進行檔案的輸入。 - 如果是在mysql控制檯中,使用
source file_name.sql
進行讀取這個檔案。
如果檔案中儲存的並非INSERT語句,而是資料,並且預設以製表符分開,並且每行末尾都是換行符,並且每一行中,值的順序與資料庫中的順序相同,就可以進行相關的操作了,預設情況下,使用LOAD DATA
語句就可以資料的插入了。
對於資料庫,可能會需要許可權,如果許可權不足,那麼必須提升許可權或者利用
root
賬戶進行修改選項。其次,還會有檔案路徑的問題,資料庫預設的情況下可能會禁用LOCAL
功能。
back
檢索資訊
表建好了,那我們得進行使用資料了。可以使用SELECT
語句進行檢索和顯示錶裡面的資料資訊,可以使用特定的方式進行檢索。
SELECT * FROM tbl_name
檢索tbl_name
表中的所有資訊
當然,SELECT
語句很複雜,也可以很簡單,對於長句,可以進行簡化。
SELECT what to retrieve FROM table or tables WHERE conditions that data must satisfy;
換句話說,對於資料庫中的檢索資訊,那麼可以使用SELECT
語句進行檢索
back
- 特殊的東西
NULL
NULL
是一種特殊的東西,它表示無值,或者未知值,故不能使用已知值去比較,否則也會得到一個未知值,也就是NULL
。如果使用兩個NULL
進行比較,那麼返回的結果也是NULL
以為兩個未知值比較還是未知值。
如果需要測試多個NULL
的值是否相等,採用IS NULL
或者IS NOT NULL
進行NULL
的比較,而不能用=,!=,<>
但是在運算子中,有一個特殊的運算子,
<=>
,這個東西可以和NULL
去比較。
back
- 使用
ORDER BY tbl_name
進行排序
在查詢的時候,可以使用ORDER BY
進行排序,如果不適用,在你查詢的時候,不見得都是按照一定的順序來的。
ORDER BY
是按照一定的順序來的,預設按照升序的方式,如果需要指定序列,可以在後面使用ASC
或者DESC
來指定排序方式
ASC
是升序,DESC
是降序
SELECT * FROM tbl_name ORDER BY(column) ASC
選擇所有的內容,根據column進行升序排序
在使用ORDER BY
的時候,後面還可以接IF(a,b,c)
函式或者LIMIT
等
back
- 使用
LIMIT
去限制查詢你結果
如果在一個很大的表中,查詢通常會返回很多行,這就使得我們看得很繁瑣(反正本人看得很繁瑣,當然,你也可以看,en),這個時候,我們可以使用LIMIT
去限定幾行進行輸出。
SELECT * FROM tbl_name LIMIT 5;
從tbl_name
中選出所有的列,但是隻顯示前面的5行
LIMIT
子句還允許從查詢結果的中間抽去一部分的行,這個時候需要兩個值,第一個是從查詢結果的開頭跳過的行數目,第二個是需要返回的行數目
SELECT * FROM tbl_name LIMIT 8,6;
從tbl_name
中選擇所有的列顯示,跳過先前的8行,從第9行開始選擇後面的6行輸出顯示
back
- 對輸出的列進行計算和重新命名
使用FORMAT
函式進行輸出格式化
格式為
FOMRAT(N,D,locale);
引數 | 作用 |
---|---|
引數N |
是要格式化的數字 |
引數D |
是要舍入的小數位數(遵循四捨五入原則) |
引數locale |
是可選項,用於確定千分分隔符和分隔符之間的分組 |
back
- 使用
CONCAT(first,' ',last)
進行字串合併
比如在我們的名字中,通常是由姓和名組成的,姓是字首,名是字尾。如果我們資料庫中的表把我們的名字拆成了姓和名分別記錄。如果我們想檢視這個人的名字,那麼我們就可以使用CONCAT(a,connector,b)
這樣的方式來進行連線。如下圖:
在這個例子中,我使用了AS
去進行重新命名顯示的列,格式是something as b
把something
這個東西重新命名為b
。
back
- 處理日期
在MySQL中,可以對日期做多種運算,例如
- 按照日期排序
- 搜尋特定的日期或者日期範圍
- 從日期中獲取年月日
- 計算兩個日期的時差
- 計算出另一個日期
我們可以使用YEAR(),MONTH(),DAYOFMONTH()
這樣的函式檢索日期的各個部分
如果知道兩個日期,需要知道他們相隔的時間,使用TIMESTAMPDIFF()
函式計算出結果。其引數是TIMESTAMPDIFF(unit,begin,end);
引數 | 含義 |
---|---|
unit | 確定結果的單位 |
bengin | DATE或者DATETIME表示式 |
end | 同上 |
其中,unit
的有效單位有:
- MICROSECOND
- SECOND
- MINUTE
- HOUR
- DAY
- WEEK
- MONTH
- QUARTER
- YEAR
如果根據某個日期計算出另一個日期,那麼使用函式DATE_ADD()
或者DATE_SUB
進行計算,前者是日期相加,後者是日期相減,其引數是一個日期值,一個時間間隔。
DATE_ADD(now_date,INTERVAL n DAY);
,now_date相加n天,返回一個新的日期CURDATE()
這個函式主要是返回當前的日期
back
- 匹配模式
MySQL中有匹配模式,這個時候就要使用如同LIKE
或者NOT LIKE
這樣的形式,然後使用_
(下劃線)或者%
(百分號)去進行匹配字串
_
下劃線可以匹配任何的單個字元%
百分號可以匹配任何的字元序列,包括空序列
COUNT()
函式是顯示所有被查詢到的行數。只會統計所有非NULL值的數目
COUNT()
函式返回匹配指定條件的行數。
GROUP BY
使用這個子句,可以對某個計算列的結果進行分組。其中,COUNT()
函式可以和ORDER BY
和LIMIT
組合在一起使用,當然也可以和GROUP BY
如果不是想用LIMIT
子句來先置查詢結果中的記錄條數,而是想把COUNT()
中的某些特定的值找出來,需要用HAVING
子句。
HAVING
子句與WHERE
子句不同之處在於,它可以引用像COUNT()
這樣的彙總函式輸出的結果
彙總函式 | 作用 |
---|---|
COUNT() |
總計數量 |
MIN() |
計算最小值 |
MAX() |
計算最大值 |
SUM() |
計算和 |
AVG() |
計算平均值 |
- 連線多個表查詢資訊
這部分比較龐大,咱先不做筆記.....
back
刪除或更新已有行
- 使用
DELETE
語句進行刪除
- 基本格式:
DELETE FROM tbl_name WHERE which rows to delete;
- 其中的WHERE部分可以省略,如果沒有限定,那麼就是刪除tbl_name中的所有的列。
- 使用
UPDATE
語句進行修改行的內容
- 基本格式:
UPDATE tbl_name SET which columns to change WHERE which rows to update;
- 在基本格式中,WHERE部分可以省略,省略之後更改的是表中的全部內容。
back
資料型別
資料型別 | 定義 |
---|---|
varchar(n) | 可以存放長度可變的字元型之,並且最大字元是n個 |
date | 用於儲存日期值,標準格式CCYY-MM-DD |
int | 存放整型數 |
enum('a','b') | 列舉型別,指定括號裡面的字元 |
back
列屬性
屬性 | 作用 |
---|---|
not null | 必須有值 |
null | 可以沒有值 |
auto_increment | 存放序號,並且自動生成唯一編號 |
unsigned | 值不能為負 |
primary key | 約束值必須唯一 |
primary key(a,b) | 約束a,b兩個值,使其為唯一 |
foreign key(a) references table(b) | 當前表中的列名稱為a的列與表名為table中的列名為b的列對應,且每一個a都必須與一個b對應 |
index(a) | 根據列名為a的列建立索引 |
IF(a,b,c) | if函式,作用是計算出第一個引數給出的那個表示式的值,然後根據計算結果來決定是返回第二個引數還是第三個引數,第二個引數是真值,第三個引數是假值 |
back
算術運算子
運算子 | 含義 |
---|---|
+ | 加法 |
- | 減法 |
* | 乘法 |
/ | 除法 |
DIV | 整除 |
% | 模運算 |
back
比較運算子
運算子 | 含義 |
---|---|
< | 小於 |
<= | 小於等於 |
= | 等於 |
<=> | 等於 |
<> 或者 != | 不等於 |
>= | 大於等於 |
> | 大於 |
back
邏輯運算子
運算子 | 含義 |
---|---|
AND | 邏輯與 |
OR | 邏輯或 |
XOR | 邏輯異或 |
NOT | 邏輯非 |
back
參考書籍《MySQL技術內幕(第5版)》
如若轉載,請註明出處