主頁 > 資料庫 > 大廠面試預備篇——《兩萬MySql基礎總結》??建議收藏

大廠面試預備篇——《兩萬MySql基礎總結》??建議收藏

2021-09-06 12:15:58 資料庫

?? 一條獨家專欄

?? 搞技術,進大廠,聊人生

📚《大廠面試突擊》——面試10多家中大廠的萬字總結

📚《技術專家修煉》——高薪必備,企業真實場景

📚《leetcode 300題》——每天一道演算法題,進大廠必備

📚《糊涂演算法》——資料結構+演算法全面講解

📚《從實戰學python》——python的各種應用

📚《程式人生》——聽一條聊職場,聊人生

👉更多資料點這里

天下難事,必作于易;天下大事,必作于細, —— 老子

前言

哈嘍,大家好,我是一條,

前幾天有個粉絲來找我,發生了這樣一段有趣的對話:

一條哥 ,請教個問題,我昨天要女神微信被拒絕了怎么辦?

我不是教你搞技術嗎? 你小子搞物件去了,leetcode題刷了嗎?

要不到微信刷不進去題呀,幫幫忙吧

淡定,急什么,我和你說,要先找到女神的需求,用科技賦能愛情,才能加微信,約吃飯,談戀愛全鏈路打通,

太高深了,聽不懂,你就告訴我怎么做吧

這些互聯網黑話等你畢業就懂了,你現在和我說說女神最近有什么煩惱嗎

女神怎么可能會有煩惱,要啥有啥

給我好好想,你得動腦子呀

哎,還真有一個,她最近資料庫考試考的不太好,不怎么開心

這樣,那就好辦了,我這有一份《mysql萬字秘籍》,你拿回去好好研讀,保你下次班級第一,到時借著發學習資料的名義不就加了微信,然后再約著上自習,完事吃個飯,這就叫全鏈路打通,懂了嗎?

妙啊,秘籍呢,快給我吧

看你那猴急的樣,給我一鍵三連,隨后發你

沒問題,謝謝一條哥!


下面就是2萬字秘籍,免費送給大家,老規矩——一鍵三連

文章目錄

    • 前言
    • 資料庫
      • 選擇資料庫
      • 顯示可用資料庫
      • 顯示可用表
      • 獲取表的一個列
    • 資料型別
      • 數值型別
      • 日期型別
      • 字串型別
      • 創建表
      • 插入值
      • 查看表
      • 洗掉表
      • 復制表
    • 查找資料
      • 查找列
      • 查找多個列
      • 查找所有列
      • 查找不同的行
      • 限定查找
    • 排序查找
      • 排序
      • 降序
    • 執行順序
    • 選擇查詢
      • WHERE子句運算子
      • AND & OR
      • IN指定條件范圍
      • NOT & NOT IN
    • 模糊查詢
      • LIKE子句+通配符 %
    • 正則運算式
      • 基本字符匹配
      • OR的匹配
      • 匹配幾個字符之一
      • 匹配范圍
      • 匹配特殊字符
      • 空白元字符
      • 重復元字符
      • 定位元字符
    • 文本數值時間計算處理
      • Concat() 拼接
      • 使用別名
      • 文本字串處理
      • 洗掉右邊空格
      • **Upper()轉為大寫,Lower()轉為小寫**
      • 日期和時間處理函式
      • 查找一個特定日期的訂單
      • 查找特定的時間段
      • 算數計算
      • 數值處理函式
    • 資料處理
      • AVG() 平均值
      • COUNT() 計數
      • 最值
      • SUM() 求和
      • SELECT 可以包含多個聚集函式
    • 分組
      • 創建分組
      • 過濾分組,
      • 語法順序
    • 子查詢
      • 利用子查詢過濾
    • 聯結表
      • 創建聯結 JOIN
      • 聯結多個表
      • 自聯結
      • 自然聯結
      • 外部聯結
      • 使用帶聚集函式的聯結
    • 更新資料
      • 更新查詢Update
      • 更改表結構
      • 更新表名
    • Alter選擇
      • 洗掉、添加列或對其重新定位
      • 更新列名和資料型別
      • ALTER TABLE 對 Null 及默認值屬性的作用
      • 改變表型別
      • 對表進行重命名
    • Index索引
      • 簡單而唯一的索引
      • 添加與洗掉 INDEX 的ALTER 命令
      • 利用 ALTER 命令來添加與洗掉主鍵
    • 序列
      • 使用 **AUTO_INCREMENT 列**
      • 對已有序列進行重新編號
      • 以特定值作為序列初始值
    • 重復處理
      • 防止表中出現重復記錄
      • 確認重復記錄,并計算重復記錄數
      • 從查詢結果中消除重復記錄
      • 使用表替換去除重復記錄

?? MySql不區分大小寫,但是很多人愿意對重要陳述句用大寫,用表名等用小寫,便于閱讀

資料庫

選擇資料庫

USE name;

顯示可用資料庫

SHOW DATABASES;

顯示可用表

SHOW TABLES;

獲取表的一個列

SHOW COLUMNS FROM yitiao_coding;

資料型別

數值型別

  • 整數型別:tinyint smallint mediumint int bigint
  • 浮點型別:float double
  • 定點小數型別:decimal

日期型別

year time date datetime timestamp

字串型別

  • 文本字串:char varchar tinytext text mediumtext longtext enum set
  • 二進制字串:bit binary tinyblob blog mediumblob longblob

創建表

CREATE TABLE SalesSummary (

yitiaouct_name VARCHAR(50) NOT NULL ,

total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 ,

avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 ,

total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 );

# 通常設定:
ENGINE=InnoDB default CHARSET=utf8;

插入值

INSERT INTO SalesSummary

(yitiaouct_name, total_sales, avg_unit_price, total_units_sold)

VALUES ('cucumber', 100.25, 90, 2);

查看表

利用 SHOW TABLES 命令顯示表時,臨時表不會出現在結果串列中,如果退出 MySQL 會話,就會執行 SELECT 命令,那么資料庫中將沒有任何資料,甚至臨時表也不存在了,

SELECT * FROM yitiao_coding;

洗掉表

默認情況下,當與資料庫的連接終止時,臨時表就不再存在,不過如果想在資料庫處于連接時就洗掉它們,可以用 DROP TABLE 命令來洗掉,

DROP TABLE SalesSummary;

# 洗掉程度可從強到弱如下排列:

drop table tb;

# drop 是直接將表格洗掉,無法找回,例如洗掉 user 表:

drop table user;

truncate (table) tb;

# truncate 是洗掉表中所有資料,但不能與where一起使用;

delete from tb (where);

# delete 也是洗掉表中資料,但可以與where連用,洗掉特定行;

# 洗掉表中所有資料

delete from user;

# 洗掉指定行

delete from user where username ='Tom';

復制表

可以采用如下步驟來處理這種情況,

使用 SHOW CREATE TABLE 或 CREATE TABLE 陳述句指定源表的結構、索引以及所有的內容,

調整陳述句,將表名改為克隆表的名稱,執行陳述句,這樣就對表進行了克隆,另外,如果想要克隆表的全部內容,也可以使用 INSERT INTO … SELECT 陳述句,

  • 步驟1:獲取表的完整結構

  • 步驟2:重新命名該表,創建另一個表

  • 步驟3:執行完步驟2后,就在資料庫中創建了一個克隆表,如果想從舊表中復制資料,可以使用 INSERT INTO… SELECT 陳述句,

查找資料

查找列

# 從 yitiuao_coding 表中獲取 yitiao 這一列
SELECT yitiuaocoding FROM yitiuao_coding;

查找多個列

SELECT yitiao_coding, yitiao_it, yitiao_name FROM yitiao;

查找所有列

SELECT * FROM yitiao;

查找不同的行

# 重復的行只顯示一次
SELECT DISTINCT yitiao_id FROM yitiao;

限定查找

注意,行0開始數,查找5行是:0,1,2,3,4行,第6行同理從行0開始數

# 只查找5行

SELECT yitiao_id

FROM yitiao

LIMIT 5;

# 查找第6行開始的5行

SELECT yitiao_id

FROM yitiao

LIMIT 6, 5;

# 限定表名的列

SELECT yitiao.yitiao_id

FROM yitiao;

排序查找

排序

# 用yitiao_coding的字母順序排序

SELECT yitiao_coding FROM yitiao

ORDER BY yitiao_coding;
# 先用價格排序,再用名稱排序

SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiao

ORDER BY yitiao_price, yitiao_coding;

降序

無說明默認升序,降序需要用DESC(descrease)加以說明

如果要在多個列上進行降序,需要對每個列都進行DESC說明

# 價格降序

SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiao

ORDER BY yitiao_price DESC;

# 先對價格降序,再用名稱排序(無說明默認升序)

SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiao

ORDER BY yitiao_price DESC, yitiao_coding;

執行順序

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

選擇查詢

WHERE子句運算子

= 等于,!= 不等于,< 小于, > 大于, <= 小于等于, >= 大于等于, BETWEEN AND 在指定的兩個值之間

選擇單個值

# 名字等于fuses

SELECT yitiao_id, yitiao_price, yitiao_coding

FROM yitiao

WHERE yitiao_mane = 'fuses';

# 價格大于10

SELECT yitiao_id, yitiao_price, yitiao_coding

FROM yitiao

WHERE yitiao_price > 10;

#供應商ID不是1003

SELECT yitiao_id, yitiao_price, yitiao_coding

FROM yitiao

WHERE yitiao_id != 1003;

范圍值檢查

SELECT yitiao_id,yitiao_coding,yitiao_price

FROM yitiao

WHERE yitiao_price BETWEEN 5 AND 10;

空值檢查

IS NULL:如果列值為 NULL,則該運算子回傳 true,

IS NOT NULL:如果列值不為NULL,則該運算子回傳 true,

該運算子用于兩個值的對比,當兩個值都為 NULL 時(這一點與 = 運算子不同),回傳 true,

包含 NULL 的條件都是比較特殊的,不能在列中使用 = NULL 或 ! = NULL 來尋找 NULL 值,這樣的比對通常都是失敗的,因為不可能得知這樣的比對是否為真,

# NULL表示空值,no value

SELECT yitiao_id,yitiao_coding,yitiao_price

FROM yitiao

WHERE yitiao_price IS NULL;

AND & OR

AND表示同時滿足所有條件

# id=1003,價格小于等于10

SELECT  yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_id = 1003 AND yitiao_price <= 10;

OR表示滿足所有的單個條件

# id是1002或者是價格等于10

SELECT yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_id = 1002 OR yitiao_price = 10;

次序計算

MySql優先處理AND, 后處理OR

# 先滿足yitiao_id = 1003 AND yitiao_price = 10

SELECT yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_id = 1002 OR yitiao_id = 1003 AND yitiao_price = 10;

# 要先處理OR,應該加()

SELECT yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE (yitiao_id = 1002 OR yitiao_id = 1003) AND yitiao_price = 10;

IN指定條件范圍

# 查找1002,1003供應商并用名稱排序

SELECT yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_id IN (1002, 1003)

ORDER BY yitiao_coding;

NOT & NOT IN

NOT表在WHERE子句中用來否定后跟的條件,NOT IN可以用來取反

# 查找不是1002,1003供應商并用名稱排序

SELECT yitiao_id, yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_id NOT IN (1002, 1003)

ORDER BY yitiao_coding;

模糊查詢

LIKE子句+通配符 %

%表示任何字串出現任意次數,區分大小寫

_表示任何字串出現單次,指一個字符,其他功能和%一樣

# 查找以jet起頭的產品名字(和JET起頭不匹配)

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding LIKE 'jet%';
# 查找產品名字中任意位置有care字符

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding LIKE '%care%';

# 查找產品名字中以s開頭e結尾的字符,長度不限

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding LIKE 's%e';

正則運算式

正則運算式是用來匹配文本的特殊的串(字符集合)

基本字符匹配

# 查找列yitiao_coding**包含文本1000**的所有行,和LIKE類似

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding **REGEXP '1000'**

ORDER BY yitiao_coding;
# . 是正則運算式中一個特殊的字符,表示匹配任意一個字符,查找列yitiao_coding包含文本.000的所有行(比如1000,2000,3000),和LIKE不同

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding REGEXP '.000'

ORDER BY yitiao_coding;

OR的匹配

# 查找列yitiao_coding包含文本1000,2000的行

SELECT yitiao_coding, yitiao_price

FROM yitiao

WHERE yitiao_coding REGEXP '1000|2000'

ORDER BY yitiao_coding;

匹配幾個字符之一

# 匹配1TON, 2TON, 3TON的組合方式, [123]TON = [1|2|3]TON**,如果輸1|2|3 TON是指1,2,3 TON,不是1TON, 2TON, 3TON.

SELECT yitiao-name, yitiao_price

FROM yitiao

WHERE yitiao_coding REGEXP '[1|2|3]TON'

ORDER BY yitiao_coding;

匹配范圍

[1-3]是一個范圍,[a-z]匹配任意字母字符

匹配特殊字符

\為前導來匹配,如\.

# 匹配帶.的特殊字符

SELECT yitiao-name, yitiao_price

FROM yitiao

WHERE yitiao_coding REGEXP '\\.'

ORDER BY yitiao_coding;

空白元字符

\f 換頁, \n 換行, \r 回車,\t 制表,\v 縱向制表

重復元字符

0個或多個字符,+ 1個或多個字符,?0個或1個字符,{n} 指定n個字符,{n,} 指定不少于 n個字符,{n,m}指定n-m個字符

定位元字符

^xx 以xx開頭,xx$ 以xx結束,[[:<:f]] 詞的開始,[[:>:]] 詞的結尾

#尋找以 'st' 開頭的名稱,查詢如下:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

#尋找以 'ok' 結尾的名稱,查詢如下:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

文本數值時間計算處理

Concat() 拼接

將值聯結到一起構成單個值

# 字串拼接

select concat(str1,str2...)

# 把兩列合并為一列

select concat(vender, country) as yitiao

from test;

使用別名

AS賦予聯結后的單個詞一個別名

SELECT Contact(vend_name, '(',vend_country,')') **AS** vend_title

FROM vendors

ORDER BY vend_name;

文本字串處理

Left() 回傳左邊的字串, Right() 回傳右邊的字串,Length() 回傳字串的長度,Locate() 找出串的一個子串,SubString() 回傳子串的字符,Soundex() 回傳字串的SOUNDEX值(類似發音的字串)RTrim洗掉右邊多余的空格,LTrim洗掉左邊多余的空格, Upper() 轉為大寫,Lower() 轉為小寫,

洗掉右邊空格

SELECT RTim(vend_name), RTrim(vend_country)

FROM vendors

ORDER BY vend_name;

Upper()轉為大寫,Lower()轉為小寫

SELECT vend_name, Upper(vend_name) AS vend_name_upcase

FROM vendors

ORDER BY vend_name;

日期和時間處理函式

Year() 回傳一個時間的年份,Month() 回傳一個時間的月份,Date() 回傳一個時間的日期,Day() 回傳一個時間的天數,Hour() 回傳一個時間的小時,Minute() 回傳一個時間的分鐘,Second() 回傳一個時間的秒鐘,Now() 回傳當前日期和時間,Time() 回傳一個日期的時間,AddDate() 增加一個日期,AddTime() 增加一個時間

查找一個特定日期的訂單

SELECT yitiao_id, yitiao_coding

FROM yitiao

WHERE Date(order_date) = '2020-09-02'

ORDER BY yitiao_coding;

查找特定的時間段

SELECT yitiao_id, yitiao_coding

FROM yitiao

WHERE Date(order_date) **BETWEEN** '2021-09-01' **AND** '2021-09-03';

# 查找特定年份和月份

SELECT yitiao_id, yitiao_coding

FROM yitiao

WHERE Year(order_date) = 2021 **AND** Month(order_date) = 9;

算數計算

# 查找訂單號是2005的產品數量和價格

SELECT yitiao_id, yitiao_qty, yitiao_price

FROM yitiao

WHERE order_num = 2005;

# 上述 查找后計算總價值(數量*價格)

SELECT yitiao_id, yitiao_qty, yitiao_price, **yitiao_qty\*yitiao_price AS expanded_price**

FROM yitiao

WHERE order_num = 2005;

數值處理函式

Abs() 回傳一個數的絕對值,Sqrt() 回傳一個數的平方根, Rand() 回傳一個亂數,Pi() 回傳圓周率Exp(),回傳一個數的指數值,Mod() 回傳除操作的余數,Cos() 回傳一個角度的余弦值 Sin() 回傳一個角度的正弦值,Tan() 回傳一個角度的正切值

資料處理

AVG() 平均值

# 求產品平均值

SELECT AVG(yitiao_price) AS avg_price

FROM yitiao;

# AVG(DISTINCT), 相同價格只出現一次,計算平均值

SELECT AVG(DISTINCT yitiao_price) AS avg_price

FROM yitiao;

COUNT() 計數

COUNT(*) AS cust_num, 對所有列進行計數的,但是只回傳cust_num里的計數結果

COUNT(*)對所有進行計數,COUNT(column)對除掉NULL的列進行計數

# 求客戶數量

SELECT COUNT(*) AS num_cust

FROM customers;

# 求有郵箱的客戶數量

SELECT COUNT(cust_email) AS num_cust

FROM customers;

最值

# MAX() 最大值

SELECT MAX(yitiao_price) AS max_price

FROM yitiao;

# MIN() 最小值

SELECT MIN(yitiao_price) AS min_price

FROM yitiao;

SUM() 求和

# 訂單中物品為2005的所有數量

SELECT SUM(qty) AS total_items

FROM orderitems

WHERE item_name = 2005;

# 訂單中物品為2005的全部金額

SELECT SUM(qty*item_price) AS total_amount

FROM orderitems

WHERE item_name = 2005;

SELECT 可以包含多個聚集函式

SELECT COUNT(*) AS item_num

MIN(yitiao_price) AS min_price

MAX(yitiao_price) AS max_price

AVG(yitiao_price) AS avg_price

FROM yitiao;

分組

創建分組

# 不同供應商包含的產品計數并分組

SELECT yitiao_id, COUNT(*) AS yitiao_num

FROM yitiao

GROUP BY yitiao_id;

過濾分組,

WHERE針對特定值(每個值,原值),HAVING針對分組過濾后的值**

# 查找買了2次以上的客戶,此處不能用WHERE

SELECT cust_id, COUT(*) AS order_num

FROM orders

GROUP BY cust_id

HAVING COUNT(*) >= 2;

# 價格為10以上,具有2個以上產品的供應商

SELECT yitiao_id, COUNT(*) AS yitiao_num

FROM vendors

WHERE yitiao_price >= 10

GROUP BY yitiao_id

HAVING COUNT(*) >= 2;

語法順序

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

子查詢

利用子查詢過濾

在幾個關系表中,檢索TNT2物品的客戶資訊,但是沒有直接一個表體現這個資訊,一步一步過濾,方式如下:

# 查找包含物品TNT2的所有訂單編號

SELECT order_num

FROM orderitems

WHERE yitiao_id = 'TNT2';

輸出結果(2005,2007)

# 查找該訂單編號的所有客戶ID

SELECT cust_id

FROM orders

WHERE oder_num IN (2005,2007);

輸出結果(1001,1004)

# 查找該客戶ID的所有客戶資訊

SELECT cust_info

FROM customers

WHERE cust_id IN (1001, 1004);

輸出結果

利用子查詢,方式如下:

SELECT cust_info

FROM customers

WHERE cust_id **IN** (

SELECT cust_id

FROM orders

WHERE oder_num **IN**(

SELECT order_num

FROM orderitems

WHERE yitiao_id = 'TNT2'));

聯結表

創建聯結 JOIN

# 從2個關系表中匯出資料

SELECT yitiao_price, yitiao_coding, vend_name

FROM yitiao, vendors

**WHERE yitiao.yitiao_id = vendors.yitiao_id**

ORDER BY vend_name, yitiao_coding;

# INNOR JOIN...ON內部聯結-上述的第二種寫法

SELECT yitiao_price, yitiao_coding, vend_name

FROM yitiao

**INNER JOIN vendors ON yitiao.yitiao_id = vendors.yitiao_id;**

聯結多個表

SELECT yitiao_price, yitiao_coding, vend_name, order_num

FROM yitiao, vendors, orders

WHERE yitiao.yitiao_id = vendors.yitiao_id

AND yitiao.yitiao_id = orders.yitiao_id

AND order_num = 2005; # AND起過濾作用

自聯結

# 先找到物品ID是TNT2的供應商,再找到此供應商ID下的其他物品,把1個表別名成2個表,p1輸出物品名字和ID,p2用作關聯TNT2的語法和結果輸出

SELECT p1.yitiao_id, p1.yitiao_coding

FROM yitiao AS p1, yitiao AS p2

**WHERE p1.yitiao_id = p2.yitiao_id**

**AND p2.yitiao_id = 'TNT2';**

自然聯結

關系表中有一樣的列,通過表別名和篩選,使每個列只回傳一次

# *通配符只對c表使用,其他表的重復列沒有被查找出來

SELECT c*, o.order_item, o.order_date, oi.yitiao_id, oi.yitiao_qty, oi.yitiao_price

FROM customers AS c, orders AS o, orderitems AS oi

WHERE c.cust_id = o.cust_id

AND p.yitiao_id = oi.yitiao_id

AND yitiao_id = 'TNT2';

外部聯結

# 為了查找所有客戶的下單數量,包括沒有訂單的客戶, LEFT OUTER JOIN...ON**表示從左邊的表(customers)中選擇所有行

SELECT customers.cust_id, orders.order_num

FROM customers

LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

使用帶聚集函式的聯結

# 內部聯結,表之間相等的行聯結

SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS ord_num

FROM customers INNER JOIN orders

ON customers_cust.id = orders.cust_id

GROUP BY customers_cust.id;

# 外部聯結,表之間有不相關聯的行聯結

SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS ord_num

FROM customers LEFT OUTER JOIN orders

ON customers_cust.id = orders.cust_id

GROUP BY customers_cust.id;

更新資料

更新查詢Update

UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]

# 把李四的地址改為上海(默認Beijing)

Update employee set city = 'Shanghai' where id = 2;

更改表結構

# 在表employee增加一列addr

Alter table employee **add** colunm addr varchar(40);

更新表名

Rename Table 表名 to 新表名;

Alter選擇

洗掉、添加列或對其重新定位

# 從表中洗掉 i這一列

ALTER TABLE testalter_tbl DROP i; # 如果表中只有一列,則 DROP 子句不起作用

# 下面我們再把 i 這一列恢復到 testalter_tbl 中,使用 ADD 并指定列定義:

ALTER TABLE testalter_tbl ADD i INT;

# 要想把列放到一個特定位置,可以使用兩種方法,第一種方法是使用 FIRST,讓指定列成為第一列;第二種則采用 # AFTER 后跟給定列名的方式,指示新列應該放到給定列名的后面,

ALTER TABLE testalter_tbl DROP i; 
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i; 
ALTER TABLE testalter_tbl ADD i INT AFTER c;

# 識別符號 FIRST 和 AFTER 只能和 ADD 子句一起使用,這也意味著,如果要重新定位一列,就必須先用 DROP # 洗掉它,然后再用 ADD 將它添加到新的位置,

更新列名和資料型別

更改資料型別,把列 c 從 CHAR(1) 變為 CHAR(10):

ALTER TABLE testalter_tbl MODIFY c CHAR(10);

# CHANGE 的語法稍有不同,必須把所要改變的列名放到 CHANGE 關鍵字的后面然后指定新的列定義

ALTER TABLE testalter_tbl CHANGE 原列名 新列名 列定義;

# 如果想利用 CHANGE 將 j 從 BIGINT 轉為 INT,并且不改變列名,則陳述句如下:

ALTER TABLE testalter_tbl CHANGE j j INT;

ALTER TABLE 對 Null 及默認值屬性的作用

在利用 MODIFY 或 CHANGE 修改列時,還可以指定該列是否能有 NULL 值,以及它的默認值,如果我們不這樣處理,MySQL 會自動為這些屬性指定相關值,

# NOT NULL 列默認值為100:

MODIFY j BIGINT NOT NULL DEFAULT 100;

# 使用 ALTER 命令可以改變任何列的默認值

ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;

# 使用 DROP 子句與 ALTER 命令,可以去除任何列中的默認限制

ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;

改變表型別

結合使用 TYPE 子句與 ALTER 命令,可以使用表型別

ALTER TABLE testalter_tbl TYPE = MYISAM;

對表進行重命名

使用 ALTER TABLE 陳述句的 RENAME 選項可以對表進行重命名

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

Index索引

簡單而唯一的索引

可以為表創建唯一索引,唯一索引要求任意兩行的索引值不能相同

CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);

# 可以使用一或多個列來創建索引

CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)

# 降序在列中索引數值,可以在列名后添加保留字 DESC(Descending)

CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)

添加與洗掉 INDEX 的ALTER 命令

為表添加索引,可以采用4種陳述句

# 該陳述句添加一個主鍵,意味著索引值必須是唯一的,不能為 NULL

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)

# 該陳述句為必須唯一的值(除了 NULL 值之外,NULL 值可以多次出現)

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)

# 陳述句為可能多次出現的值創建一般索引

ALTER TABLE tbl_name ADD INDEX index_name (column_list)

# 陳述句創建專用于文本搜索的 FULLTEXT 索引

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)

為現有表添加索引

ALTER TABLE testalter_tbl ADD INDEX (c);

# 可以使用 DROP 子句以及 ALTER 命令洗掉索引

ALTER TABLE testalter_tbl DROP INDEX (c);

利用 ALTER 命令來添加與洗掉主鍵

添加主鍵也采用類似方式,但要保證主鍵一定在列上,是 NOT NULL

# 在現有表中添加主鍵,先使列為 NOT NULL,然后再將其作為主鍵

ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

# 洗掉一個主鍵

ALTER TABLE testalter_tbl DROP PRIMARY KEY;

序列

使用 AUTO_INCREMENT 列

# 先創建一個表,然后插入一些行,不需要提供記錄ID,因為這是由 MySQL 自動增加的

CREATE TABLE insect (

id INT UNSIGNED NOT NULL AUTO_INCREMENT,

PRIMARY KEY (id),

name VARCHAR(30) NOT NULL, # type of insect

date DATE NOT NULL, # date collected

origin VARCHAR(30) NOT NULL # where collected );

# 插入值

INSERT INTO insect (id,name,date,origin)

VALUES (NULL,'housefly','2001-09-10','kitchen'),

(NULL,'millipede','2001-09-10','driveway'),

(NULL,'grasshopper','2001-09-10','front yard');

對已有序列進行重新編號

如果一定要對 AUTO_INCREMENT 列進行重新排序,那么正確的方式是將該列從表中洗掉,然后再添加它,下面這個范例中就用了這個技巧,在 insect 表中對 id 值重新排序,

ALTER TABLE insect DROP id;

ALTER TABLE insect

ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,

ADD PRIMARY KEY (id);

以特定值作為序列初始值

MySQL 默認以 1 作為序列初始值,但你也可以在創建表時指定其他的數字,以 100 作為序列初始值

CREATE TABLE insect (

id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,

PRIMARY KEY (id),

name VARCHAR(30) NOT NULL, # type of insect

date DATE NOT NULL, # date collected

origin VARCHAR(30) NOT NULL # where collected );

重復處理

防止表中出現重復記錄

可以在表中正確的欄位內使用 PRIMARY KEY 或 UNIQUE 索引來終止重復記錄,比如下面這張表,由于沒有這樣的索引或主鍵,因此 first_name與last_name 就被重復記錄了下來,

CREATE TABLE person_tbl (

first_name CHAR(20),

last_name CHAR(20),

sex CHAR(10) );

為了防止表中出現同樣姓名的值,為其添加一個 PRIMARY KEY,同時要注意將索引列宣告為 NOT NULL,這是因為 PRIMARY KEY 不允許出現空值

CREATE TABLE person_tbl (

first_name CHAR(20) NOT NULL,

last_name CHAR(20) NOT NULL,

sex CHAR(10),

PRIMARY KEY (last_name, first_name) );

不要使用 INSERT ,使用 INSERT IGNORE,如果該記錄與現存的某個記錄重復,IGNORE 關鍵字就會讓 MySQL 默默地將其摒棄,不會產生任何錯誤,

# 下面這個范例不會產生任何錯誤,不會插入會產生重復的記錄,

INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES ( 'Jay', 'Thomas');

# 使用 **REPLACE** 而不是 INSERT,如果是一個重復記錄,新的記錄將會替換舊有記錄,

REPLACE INTO person_tbl (last_name, first_name) VALUES ( 'Ajay', 'Kumar');

強制唯一性的另一種辦法是為表添加 UNIQUE 索引而不是主鍵,

CREATE TABLE person_tbl (

first_name CHAR(20) NOT NULL,

last_name CHAR(20) NOT NULL,

sex CHAR(10)

UNIQUE (last_name, first_name) );

確認重復記錄,并計算重復記錄數

# 下面是計算表中姓名記錄重復的查詢:

SELECT COUNT(*) as repetitions, last_name, first_name

FROM person_tbl GROUP BY last_name, first_name

HAVING repetitions > 1;

該查詢回傳表 person_tbl 中所有的重復記錄,一般來說,要想確認重復記錄,需要采取以下步驟:

  • 確定可能產生重復記錄的列,
  • 在列選擇串列中顯示所有列,利用 COUNT(*) ,
  • 利用 GROUP BY 子句列出列,
  • 加入 HAVING 子句排除唯一值,需要讓組計數大于1,

從查詢結果中消除重復記錄

使用DISTINCT(獨的) 和 SELECT 陳述句來查找表中的重復記錄,

SELECT DISTINCT last_name, first_name

FROM person_tbl

ORDER BY last_name;

另一種辦法是添加 GROUP BY 子句,命名選擇的列,消除重復記錄并只選擇指定列中的唯一值組合,

SELECT last_name, first_name

FROM person_tbl

GROUP BY (last_name, first_name);

使用表替換去除重復記錄

下面這種技巧也可以消除表中存在的所有重復記錄,

CREATE TABLE tmp

SELECT last_name, first_name, sex

FROM person_tbl;

GROUP BY (last_name, first_name);

DROP TABLE person_tbl;

ALTER TABLE tmp RENAME TO person_tbl;

為表加入 INDEX 或 PRIMARY KEY ,即使該表已經存在,你也可以利用這種技巧消除重復記錄,這種做法將來也依然保險,

ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);

?今天是堅持刷題更文的第49/100天

?各位的點贊、關注、收藏、評論、訂閱就是一條創作的最大動力

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/297964.html

標籤:其他

上一篇:粉絲靠這篇《兩萬字MySql陳述句總結》換到了女神微信,你不了解一下嗎??建議收藏

下一篇:大廠面試預備篇——《兩萬字MySql基礎總結》??建議收藏

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more