SQL基本操作
庫操作(DDL)
對數據庫的增刪改查
基本語法
1. 創建數據庫
Create database 數據庫名[庫選項];
庫選項:用來約束數據庫,分爲兩個選項
字符集設定:charset/character set 具體字符集.常用:GBK, UTF8
校對集設定:collate 具體校對集(數據比較的規則)(不用設置,與你設置的字符集自動匹配)
2. 查看數據庫
查看所有數據庫:show databases;
查看指定部分的數據庫:模糊查詢:show databases like ‘pattern’;
Pattern:匹配模式
%:匹配所有字符
_:匹配單個字符
如果數據庫名中含‘_’,那麼只用匹配時需要使用\_對下劃線進行轉義
查看數據庫的創建語句:Show create database 數據庫名字;
3. 更新數據庫
數據庫名字不可以修改
數據庫的修改僅限庫選項:字符集和校對集(校對集依賴字符集)
Alter database 數據庫名字 charset/character set [=] 字符集;
4. 刪除數據庫
Drop database 數據庫名;
注意:刪除不可逆,謹慎操作!
表操作(DDL)
1. 新增表
普通方式:
create table [if not exists] 表名(
字段1 數據類型 [字段屬性|約束] [索引] [註釋],
……
字段n 數據類型 [字段屬性|約束] [索引] [註釋]
)[表類型] [字符集] [註釋];
高級方式:
Create table 表名 like 數據庫.表名;
-從已有表中複製,只複製結構,不復制數據
2.查看錶
查看全部表:show tables;
模糊查找:show tables like ‘pattern’;
查看錶創建語句:show create table 表名:
查看錶結構:desc/describe/show columns from 表名;
3.修改表
3.1 修改表本身
修改表名
A: rename table 舊錶名to 新表名;
B: alter table 舊錶名rename [to] 新表名;
修改表選項:
Alter table 表名錶選項 [=] 值;
3.2 修改字段
新增字段:alter table 表名 add [column] 字段名 數據類型 [列屬性][位置];
位置:字段名可以存放表中的任意位置
First:第一個位置
After:在哪個字段之後:after 字段名;
修改字段:修改通常是修改屬性或者數據類型
Alter table 表名 modify 字段名 數據類型 [類型][位置];
重命名字段:alter table 表名 change 舊字段 新字段名 數據類型[屬性][位置];
刪除字段:alter table 表名 drop 字段名;
4. 刪除表
Drop table 表名1,表名2,…,表名n;
數據操作(DML)
1. 新增數據
全部字段插入數據
Insert into 表名values (值列表);
Insert into 表名 values (值列表1),(值列表2),…(值列表n);
CREATE TABLE 新表(SELECT 字段1,字段2....FROM 原表);
如果新表已存在,不能重複創建
非數值類型的值建議使用單引號包裹
部分字段插入數據
Insert into 表名(字段列表) values (),(),();
主鍵衝突:當主鍵存在衝突的時候(duplicate key),可以選擇性的進行處理:更新和替換
Insert into 表名(字段列表) values (值列表) on duplicate key update 字段=新值;
Replace into 表名[(字段列表)] values (值列表);
蠕蟲複製
定義:從已有的數據中去獲取數據,然後將數據又進行新增操作:數據成倍的增加
語法:
Insert into 表名 select (字段列表) from 表名;
意義:
從已有表拷貝數據到新表
可以迅速的讓表中的數據膨脹到一定的數據量級,測試表的壓力及效率
2. 查看數據(DQL)
查看所有數據
基本語法
Select */字段列表 from 表名 [where 條件];
完整語法
select[select 選項] 字段列表[字段別名]/* from 數據源 [where條件子句] [group by子句] [having 子句] [order by子句][limit 子句];
select選項:select 對查出來的結果的處理方式
all:默認的,保留所有的結果
distinct:去重,將查出結果的重複項去除(所有字段都相同)
字段別名:
當數據進行查詢出來的時候,有時候名字不一定就滿足需求(多表查詢的時候,會有同名字段),需要對字段名進行重命名:別名
語法:字段名 [as] 別名;
數據源:
數據的來源,關係型數據庫的來源都是數據表:本質上只要保證數據類似二維表最終都可以作爲數據源
數據源的分類:多表數據源,查詢語句
單表數據源:select * from 表名;
多表數據源:select * from 表名1,表名2...;
從一張表中取出一條記錄,去另一張表總匹配所有記錄,而且全部保留:(記錄數和字段數),將這種結果稱爲:笛卡爾積(交叉連接),其並沒有什麼用處,所以避免使用
查詢語句(子查詢):select * from (select語句) as 別名;
因爲數據應該是一張表,所以給別名
where子句:
用來判斷數據,篩選數據(在磁盤讀取時就進行篩選了)
where子句的返回結果:0或者1,0代表false,1代表true
判斷條件:
比較運算符:>,<,>=,<=,!=,<>,=,like ,between and ,in/not in ,is null/is not null
邏輯運算符:&&(and),||(or),!(not)
where原理:where是唯一一個直接從磁盤獲取數據的時候就開始判斷的條件:從磁盤取出一條記錄,開始進行where判斷,判斷的結果如果處理,就保存到內存,如果失敗就直接放棄
group by:分組
根據某個字段進行分組(相同的放一組,不同的分到不同的組)
基本語法:group by字段名 [asc||desc];
asc:字段升序排列;desc:字段降序排列
分組的意義是爲了統計數據(按組統計:按分組字段進行數據統計)
SQL提供了一系列統計函數
Count():統計分組後的記錄數,每一組有多少條記錄
括號裏面如果放字段的話(null不被統計)
Max():統計每組中的最大值
Min():統計最小值
Avg():統計平均值
Sum():統計和
多字段分組排序group by 字段1,字段2…;
對分組的結果的某個字段進行字符串鏈接的函數:group_concat(字段)
回溯統計:with rollup:任何一個分組後都會有一個小組,最後根據當前分組的字段向上級分組進行彙報統計,這就是回溯統計,回溯統計的時候會將分組字段置空
Having子句
與where子句一樣,進行條件判斷
區別:where是針對磁盤數據進行判斷:進入到內存之後,會進行分組操作,分組結果需要使用having來處理
Having能做where能做的幾乎所有事情,但是where卻不能做having能做的很多事情
- 分組統計的結果或者說統計函數都只有having能夠使用
- Having能夠使用字段別名,where不能,別名是在內存中才有的
Order by子句
排序,根據某個字段進行升序或者降序排序,依賴校對集
基本語法:
Order by 字段名 [asc|desc]; -- asc:默認,升序;desc:降序
多字段排序
Limit子句
2種使用方式
- 只用來限定長度(數據量):limit 數據量;
- 限制起始位置,限制數據量:limit 起始位置,數據量;
連接查詢
定義:將多張表進行記錄的連接(按照某個制定的條件進行數據拼接);
最終結果是:記錄數有可能變化,字段數一定會增加
連接查詢的意義:在用戶查看數據的時候,需要顯示的數據來自多張表
連接查詢:join,使用方式:左表 join 右表
左表:在join關鍵字左邊的表
右表:在join關鍵字右表的表
連接查詢分類
交叉連接
Cross join,從一張表中循環取出每條記錄,每條記錄都去另外一張表進行匹配,匹配一定保留,而連接本身字段會增加,最終形成的結果叫:笛卡爾積
基本語法:左表 cross join 右表; ===========from 左表,右表;
笛卡爾積沒有意義,應該儘量避免
內連接
[inner] join:從左表中取出每一條記錄,去右表中與所有的記錄進行匹配,匹配必須是某個添加在左表中與右表中相同最終纔會保留結果,否則不保留
基本語法:
左表 [inner] join 右表 on 左表.字段=右表.字段;
On表示連接條件:條件字段就是代表相同的業務含義
內連接還可以使用where代替on關鍵字(where沒有on效率高)
注意:由於不同表的字段名可能相同,所以可以使用別名
字段別名以及表別名的使用:在查詢數據的時候,不同表有同名字段,這個時候需要加上表名才能區分,而表名太長,通常可以使用別名
語法: 字段名/表名 [as] 別名
外連接
Outer join,以某張表爲主,取出裏面的所有記錄,然後每條與另外一張表進行連接:不管能不能匹配上條件,最終都會保留
能匹配,正確保留,不能匹配,其他表的字段都置空NULL
外連接的分類,以哪張表爲主,有主表
Left join:左外連接(左連接),以左表爲主表
Right join:右外連接(右連接),以右表爲主表
基本語法:左表 left/right join 右表 on 左表.字段 = 右表.字段;
自然連接
Natural join,就是自動匹配連接條件:系統以字段名作爲匹配條件(同字段名就作爲條件,如果多個字段同名,那麼就都作爲匹配條件)
語法:
自然內連接:左表 natural join 右表;
自然外連接: 左表 natural left/right join 右表;
聯合查詢
將多次查詢(多條select語句),在記錄上進行拼接(字段不會增加)
基本語法:
多條select語句構成,每一條select語句獲取的字段數必須嚴格一致(但是字段類型無關)
Select語句:
Select語句1 union [union 選項] select 語句2 union ….union 語句n;
Union 選項:與select選項一樣有兩個
All:保留所有(不管重複)
Distinct(默認使用):去重(整個重複),
聯合查詢的意義
- 查詢同一張表,但是需求不同,如查詢學生信息,男生身高升序,女生身高降序
- 多表查詢:多張表的結構是完全一樣的,保存的數據(結構)也是一樣的
Order by 的使用
- 聯合查詢中,order by不能直接使用,需要對查詢語句使用括號
- 搭配limit 使用,limit使用限定的最大數即可
子查詢
分類:
按位置分類:子查詢在外部查詢中出現的位置
From子查詢:子查詢跟在from之後
Where子查詢:子查詢跟在where之後
詢:子查詢出現在exists裏面
按結果分:根據子查詢得到的數據進行分類
標量子查詢:子查詢得到的結果是一行一列
列子查詢:子查詢得到的結果是一列多行
行子查詢:子查詢得到的結果是多列一行(多行多列)
Select * from 表名 where (字段列表)=(select語句);
上面幾個出現的位置都是在where之後
表子查詢:子查詢得到的結果是多行多列(出現的位置是在from之後)
Exists/not exists查詢
此查詢用於判斷某些條件是否滿足(跨表),exists是接在where之後,exists返回結果只有0和1
語法:select … from 表名 where exists(子查詢);
1. 更新數據
Update 表名 set 字段 = 值 [where 條件]; -- 建議都有where:不然就是更新全部
2. 刪除數據
刪除是不可逆的,謹慎操作
Delete from 表名 [where 條件]
字符集問題
顯示當前所有字符集:show character set;
查找當前使用的字符集:show variables like 'character_set%';
設置字符集:set names gbk;
修改數據庫字符集 :alter database 數據庫名 default character set 'utf8';
– character_set_server:默認的內部操作字符集
– character_set_client:客戶端來源數據使用的字符集
– character_set_connection:連接層字符集
– character_set_results:查詢結果字符集
– character_set_database:當前選中數據庫的默認字符集
– character_set_system:系統元數據(字段名等)字符集