MySql 語句大全 - 基礎操作
目錄
1) 修改表名:將表 tb_one 改名為 tb_two ;
1)交叉連線(cross join):(不使用 ,毫無意義)
對資料庫操作
1. 顯示資料庫
show databases ;
2. 使用資料庫
use 資料庫名稱 ;
3. 建立資料庫
create database 資料庫名稱 ;
# utf-8
create database 資料庫名稱 default charset utf8 collate utf8_general_ci;
# gbk
create database 資料庫名稱 default character set gbk collate gbk_chinese_ci;
4. 刪除資料庫
drop database Database_Name
對資料表操作
1. 建立新表:
# 使用舊錶建立新表
create table 新表 like 舊錶 ;
create table 新表 as select UserName1,UserName2… from 舊錶 definition only
# 建立新表 1 (標準)
create table Table_Name (
id int(11) auto_increment primary key , //自增 主鍵
name varchar(255) default null,
…
) engine=InnoDB default charset = utf-8 ;
# 建立新表 2 (新增外來鍵約束)
create table Table_Name (
id int(11) auto_increment primary key , //自增 主鍵
name varchar(255) default null,
… ,
constraint 外來鍵索引【如: fk_two_one】foreign key (該表字段) references 父表(欄位)
//foreign key (該表字段) references 父表(欄位)
) ;
2. 刪除表:
drop table 表名 ;
3. 清空表:
delete from 表名 ;
truncate table 表名 ;
4. 查看錶結構:
desc Table_Name; //desc = describe
5. 修改表:
1) 修改表名:將表 tb_one 改名為 tb_two ;
alter table tb_one Rename tb_two ;
2) 修改欄位型別:
alter table <表名> modify <欄位名> <資料型別> ;
3) 修改欄位名:
alter table <表名> change <舊欄位名> <新欄位名> <新資料型別> ;
4) 增加列
alter table 表名 add column 新欄位 資料型別
5) 增加/刪除主鍵
alter table 表名 add/drop primary key(欄位)
6) 增加/刪除外來鍵
##例:alter table tb_two add constraint fk_two_one foreign key (oneid) references tb_one(id) ;
alter table 子表 add constraint 外來鍵索引[如FK_子表_父表] foreign key (子表外來鍵欄位) references 父表(欄位) ; //增加外來鍵約束
alter table 子表 drop foreign key 外來鍵索引 ; //刪除外來鍵約束
對錶資料操作(CRUD)
1. 查詢:
1) 簡單查詢:
select * from 表名 ; # 查詢所有欄位
select id , name, … from 表名 ;
2) 條件查詢:in
select * from 表名 where 欄位2=值 一個條件查詢
select * from 表名where 欄位1='值 ' and 欄位2=值 ;多條件 並關係 查詢
select * from 表名where 欄位1='值 ' or 欄位2=值 ;多條件 或關係 查詢
select * from 表名where 欄位1>=50 and 欄位<=60; 範圍查詢
select * from 表名where 欄位between 50 and 60 ;範圍查詢
同個欄位查詢多個值:
select * from 表名where 欄位 in (值1,值2,值3,...) ;
3) 模糊查詢:
select * from 表名where Name like '%型' //%萬用字元代表任意多個字元
select * from 表名 where Name like '%奧迪%'
select * from 表名where Name like '_馬%' // _萬用字元代表任意一個字元
4) 排序:
select * from 表名order by 欄位asc ; // 按照價格升序排列
select * from 表名order by 欄位desc ; // 按照價格降序排列
select * from 表名order by 欄位1,欄位2 ; //按照兩列進行排序,前面的為主要的
5) 統計函式:
select count(*) from 表名 ; // 查詢表中有多少條資料
select max(Price) from 表名 ; //取價格的最大值
select min(Price) from 表名 ; //取價格的最小值
select sum(Price) from 表名 ; // 取價格的總和
select avg(Price) from 表名 ; //取價格的平均值
注: 使用函式,若帶條件查詢則不能使用where而應該使用HAVING
select sum(price) from table_user Having sum(price)>20 or id>2;
6) 分組查詢:
select 欄位from Car group by 欄位having count(*)>2 ; //查詢所有系列中數量大於2的
7) 分頁查詢:
select * from 表名 limit 0,5 ; // 從第條資料開始讀取5條資料
8) 去重查詢:
select distinct 欄位from 表名;
2. 高階查詢:
1)交叉連線(cross join):(不使用 ,毫無意義)
## 左表迴圈每條記錄 直到右表所有記錄 ,沒有匹配條件:
select * from 左表 cross join 右表 ; // select * from 左表 , 右表 ;
2)內連線(join .. on ):
## 左表每條記錄與右表的所有記錄進行匹配, 匹配條件相同則保留:
select * from 左表 join 右表 on 條件 ;
select m.id,m.name,…, w.id,w.name,… from table_Left m join table_Right w on m.id = w.id ;
注:USING欄位的使用,簡寫效果; 即兩個表中的欄位都為id ,則可以使用Using欄位取代on欄位。( USING(id) == m.id=w.id )
... join table_Right USING(id);
3)外連線(left/right join):
## 以某張表為主(所有記錄保留),與另一張表進行連線,匹配條件保留,否則另一張表字段置為NULL;(即無論是否符合On語句後面的條件,左/右主表中的資料都會被查詢出來,另一張表未匹配的欄位置為null)
## left join 左(外)連線 :以左表為主
## right join 右(外)連線 :以右表為主
select *from One_Table left join Two_Table on 條件 ;
select m.id,m.name,…, w.id,w.name,… from table_Left m left/right join table_Right w on m.id = w.id ;
4)聯合查詢:
## 聯合查詢結果不增加欄位(類似將表2插入資料到表1中,但與資料型別無關);
## 聯合查詢意義:
1. 查詢同一張表,但是需求不同: 如查詢學生資訊, 男生身高升序, 女生身高降序.
2. 多表查詢: 多張表的結構是完全一樣的,儲存的資料(結構)也是一樣的.
a) Union/Union All
## 將多條select語句使用Union /Union All 拼接 ,但語句欄位得相同 ;
## All: 保留所有資料 ; Distinct:去重(預設);
如:select 欄位1,欄位2,… from 表1 Union /Union All select欄位1,欄位2,… from 表1/2
b) order by (limit)
## 使用時需對 select語句使用括號,且 必須使用limit:限定的最大數量;
(select … from 表1 where 條件 order by 欄位 limit 99999) union (select … from 表2 where 條件 order by 欄位 desc limit 99999) // 正逆序排列
5)子查詢:
##子查詢有兩種分類方式: 按位置分類;和按結果分類:
- 按位置分類: 子查詢(select語句)在外部查詢(select語句)中出現的位置:
- From子查詢: 子查詢跟在from之後
- Where子查詢: 子查詢出現where條件中
- Exists子查詢: 子查詢出現在exists裡面
- 按結果分類: 根據子查詢得到的資料進行分類(理論上講任何一個查詢得到的結果都可以理解為二維表):
- 標量子查詢: 子查詢得到的結果是一行一列
- 列子查詢: 子查詢得到的結果是一列多行
- 行子查詢: 子查詢得到的結果是多列一行(多行多列) (1,2,3出現的位置都是在where之後)
- 表子查詢: 子查詢得到的結果是多行多列(出現的位置是在from之後)
例如:標量子查詢
select 欄位1 from table 1 where 條件(id)= (select 欄位1(外來鍵) from table_2 where 條件2 = 值)
3. 修改:
update 表名 set 欄位 = 新值 where 欄位 = 值 ;
4. 刪除:
delete from 表名 where 欄位 = 值 ;
附錄
模糊查詢:Concat函式
用法: 字串拼接 ;CONCAT(str1,str2,…)
當Concat中某個值為NULL時,返回NULL;
m.table_Name like concat(concat('%',#{tableName}),'%')----------------------就是拼接成% 變數值%
select * from m where m.name like concat(concat('%','#tableName'),'%');
CONCAT_WS()函式
用法:concat_ws(separator,str,str2,...); 字面意思:concat with separator,合併和分隔符
即:第一個引數是其它引數的分隔符。分隔符的位置放在要連線的兩個字串之間。分隔符可以是一個字串,也可以是其它引數。如果分隔符為 NULL,則結果為 NULL。函式會忽略任何分隔符引數後的 NULL 值。
mysql> SELECT CONCAT_WS(’,',’First name’,'Second name’,'Last Name’);
-> ‘First name,Second name,Last Name’
Group_concat函式
型別轉換:Cast()函式
用法:Cast(欄位名 as 轉換的型別)。其中型別為:
CHAR[(N)] 字元型
DATE 日期型
DATETIME 日期和時間型
DECIMAL float型
SIGNED int
TIME 時間型