SQL語句的特點 不區分大小寫 分為DDL,DML,DQL,DCL四個分支 註釋格式為/* */多行註釋和#單行註釋 註: DDL(Data definition Language)資料庫定義(比如說表,資料庫) DML(Data Mainpulation Language)資料庫表的增刪改查 DQ ...
SQL語句的特點
- 不區分大小寫
- 分為DDL,DML,DQL,DCL四個分支
- 註釋格式為/* */多行註釋和#單行註釋
註:
DDL(Data definition Language)資料庫定義(比如說表,資料庫)
DML(Data Mainpulation Language)資料庫表的增刪改查
DQL(Data Query Language)資料庫數據的查詢
DCL(Data control Language)資料庫許可權的設置
數據類型
數字類型
整型類型 | 占用位元組 |
---|---|
tinyint | 1 |
smallint | 2 |
mediumint | 3 |
int | 4 |
bigint | 8 |
浮點數類型 | 占用位元組 |
---|---|
float | 4 |
double | 8 |
dectmal | 自定義 |
註:
浮點數寫成
float(精度,標度)這種
123.45這個數的精度是5,標度是2
dectmal的大小取決於我們自己定義的精度和標度
字元串類型
字元串類型 | 占用位元組 |
---|---|
char | 自定義 |
varchar | 自定義 |
註:
字元串的寫法是:
char(位元組數)
其中char和varchar的區別
char(10)即使你本身數據占用了1個字元其他會用空格補成10個字元的
varchar(10)如果存儲1個字元的他就占用一個字元
char的性能會高一些,varchar的性能會低一些因為varchar使用的時候要計算一些大小
二級制數據類型 | 文本數據類型 |
---|---|
tinyblob | tingtext |
mediumblob | mediumtext |
blob | text |
longblob | longtext |
註:
blob數據類型一般用來存儲二進位數據比如說安裝包,視頻,音樂等
text數據類型一般用來存儲長文本內容
日期類型
日期數據類型 | 占用大小 | 描述 |
---|---|---|
data | 3 | 年-月-日 |
time | 3 | 時-分-秒 |
datatime | 8 | 年-月-日-時-分-秒- |
year | 1 | 年 |
timestamp | 4 | 年-月-日-時-分-秒 |
註:
timestamp最大是2038年-1月-19號
DDL語法
1.對資料庫的操作
創建資料庫
Create database [if not exists] 資料庫名 [default charset 字元集] [collate 排序規則];
刪除資料庫
Drop database [if exists] 資料庫名;
查詢資料庫
查詢所有資料庫
show databases;
查詢當前所處的是哪個資料庫
select database();
進入資料庫
Use 資料庫名;
2.對錶的操作
查詢表內有哪些欄位
Desc 表名;
顯示資料庫內的所有表
Show tables;
查詢表的創建語法是什麼
Show create table;
創建表
Create table 表名(
欄位1 數據類型 [comment 註釋內容] [約束條件],
.......
欄位n 數據類型 [comment 註釋內容] [約束條件]
)[comment 註釋內容] [charset 字元集] [engine=引擎名];
刪除表
Drop table [if exists] 表名;
對錶欄位的添加
Alter table 表名 add 欄位名 數據類型 [comment 註釋] [約束條件];
對錶欄位的刪除
Alter table 表名 drop 欄位名;
對錶欄位的修改
Alter table 表名 change 舊欄位 新欄位 類型 [comment 註釋] [約束條件];
對錶的名字修改
Alter table 表名 rename to 新表名;
DML語法
Insert(插入數據)
語法
insert into 表名(欄位列表) values(值列表),(值列表),(值列表).....;
如果要給全部欄位添加值那麼,欄位列表可以不加
insert into 表名 values(值列表);
註:
符串和日期要加引號,欄位和值要一一對應
Update(更新數據)
語法
Update 表名 set 欄位=值,欄位=值.... [where 條件];
註:
如果不加where條件就會對整個欄位進行修改
Delete(刪除數據)
語法
Delete from 表名 [where 條件];
註:
- 如果不加where條件就會刪除全部數據
- delete是對錶的整行進行刪除
- 要刪除一行內的某個欄位數據,用update將其設置為none即可
DQL語法
基本查詢
語法
select 欄位列表 from 表名;
註:
*可以代表所有欄位,一般不用*因為可能觸發回表查詢(詳見索引應用)
條件查詢
語法
select 欄位列表 from 表名 where 條件;
一些條件:
符號 | 描述 |
---|---|
> | 大於 |
< | 小於 |
= | 等於 |
>= | 大於等於 |
<= | 小於等於 |
!=或者<> | 不等於 |
between A and B | 在a到b之內(包含A,B) |
IN(值列表) | 在這些值之中(只要滿足其中一個值即可) |
Like '占位符' | %代表任意字元, _ 代表一個字元 |
is NULL | 是null |
邏輯運算符 | 描述 |
---|---|
and 或寫成&& | 多個條件同時成立 |
or 或寫成 || | 或者 |
Not 或者寫成 ! | 否定 |
註:
關於is null和is none涉及到mysql特有的三值邏輯
三值邏輯和null(重要!!)
Null的含義
NULL 用於表示缺失的值或遺漏的未知數據,不是某種具體類型的值。
數據表中的 NULL 值表示該值所處的欄位為空,值為 NULL 的欄位沒有值,尤其要明白的是:NULL 值與 0 或者空字元串是不同的。
倆種NULL
在SQL中雖然只存在一種null但是我們討論的時候將其分為倆種null
分別是
- 未知(unknown)
就好比一個人帶了墨鏡我們不知道他眼睛是什麼顏色這就叫未知 - 不適用(not applicable,inapp licable)。
就好比一個冰箱帶了墨鏡,或者問你男人生孩子的次數,這種情況就叫不適用
三值邏輯
主流語言(c,c++,php等)只有true和false的倆個邏輯值,但是在SQL中還存在另外一個邏輯值unknown
就類似。對(true),錯(false),不知道(unknown)
故unknown分為:
邏輯值unknown,作為null的unknown
邏輯值unknown是一個明確的布爾值
作為null的unknown既不是值也不是變數
例如x=x,當x是邏輯值unknown的時候返回true,如果是作為null的unknown的時候返回的是unknown
邏輯值unknown的情況
假定x和y是unknown
故 not x 也為unknown
其他的記住優先順序即可
- AND 的情況:false > unknown > true
- OR 的情況:true > unknown > false
比如 false and unknown 返回的就是 false因為false的比較級更高!
true and unknown 返回的是 unknown因為unknown的比較級更高!
or同理
=null和 is null的區別
對於null如果使用=,>,<等比較詞的時候返回的值都是unknown
而查詢結果只會包含 WHERE 子句里的判斷結果為 true 的行,不會包含判斷結果為 false 和 unknown 的行。
NULL 既不是值也不是變數。NULL 只是一個表示沒有值的標記,而比較謂詞只適用於值。
故使用比較詞給null是沒有意義的!
聚合函數
常見的聚合函數
名字 | 描述 |
---|---|
count(欄位A) | 統計數量 |
max(欄位A) | 最大值 |
min(欄位A) | 最小值 |
avg(欄位A) | 平均數 |
sum(欄位A) | 求和 |
用法:select 聚合函數 from 表名;
一般配合分組查詢使用
分組查詢
語法
select 欄位列表 from 表名 where 條件 group by 要分組的欄位 having 條件;
註:
- 如果不用group by分組的話就是把全部數據放到同一組的意思
- where是分組前的過濾。Having是分組後的過濾
- 比如說以男,女分組並統計男女的年齡的平均數
- 查詢的函數一般為分組的欄位和聚合函數,查詢其他的無意義
- 執行順序是 where->聚合函數->having
- 分組查詢就好比將一個父表根據欄位分成多個子表然後進行查詢操作
排序查詢
語法
select 欄位列表 from 表名 order by 欄位名 排序方法,欄位名,排序方法....;
名子 | 描述 |
---|---|
Desc | 降序 |
Asc | (預設)升序 |
註:
如果第一個欄位值相同就按第二個欄位進行排序
分頁查詢
語法
select 欄位列表 from 表名 limit 起始索引 要查詢記錄條數;
起始索引值=(要查詢的頁數–1)查詢記錄數
例如第二頁有10條記錄數,起始索引就是(2-1)10=10
如果查詢第一頁數據直接 limit 10,不需要寫起始索引
執行順序
編寫順序
select 欄位列表 from 表名 where 條件 group by 分組欄位名 having 條件 order by 排序欄位 排序 limit 起始索引 查詢記錄數;
程式執行順序
- from 表名 ->選擇表
- where 條件 ->篩選表
- group by 欄位 ->將表分組(相當於分成多個子表)
- having 條件 ->對已經分組後的表再一次進行條件篩選
- select 欄位 ->選擇要查詢的欄位
- order by 欄位 順序 ->選擇表的排序
- limit 起始索引 查詢記錄數- >對完成後的表進行分頁
DCL語法
管理用戶
查詢用戶
在mysql中所有的用戶都存在系統mysql資料庫中,故查詢用戶就查詢mysql的user表即可
Use mysql;進入
Select * from user;查詢用戶
創建用戶
Create user '用戶名'@'主機名' identified by '訪問密碼' ;
其中 主機名一般為一段ip地址,也可以寫localhost代表本機
%代表任意主機
修改訪問密碼
Alter user '用戶名'@'主機名' identified with mysql_native_password by '新密碼';
刪除用戶
Drop user '用戶名'@'主機名' ;
設置許可權
顯示用戶有哪些許可權
Show grants for '用戶名'@'主機名';
給予用戶許可權
Grant 許可權列表 on 資料庫.表 to '用戶名'@'主機名';
Grant all on 資料庫1.* to '用戶名'@'主機名'; #將資料庫1中所有表的許可權給用戶
撤銷用戶許可權
revoke 許可權列表 on 資料庫名.表名 from '用戶名'@'主機名';
多個許可權用逗號分割,*代表所有許可權
常見的許可權
許可權 | 說明 |
---|---|
ALL,ALL PRIVILEGES | 所有許可權 |
select | 查詢數據許可權 |
INSERT | 插入數據許可權 |
Update | 更新數據許可權 |
Delete | 刪除數據許可權 |
Alter | 修改表的許可權 |
Drop | 刪除,資料庫/視圖/表的許可權 |
Create | 創建資料庫/表的許可權 |