1. 程式人生 > >【SQL】SQL基本操作

【SQL】SQL基本操作

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能做的很多事情

  1. 分組統計的結果或者說統計函式都只有having能夠使用
  2. Having能夠使用欄位別名,where不能,別名是在記憶體中才有的

Orderby子句

排序,根據某個欄位進行升序或者降序排序,依賴校對集

基本語法:

Order by 欄位名 [asc|desc]; -- asc:預設,升序;desc:降序

多欄位排序

Limit子句

2種使用方式

  1. 只用來限定長度(資料量):limit 資料量;
  2. 限制起始位置,限制資料量: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(預設使用):去重(整個重複),

聯合查詢的意義

  1. 查詢同一張表,但是需求不同,如查詢學生資訊,男生身高升序,女生身高降序
  2. 多表查詢:多張表的結構是完全一樣的,儲存的資料(結構)也是一樣的

Order by 的使用

  1. 聯合查詢中,order by不能直接使用,需要對查詢語句使用括號
  2. 搭配limit 使用,limit使用限定的最大數即可

子查詢

分類:

按位置分類:子查詢在外部查詢中出現的位置

From子查詢:子查詢跟在from之後

Where子查詢:子查詢跟在where之後

詢:子查詢出現在exists裡面

按結果分:根據子查詢得到的資料進行分類

標量子查詢:子查詢得到的結果是一行一列

列子查詢:子查詢得到的結果是一列多行

行子查詢:子查詢得到的結果是多列一行(多行多列)

Select * from 表名 where (欄位列表)=(select語句);

上面幾個出現的位置都是在where之後

表子查詢:子查詢得到的結果是多行多列(出現的位置是在from之後)

Exists/notexists查詢

此查詢用於判斷某些條件是否滿足(跨表),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:系統元資料(欄位名等)字符集