1.Create 新增
語法:
insert into 表名 (列名)values (列)...
創建一個學生表用于演示:
create table if not exists student(
id bigint comment '編號',
name varchar(20) comment '姓名'
);
1.1直接增加
insert into student values (1,'張三');
不在into 與 表名間聲明列名
1.2聲明增加單列
insert into (id,name) values (1,'張三');
?1.3聲明增加多列
?
insert into (id,name) values (1,'張三'),(2,'李四');
2.Retrieve 檢索
語法:
SELECT[ DISTINCT ]select_expr [, select_expr ] ...[ FROM table_references ][ WHERE where_condition ][ GROUP BY { col_name | expr }, ...][ HAVING where_condition ][ ORDER BY { col_name | expr } [ ASC | DESC ], ... ][LIMIT {[ offset ,] row_count | row_count OFFSET offset }]
?功能較多,我們一個一個介紹
2.1select
先介紹普通查詢
2.1.1全列查詢
?
select * from 表名;
能打印出表中存儲信息
注意desc tables;是打印表的屬性?
2.2.2指定列查詢?
select id from 表名;
?
在指定列查詢時,可以對打印的數據進行微調,具體是:
對數據進行運算(即表達式)
對屬性起別名
?2.2.2.1對數據進行運算
select id+1 from student;
也可以把類型相同的屬性相加?:
select id+id from student;
2.2.2.2 對屬性起別名
select id+id as 表達式 from student;
?加上as 后跟別名(as也可以省略)
?
2.2.3結果去重查詢?
語法:
select distinct 列名/* from 表名;
有 重復:
?使用去重查詢后:
注意:只有全部屬性都相同才會去重?
2.2 where條件查詢
?語法:
select * from 表名 where 判斷條件;
2.2.1比較運算符
運算符 | 說明 |
>,? ? >=,? ? <,? ? <= | 使用與其他語言無異 |
= | 既可以賦值又可以判斷是否相等 但是不可以判斷null是否等于null |
<=> | 專門用于null=null? 返回值為1/0 |
!=, <> | 不相等 |
value BETWEEN a0 AND a1 | [a0, a1]? 如果在這個范圍中就返回1 NOT BETWEEN則取反 |
value IN (option, ...) | 如果value 在optoin列表中,則返回TRUE(1),NOT IN則取反 |
IS NULL | 是null返回1 |
IS NOT NULL | 不是null返回1 |
LIKE | 模糊匹配,% 表?任意多個(包括0個)字符; _ 表?任意?個字符 NOT LIKE則取反 |
2.2.2邏輯運算符
運算符 | 說明 |
AND | 多個條件必須都為 TRUE(1),結果才是 TRUE(1) |
OR | 任意?個條件為 TRUE(1), 結果為 TRUE(1) |
NOT | 條件為 TRUE(1),結果為 FALSE(0) |
?2.3order by排序
語法:
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC |
DESC], ... ;
-- ASC 為升序(從?到?)
-- DESC 為降序(從?到?)
-- 默認為 ASC
?
注意:
MYSQL中會自動排序,如果沒有order by返回的順序僅參考,不可信。
如果比較對象中有null,默認null是最小的值(比所有數都小,包括負數)
order by 中可以使用別名
如:
這是因為order by 是對select后的對象排序,在select中起的別名可以在order by 中識別
但是where不可以,因為where是先判斷再select?
2.4 分頁查詢
語法:
-- 起始下標為 0
-- 從 0 開始,篩選 num 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;
-- 從 start 開始,篩選 num 條結果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;
-- 從 start 開始,篩選 num 條結果,?第?種?法更明確,建議使?
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;
作用:可以搭配order by排序成對取出前幾個
3.Update修改
語法:
UPDATE [LOW_PRIORITY] [IGNORE] table_referenceSET assignment [, assignment] ...[WHERE where_condition][ORDER BY ...][LIMIT row_count]
例如:?
注意:
不加where條件時,會導致全表數據被列新,謹慎操作?
4.Detele刪除?
語法:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]?
比如:
注意:
執?Delete時不加條件會刪除整張表的數據,謹慎操作?
?5.截斷表
語法:
TRUNCATE [TABLE] 表名;
可以快速將整個表清空?
說明:
只能對整表操作,不能像 DELETE ?樣針對部分數據
不對數據操作所以?DELETE更快,TRUNCATE在刪除數據的時候,不經過真正的事物,所以?法回滾
會重置AUTO_INCREMENT 項
6. 插入查詢結果
語法:
INSERT INTO table_name [(column [, column ...])] SELECT ...;
例如: 將? 去重后? 的表的原表互換 并保留原表
create table student_new like student;
insert into student_new (name,id,math,english)select distinct name,id,math,english from student;rename table student to student_new, student_new to student;
?7.聚合函數
函數 | 說明 |
COUNT([DISTINCT] expr) | 返回查詢到的數據的 數量 |
SUM([DISTINCT] expr) | 返回查詢到的數據的 總和,不是數字沒有意義 |
AVG([DISTINCT] expr) | 返回查詢到的數據的 平均值,不是數字沒有意義 |
MAX([DISTINCT] expr) | 返回查詢到的數據的 最?值,不是數字沒有意義 |
MIN([DISTINCT] expr) | 返回查詢到的數據的 最?值,不是數字沒有意義 |
例子:
select count(*) from student;
select count(math) from student where math >50;
select sum(math) from student;
select avg(math) from student;
select min(math) from student where math>70;
select min(math),max(math) from student;
8.Group by 分組查詢
將有相同屬性的對象分組,便于集中統計計算與分析
語法:
SELECT {col_name | expr} ,... ,aggregate_function (aggregate_expr)FROM table_referencesGROUP BY {col_name | expr}, ... [HAVING where_condition]
?例如:
select role,ROUND(avg(salary),1) from cmp group by role;
select role,count(salary) from cmp where salary>1000.00 group by role;
-- 3 1 2 4
上面的數字是執行順序? ?group by也可以使用別名
但是正因為where比group by先執行,所以無法對分組后的數據進行判斷
MYSQL中引入了having關鍵字專門用于解決此問題
8.1having子句
例如:
select role,ROUND(avg(salary)) from cmp group by role having ROUND(avg(salary))>1000.00;
? Having ?于對分組結果的條件過濾? Where ?于對表中真實數據的條件過濾
9.內置函數?
9.1日期函數
函數 | 說明 |
CURDATE() | 返回當前?期,同義詞 CURRENT_DATE , CURRENT_DATE() |
CURTIME() | 返回當前時間,同義詞 CURRENT_TIME , CURRENT_TIME([fsp]) |
NOW() | 返回當前?期和時間,同義語 CURRENT_TIMESTAMP , CURRENT_TIMESTAMP |
DATE(data) | 提取date或datetime表達式的?期部分 |
ADDDATE(date,INTERVAL exprunit) | 向?期值添加時間值(間隔),同義詞 DATE_ADD() |
SUBDATE(date,INTERVAL exprunit) | 向?期值減去時間值(間隔),同義詞 DATE_SUB() |
DATEDIFF(expr1,expr2) | 兩個?期的差,以天為單位,expr1 - expr2 |
select curdate();
select curtime();
select now();
select date(now());
select adddate(curdate(),interval 31 day);
select subdate(curdate(),interval 1 month);
select datediff(curdate(),subdate(curdate(),interval 1 month));
9.2字符串處理函數
select name,char_length(name),length(name) from cmp;
select concat(name,'的工資為:',salary) as 工資 from cmp;
?
select concat_ws(',',name,ROUND(salary)) as 工資 from cmp;
?拼接后的字符串?逗號隔開
?
select lcase('ABC');
?
select ucase('abc');
9.3數學函數?
函數 | |
ABS(X) | 返回X的絕對值 |
CEIL(X) | 返回不?于X的最?整數值,同義詞是 CEILING(X) |
FLOOR(X) | 返回不?于X的最?整數值 |
CONV(N,from_base,to_base) | 不同進制之間的轉換 |
FORMAT(X,D) | 將數字X格式化為“#,###,###”的格式。##',四舍五?到?數點后D位,并以字符串形式返回 |
RAND([N]) | 返回?個隨機浮點值,取值范圍 [0.0, 1.0) |
ROUND(X), ROUND(X,D) | 將參數X舍?到?數點后D位 |
CRC32(expr) | 計算指定字符串的循環冗余校驗值并返回?個32位?符號整數 |
例如:
select ROUND(RAND(),6);
?
select CRC32('MYSQL');