国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

dreamtecher / 3145人閱讀

?? 一條獨家專欄

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

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

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

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

?《糊涂算法》——數據結構+算法全面講解

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

?《程序人生》——聽一條聊職場,聊人生

?更多資料點這里

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

妙啊,秘籍呢,快給我吧

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

沒問題,謝謝一條哥!


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

文章目錄


?? 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_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

選擇查詢

WHERE子句操作符

= 等于,!= 不等于,< 小于, > 大于, <= 小于等于, >= 大于等于, 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 & OR

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;

IN指定條件范圍

# 查找1002,1003供應商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id IN (1002, 1003)ORDER BY yitiao_coding;

NOT & NOT IN

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

# 查找不是1002,1003供應商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id NOT IN (1002, 1003)ORDER BY yitiao_coding;

模糊查詢

LIKE子句+通配符 %

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

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

# 查找以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;

OR的匹配

# 查找列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$";

文本數值時間計算處理

Concat() 拼接

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

# 字符串拼接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;

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

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() 返回一個角度的正切值

數據處理

AVG() 平均值

# 求產品平均值SELECT AVG(yitiao_price) AS avg_priceFROM yitiao;# AVG(DISTINCT), 相同價格只出現一次,計算平均值SELECT AVG(DISTINCT yitiao_price) AS avg_priceFROM yitiao;

COUNT() 計數

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;

SUM() 求和

# 訂單中物品為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 可以包含多個聚集函數

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"));

聯結表

創建聯結 JOIN

# 從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

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 新表名;

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種語句

# 該語句添加一個主鍵。意味著索引值必須是唯一的,不能為 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);

利用 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 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 中所有的重復記錄。一般來說,要想確認重復記錄,需要采取以下步驟:

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

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

使用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

相關文章

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<