【MYSQL】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不能,別名是在內存中才有的

 

Order by子句

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

基本語法:

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/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:系統元數據(字段名等)字符集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章