1. 程式人生 > 實用技巧 >MySQL暑假學習(一)

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 bsomething這個東西重新命名為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 BYLIMIT組合在一起使用,當然也可以和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版)》

如若轉載,請註明出處

https://www.cnblogs.com/Yunrui-blogs/p/13340400.html