1. 程式人生 > 資料庫 >day89---MySQL階段性整理

day89---MySQL階段性整理

day89---MySQL階段性整理

DQL

基礎查詢

語法:

SELECT 要查詢的東西
【FROM 表名】;

類似於Java中 :System.out.println(要列印的東西);

特點:

  1. 通過select查詢完的結果 ,是一個虛擬的表格,不是真實存在

  2. 要查詢的東西 可以是常量值、可以是表示式、可以是欄位、可以是函式

條件查詢

​ 條件查詢:根據條件過濾原始表的資料,查詢到想要的資料

語法:

select
​ 要查詢的欄位|表示式|常量值|函式
​ from
​ 表
​ where
​ 條件 ;

分類:

一、條件表示式

​ 示例:salary>10000


​ 條件運算子:

< >= <= = != <>

二、邏輯表示式

示例:salary>10000 && salary<20000

邏輯運算子:

​ and(&&):兩個條件如果同時成立,結果為true,否則為false
​ or(||):兩個條件只要有一個成立,結果為true,否則為false
​ not(!):如果條件成立,則not後為false,否則為true

三、模糊查詢

示例:last_name like 'a%'

排序查詢

語法:

select 要查詢的東西 from 表 where 條件
order by 排序的欄位|表示式|函式|別名 【asc|desc】

分組函式

sum 求和
​ max 最大值
​ min 最小值
​ avg 平均值
​ count 計數

特點:

​ 1、以上五個分組函式都忽略null值,除了count(*)
​ 2、sum和avg一般用於處理數值型
​ max、min、count可以處理任何資料型別
​ 3、都可以搭配distinct使用,用於統計去重後的結果
​ 4、count的引數可以支援:
​ 欄位、*、常量值,一般放1

​ 建議使用 count(*)

分組查詢

語法:

select 查詢的欄位,分組函式
from 表
group by 分組的欄位

特點:

​ 1、可以按單個欄位分組

​ 2、和分組函式一同查詢的欄位最好是分組後的欄位
​ 3、分組篩選

針對的表 位置 關鍵字
分組前篩選: 原始表 group by的前面 where
分組後篩選: 分組後的結果集 group by的後面 having

​ 4、可以按多個欄位分組,欄位之間用逗號隔開
​ 5、可以支援排序
​ 6、having後可以支援別名

連線查詢

笛卡爾乘積:如果連線條件省略或無效則會出現
解決辦法:新增上連線條件

等值連線——非等值連線

  1. 等值連線的結果 = 多個表的交集
  2. n表連線,至少需要n-1個連線條件
  3. 多個表不分主次,沒有順序要求
  4. 一般為表起別名,提高閱讀性和效能

通過join關鍵字實現連線

含義:1999年推出的sql語法

支援:
等值連線、非等值連線 (內連線)
外連線
交叉連線

語法:

select 欄位,...
from 表1
【inner|left outer|right outer|cross】join 表2 on 連線條件
【inner|left outer|right outer|cross】join 表3 on 連線條件
【where 篩選條件】
【group by 分組欄位】
【having 分組後的篩選條件】
【order by 排序的欄位或表示式】

好處:語句上,連線條件和篩選條件實現了分離,簡潔明瞭!

三、自連線

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.manager_id=m.employee_id;

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;

子查詢

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被巢狀的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢

特點:

1、子查詢都放在小括號內
2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
結果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
a、子查詢的結果為一組值
b、子查詢的結果為空

② 多行子查詢
結果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 屬於子查詢結果中的任意一個就行
any和all往往可以用其他查詢代替

分頁查詢

應用場景:

實際的web專案中需要根據使用者的需求提交對應的分頁查詢的sql語句

語法:

select 欄位|表示式,...
from 表
【where 條件】
【group by 分組欄位】
【having 條件】
【order by 排序的欄位】
limit 【起始的條目索引,】條目數;

特點:

1.起始條目索引從0開始

2.limit子句放在查詢語句的最後

3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page

進階9:聯合查詢

union 聯合、合併

語法:

select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
select 欄位|常量|表示式|函式 【from 表】 【where 條件】 union 【all】
.....
select 欄位|常量|表示式|函式 【from 表】 【where 條件】

特點:

1、多條查詢語句的查詢的列數必須是一致的
2、多條查詢語句的查詢的列的型別幾乎相同
3、union代表去重,union all代表不去重

DML

插入

語法:

insert into 表名(欄位名,...)
values(值1,...);

特點:

1、欄位型別和值型別一致或相容,而且一一對應
2、可以為空的欄位,可以不用插入值,或用null填充
3、不可以為空的欄位,必須插入值
4、欄位個數和值的個數必須一致
5、欄位可以省略,但預設所有欄位,並且順序和表中的儲存順序一致

修改

修改單表語法:

update 表名 set 欄位=新值,欄位=新值
【where 條件】

修改多表語法:

update 表1 別名1,表2 別名2
set 欄位=新值,欄位=新值
where 連線條件
and 篩選條件

刪除

方式1:delete語句

單表的刪除: ★
delete from 表名 【where 篩選條件】

多表的刪除:
``delete 別名1,別名2 from 表1 別名1,表2 別名2 where 連線條件 and 篩選條件;`

方式2:truncate語句

truncate table 表名

兩種方式的區別【面試題】

  1. truncate不能加where條件,而delete可以加where條件
  2. truncate的效率高一丟丟
  3. truncate 刪除帶自增長的列的表後,如果再插入資料,資料從1開始
    delete 刪除帶自增長列的表後,如果再插入資料,資料從上一次的斷點處開始
  4. truncate刪除不能回滾,delete刪除可以回滾

DDL語句

庫和表的管理

庫的管理:

一、建立庫
create database 庫名
二、刪除庫
drop database 庫名

表的管理:

  1. 建立表
  • CREATE TABLE IF NOT EXISTS stuinfo(
    stuId INT,
    stuName VARCHAR(20),
    gender CHAR,
    bornDate DATETIME
    ​);
  • DESC studentinfo;
  1. 修改表 alter
    • 語法:
      ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 欄位名 【欄位型別】;

① 修改欄位名
​ ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;

② 修改表名
​ ALTER TABLE stuinfo RENAME [TO] studentinfo;

③ 修改欄位型別和列級約束
​ ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;

​④ 新增欄位
​ ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;

⑤ 刪除欄位
​ ALTER TABLE studentinfo DROP COLUMN email;

  1. 刪除表
    • DROP TABLE [IF EXISTS] studentinfo;

桃園三屁吃,簡稱桃園寶寶:

紙上得來終覺淺,絕知此事要躬行。---冬夜讀書示子聿【朝代】宋

  • 程式碼不敲是不行滴,成天總結這個總結那個,手上功夫都廢了。
  • 2020年11月20日 今天是週五,大家都是成年人了,都懂???
  • 現在的我對於四個小時開發一個小外掛還沒有什麼概念,很厲害嗎?
  • MySQL快要結束了,感覺自己成長得很快,但是我感覺虛的不行,知識掌握的不牢固,真就是一聽就會,一敲全廢。也許到了後面綜合運用起來會好一些吧。回到幾天前的話題,現在的我們還需要造輪子嗎?
    1. 最近看到,deepin,又有了兩款軟體。一款是瀏覽器,一款是下載器。你覺得現在再寫兩款這樣的軟體有什麼意義嗎?
    2. 你看,瀏覽器Windows 自帶的edge瀏覽器換成了谷歌的核心,還有chrome 火狐 幾乎沒有生存空間了呀。用deepin的開發者居多,難道是想讓更多的開發者用這個嗎
    3. 還一個下載器,國內迅雷一家獨大。下載支援HTTP協議的都可以用瀏覽器下載,之外的BT 什麼的都有專門的軟體,還有各大網盤的離線下載,具體的我不懂,難道真的還有什麼地方可以挖掘的嗎(會不是多執行緒這一塊,猜的doge)