?? 一條獨家專欄
?? 搞技術,進大廠,聊人生
?《大廠面試突擊》——面試10多家中大廠的萬字總結
?《技術專家修煉》——高薪必備,企業真實場景
?《leetcode 300題》——每天一道算法題,進大廠必備
?《糊涂算法》——數據結構+算法全面講解
?《從實戰學python》——python的各種應用
?《程序人生》——聽一條聊職場,聊人生
?更多資料點這里
天下難事,必作于易;天下大事,必作于細。 —— 老子
哈嘍,大家好,我是一條。
前幾天有個粉絲來找我,發生了這樣一段有趣的對話:
一條哥 ,請教個問題,我昨天要女神微信被拒絕了怎么辦?
我不是教你搞技術嗎? 你小子搞對象去了,leetcode題刷了嗎?
要不到微信刷不進去題呀,幫幫忙吧
淡定,急什么,我和你說,要先找到女神的需求,用科技賦能愛情,才能加微信,約吃飯,談戀愛全鏈路打通。
太高深了,聽不懂,你就告訴我怎么做吧
這些互聯網黑話等你畢業就懂了,你現在和我說說女神最近有什么煩惱嗎
女神怎么可能會有煩惱,要啥有啥
給我好好想,你得動腦子呀
哎,還真有一個,她最近數據庫考試考的不太好,不怎么開心
這樣,那就好辦了,我這有一份《mysql萬字秘籍》,你拿回去好好研讀,保你下次班級第一,到時借著發學習資料的名義不就加了微信,然后再約著上自習,完事吃個飯。這就叫全鏈路打通,懂了嗎?
妙啊,秘籍呢,快給我吧
看你那猴急的樣,給我一鍵三連,隨后發你
沒問題,謝謝一條哥!
下面就是2萬字秘籍,免費送給大家,老規矩——一鍵三連
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_idFROM yitiaoLIMIT 5;# 查找第6行開始的5行SELECT yitiao_idFROM yitiaoLIMIT 6, 5;# 限定表名的列SELECT yitiao.yitiao_idFROM yitiao;
# 用yitiao_coding的字母順序排序SELECT yitiao_coding FROM yitiaoORDER BY yitiao_coding;# 先用價格排序,再用名稱排序SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiaoORDER BY yitiao_price, yitiao_coding;
無說明默認升序,降序需要用DESC(descrease)加以說明
如果要在多個列上進行降序,需要對每個列都進行DESC說明
# 價格降序SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiaoORDER BY yitiao_price DESC;# 先對價格降序,再用名稱排序(無說明默認升序)SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiaoORDER BY yitiao_price DESC, yitiao_coding;
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
= 等于,!= 不等于,< 小于, > 大于, <= 小于等于, >= 大于等于, BETWEEN AND 在指定的兩個值之間
選擇單個值
# 名字等于fusesSELECT yitiao_id, yitiao_price, yitiao_codingFROM yitiaoWHERE yitiao_mane = "fuses";# 價格大于10SELECT yitiao_id, yitiao_price, yitiao_codingFROM yitiaoWHERE yitiao_price > 10;#供應商ID不是1003SELECT yitiao_id, yitiao_price, yitiao_codingFROM yitiaoWHERE yitiao_id != 1003;
范圍值檢查
SELECT yitiao_id,yitiao_coding,yitiao_priceFROM yitiaoWHERE yitiao_price BETWEEN 5 AND 10;
空值檢查
IS NULL:如果列值為 NULL,則該運算符返回 true。
IS NOT NULL:如果列值不為NULL,則該運算符返回 true。
該運算符用于兩個值的對比,當兩個值都為 NULL 時(這一點與 = 運算符不同),返回 true。
包含 NULL 的條件都是比較特殊的。不能在列中使用 = NULL 或 ! = NULL 來尋找 NULL 值。這樣的比對通常都是失敗的,因為不可能得知這樣的比對是否為真。
# NULL表示空值,no valueSELECT yitiao_id,yitiao_coding,yitiao_priceFROM yitiaoWHERE yitiao_price IS NULL;
AND表示同時滿足所有條件
# id=1003,價格小于等于10SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id = 1003 AND yitiao_price <= 10;
OR表示滿足所有的單個條件
# id是1002或者是價格等于10SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id = 1002 OR yitiao_price = 10;
次序計算
MySql優先處理AND, 后處理OR
# 先滿足yitiao_id = 1003 AND yitiao_price = 10SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id = 1002 OR yitiao_id = 1003 AND yitiao_price = 10;# 要先處理OR,應該加()SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE (yitiao_id = 1002 OR yitiao_id = 1003) AND yitiao_price = 10;
# 查找1002,1003供應商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id IN (1002, 1003)ORDER BY yitiao_coding;
NOT表在WHERE子句中用來否定后跟的條件,NOT IN可以用來取反
# 查找不是1002,1003供應商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id NOT IN (1002, 1003)ORDER BY yitiao_coding;
%
表示任何字符串出現任意次數,區分大小寫
_
表示任何字符串出現單次,指一個字符,其他功能和%
一樣
# 查找以jet起頭的產品名字(和JET起頭不匹配)SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "jet%";# 查找產品名字中任意位置有care字符SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "%care%";# 查找產品名字中以s開頭e結尾的字符,長度不限SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "s%e";
正則表達式是用來匹配文本的特殊的串(字符集合)
# 查找列yitiao_coding**包含文本1000**的所有行,和LIKE類似SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding **REGEXP "1000"**ORDER BY yitiao_coding;# . 是正則表達式中一個特殊的字符,表示匹配任意一個字符,查找列yitiao_coding包含文本.000的所有行(比如1000,2000,3000),和LIKE不同SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding REGEXP ".000"ORDER BY yitiao_coding;
# 查找列yitiao_coding包含文本1000,2000的行SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE 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_priceFROM yitiaoWHERE yitiao_coding REGEXP "[1|2|3]TON"ORDER BY yitiao_coding;
[1-3]是一個范圍,[a-z]匹配任意字母字符
用
/
為前導來匹配,如/.
# 匹配帶.的特殊字符SELECT yitiao-name, yitiao_priceFROM yitiaoWHERE yitiao_coding REGEXP "http://."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$";
將值聯結到一起構成單個值
# 字符串拼接select concat(str1,str2...)# 把兩列合并為一列select concat(vender, country) as yitiaofrom test;
AS
賦予聯結后的單個詞一個別名
SELECT Contact(vend_name, "(",vend_country,")") **AS** vend_titleFROM vendorsORDER BY vend_name;
Left() 返回左邊的字符串, Right() 返回右邊的字符串,Length() 返回字符串的長度,Locate() 找出串的一個子串,SubString() 返回子串的字符,Soundex() 返回字符串的SOUNDEX值(類似發音的字符串),RTrim刪除右邊多余的空格,LTrim刪除左邊多余的空格, Upper() 轉為大寫,Lower() 轉為小寫,
SELECT RTim(vend_name), RTrim(vend_country)FROM vendorsORDER BY vend_name;
SELECT vend_name, Upper(vend_name) AS vend_name_upcaseFROM vendorsORDER BY vend_name;
Year() 返回一個時間的年份,Month() 返回一個時間的月份,Date() 返回一個時間的日期,Day() 返回一個時間的天數,Hour() 返回一個時間的小時,Minute() 返回一個時間的分鐘,Second() 返回一個時間的秒鐘,Now() 返回當前日期和時間,Time() 返回一個日期的時間,AddDate() 增加一個日期,AddTime() 增加一個時間
SELECT yitiao_id, yitiao_codingFROM yitiaoWHERE Date(order_date) = "2020-09-02"ORDER BY yitiao_coding;
SELECT yitiao_id, yitiao_codingFROM yitiaoWHERE Date(order_date) **BETWEEN** "2021-09-01" **AND** "2021-09-03";# 查找特定年份和月份SELECT yitiao_id, yitiao_codingFROM yitiaoWHERE Year(order_date) = 2021 **AND** Month(order_date) = 9;
# 查找訂單號是2005的產品數量和價格SELECT yitiao_id, yitiao_qty, yitiao_priceFROM yitiaoWHERE order_num = 2005;# 上述 查找后計算總價值(數量*價格)SELECT yitiao_id, yitiao_qty, yitiao_price, **yitiao_qty/*yitiao_price AS expanded_price**FROM yitiaoWHERE order_num = 2005;
Abs() 返回一個數的絕對值,Sqrt() 返回一個數的平方根, Rand() 返回一個隨機數,Pi() 返回圓周率Exp(),返回一個數的指數值,Mod() 返回除操作的余數,Cos() 返回一個角度的余弦值 Sin() 返回一個角度的正弦值,Tan() 返回一個角度的正切值
# 求產品平均值SELECT AVG(yitiao_price) AS avg_priceFROM yitiao;# AVG(DISTINCT), 相同價格只出現一次,計算平均值SELECT AVG(DISTINCT yitiao_price) AS avg_priceFROM yitiao;
COUNT(*) AS cust_num, 對所有列進行計數的,但是只返回cust_num里的計數結果COUNT(*)對所有進行計數,COUNT(column)對除掉NULL的列進行計數# 求客戶數量SELECT COUNT(*) AS num_custFROM customers;# 求有郵箱的客戶數量SELECT COUNT(cust_email) AS num_custFROM customers;
# MAX() 最大值SELECT MAX(yitiao_price) AS max_priceFROM yitiao;# MIN() 最小值SELECT MIN(yitiao_price) AS min_priceFROM yitiao;
# 訂單中物品為2005的所有數量SELECT SUM(qty) AS total_itemsFROM orderitemsWHERE item_name = 2005;# 訂單中物品為2005的全部金額SELECT SUM(qty*item_price) AS total_amountFROM orderitemsWHERE item_name = 2005;
SELECT COUNT(*) AS item_numMIN(yitiao_price) AS min_priceMAX(yitiao_price) AS max_priceAVG(yitiao_price) AS avg_priceFROM yitiao;
# 不同供應商包含的產品計數并分組SELECT yitiao_id, COUNT(*) AS yitiao_numFROM yitiaoGROUP BY yitiao_id;
WHERE針對特定值(每個值,原值),HAVING針對分組過濾后的值**
# 查找買了2次以上的客戶,此處不能用WHERESELECT cust_id, COUT(*) AS order_numFROM ordersGROUP BY cust_idHAVING COUNT(*) >= 2;# 價格為10以上,具有2個以上產品的供應商SELECT yitiao_id, COUNT(*) AS yitiao_numFROM vendorsWHERE yitiao_price >= 10GROUP BY yitiao_idHAVING COUNT(*) >= 2;
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
在幾個關系表中,檢索TNT2物品的客戶信息,但是沒有直接一個表體現這個信息,一步一步過濾,方式如下:
# 查找包含物品TNT2的所有訂單編號SELECT order_numFROM orderitemsWHERE yitiao_id = "TNT2";輸出結果(2005,2007)# 查找該訂單編號的所有客戶IDSELECT cust_idFROM ordersWHERE oder_num IN (2005,2007);輸出結果(1001,1004)# 查找該客戶ID的所有客戶信息SELECT cust_infoFROM customersWHERE cust_id IN (1001, 1004);輸出結果利用子查詢,方式如下:SELECT cust_infoFROM customersWHERE cust_id **IN** (SELECT cust_idFROM ordersWHERE oder_num **IN**(SELECT order_numFROM orderitemsWHERE yitiao_id = "TNT2"));
# 從2個關系表中導出數據SELECT yitiao_price, yitiao_coding, vend_nameFROM yitiao, vendors**WHERE yitiao.yitiao_id = vendors.yitiao_id**ORDER BY vend_name, yitiao_coding;# INNOR JOIN...ON內部聯結-上述的第二種寫法SELECT yitiao_price, yitiao_coding, vend_nameFROM yitiao**INNER JOIN vendors ON yitiao.yitiao_id = vendors.yitiao_id;**
SELECT yitiao_price, yitiao_coding, vend_name, order_numFROM yitiao, vendors, ordersWHERE yitiao.yitiao_id = vendors.yitiao_idAND yitiao.yitiao_id = orders.yitiao_idAND order_num = 2005; # AND起過濾作用
# 先找到物品ID是TNT2的供應商,再找到此供應商ID下的其他物品,把1個表別名成2個表,p1輸出物品名字和ID,p2用作關聯TNT2的語法和結果輸出SELECT p1.yitiao_id, p1.yitiao_codingFROM 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_priceFROM customers AS c, orders AS o, orderitems AS oiWHERE c.cust_id = o.cust_idAND p.yitiao_id = oi.yitiao_idAND yitiao_id = "TNT2";
# 為了查找所有客戶的下單數量,包括沒有訂單的客戶, LEFT OUTER JOIN...ON**表示從左邊的表(customers)中選擇所有行SELECT customers.cust_id, orders.order_numFROM customersLEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
# 內部聯結,表之間相等的行聯結SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS ord_numFROM customers INNER JOIN ordersON customers_cust.id = orders.cust_idGROUP BY customers_cust.id;# 外部聯結,表之間有不相關聯的行聯結SELECT customers.cust_name, customers.cust_id, COUNT(orders.order_num) AS ord_numFROM customers LEFT OUTER JOIN ordersON customers_cust.id = orders.cust_idGROUP BY customers_cust.id;
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]# 把李四的地址改為上海(默認Beijing)Update employee set city = "Shanghai" where id = 2;
# 在表employee增加一列addrAlter table employee **add** colunm addr varchar(40);
Rename Table 表名 to 新表名;
# 從表中刪除 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;
在利用 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;
可以為表創建唯一索引,唯一索引要求任意兩行的索引值不能相同
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)
為表添加索引,可以采用4種語句
# 該語句添加一個主鍵。意味著索引值必須是唯一的,不能為 NULLALTER 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);
添加主鍵也采用類似方式,但要保證主鍵一定在列上,是 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;
# 先創建一個表,然后插入一些行,不需要提供記錄ID,因為這是由 MySQL 自動增加的CREATE TABLE insect (id INT UNSIGNED NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),name VARCHAR(30) NOT NULL, # type of insectdate DATE NOT NULL, # date collectedorigin 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 insectADD 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 insectdate DATE NOT NULL, # date collectedorigin 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_nameFROM person_tbl GROUP BY last_name, first_nameHAVING repetitions > 1;
該查詢返回表 person_tbl 中所有的重復記錄。一般來說,要想確認重復記錄,需要采取以下步驟:
使用DISTINCT(獨的) 和 SELECT 語句來查找表中的重復記錄。
SELECT DISTINCT last_name, first_nameFROM person_tblORDER BY last_name;
另一種辦法是添加 GROUP BY 子句,命名選擇的列。消除重復記錄并只選擇指定列中的唯一值組合。
SELECT last_name, first_nameFROM person_tblGROUP BY (last_name, first_name);
下面這種技巧也可以消除表中存在的所有重復記錄。
CREATE TABLE tmpSELECT last_name, first_name, sexFROM 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天
?各位的點贊、關注、收藏、評論、訂閱就是一條創作的最大動力
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119413.html
摘要:今天,一條就帶大家徹底跨過排序算法這道坎,保姆級教程建議收藏。利用遞歸算法,對分治后的子數組進行排序。基本思想堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時間復雜度均為,它也是不穩定排序。 ...
摘要:標簽不區分大小寫,但推薦小寫。標簽可以嵌套,但不能交叉嵌套。標簽也稱為元素。比如行內標簽亦可成行內元素。 ??HTML必備知識詳解?? 第一部分:HTML框架簡介...
摘要:哪吒社區技能樹打卡打卡貼函數式接口簡介領域優質創作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現在公司的現狀是碼農太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區Java技能樹打卡?【打卡貼 day2...
閱讀 3401·2023-04-25 20:37
閱讀 3146·2021-09-07 09:59
閱讀 1670·2019-08-29 12:43
閱讀 1191·2019-08-28 18:27
閱讀 485·2019-08-26 13:50
閱讀 2037·2019-08-26 10:33
閱讀 3598·2019-08-23 18:39
閱讀 2403·2019-08-23 18:09