?? 一條獨(dú)家專(zhuān)欄
?? 搞技術(shù),進(jìn)大廠,聊人生
?《大廠面試突擊》——面試10多家中大廠的萬(wàn)字總結(jié)
?《技術(shù)專(zhuān)家修煉》——高薪必備,企業(yè)真實(shí)場(chǎng)景
?《leetcode 300題》——每天一道算法題,進(jìn)大廠必備
?《糊涂算法》——數(shù)據(jù)結(jié)構(gòu)+算法全面講解
?《從實(shí)戰(zhàn)學(xué)python》——python的各種應(yīng)用
?《程序人生》——聽(tīng)一條聊職場(chǎng),聊人生
?更多資料點(diǎn)這里
天下難事,必作于易;天下大事,必作于細(xì)。 —— 老子
哈嘍,大家好,我是一條。
前幾天有個(gè)粉絲來(lái)找我,發(fā)生了這樣一段有趣的對(duì)話:
一條哥 ,請(qǐng)教個(gè)問(wèn)題,我昨天要女神微信被拒絕了怎么辦?
我不是教你搞技術(shù)嗎? 你小子搞對(duì)象去了,leetcode題刷了嗎?
要不到微信刷不進(jìn)去題呀,幫幫忙吧
淡定,急什么,我和你說(shuō),要先找到女神的需求,用科技賦能愛(ài)情,才能加微信,約吃飯,談戀愛(ài)全鏈路打通。
太高深了,聽(tīng)不懂,你就告訴我怎么做吧
這些互聯(lián)網(wǎng)黑話等你畢業(yè)就懂了,你現(xiàn)在和我說(shuō)說(shuō)女神最近有什么煩惱嗎
女神怎么可能會(huì)有煩惱,要啥有啥
給我好好想,你得動(dòng)腦子呀
哎,還真有一個(gè),她最近數(shù)據(jù)庫(kù)考試考的不太好,不怎么開(kāi)心
這樣,那就好辦了,我這有一份《mysql萬(wàn)字秘籍》,你拿回去好好研讀,保你下次班級(jí)第一,到時(shí)借著發(fā)學(xué)習(xí)資料的名義不就加了微信,然后再約著上自習(xí),完事吃個(gè)飯。這就叫全鏈路打通,懂了嗎?
妙啊,秘籍呢,快給我吧
看你那猴急的樣,給我一鍵三連,隨后發(fā)你
沒(méi)問(wèn)題,謝謝一條哥!
下面就是2萬(wàn)字秘籍,免費(fèi)送給大家,老規(guī)矩——一鍵三連
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 );# 通常設(shè)置: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 命令顯示表時(shí),臨時(shí)表不會(huì)出現(xiàn)在結(jié)果列表中。如果退出 MySQL 會(huì)話,就會(huì)執(zhí)行 SELECT 命令,那么數(shù)據(jù)庫(kù)中將沒(méi)有任何數(shù)據(jù),甚至臨時(shí)表也不存在了。
SELECT * FROM yitiao_coding;
默認(rèn)情況下,當(dāng)與數(shù)據(jù)庫(kù)的連接終止時(shí),臨時(shí)表就不再存在。不過(guò)如果想在數(shù)據(jù)庫(kù)處于連接時(shí)就刪除它們,可以用
DROP TABLE
命令來(lái)刪除。
DROP TABLE SalesSummary;# 刪除程度可從強(qiáng)到弱如下排列:drop table tb;# drop 是直接將表格刪除,無(wú)法找回。例如刪除 user 表:drop table user;truncate (table) tb;# truncate 是刪除表中所有數(shù)據(jù),但不能與where一起使用;delete from tb (where);# delete 也是刪除表中數(shù)據(jù),但可以與where連用,刪除特定行;# 刪除表中所有數(shù)據(jù)delete from user;# 刪除指定行delete from user where username ="Tom";
可以采用如下步驟來(lái)處理這種情況。
使用 SHOW CREATE TABLE 或 CREATE TABLE 語(yǔ)句指定源表的結(jié)構(gòu)、索引以及所有的內(nèi)容。
調(diào)整語(yǔ)句,將表名改為克隆表的名稱,執(zhí)行語(yǔ)句。這樣就對(duì)表進(jìn)行了克隆。另外,如果想要克隆表的全部?jī)?nèi)容,也可以使用 INSERT INTO … SELECT 語(yǔ)句。
步驟1:獲取表的完整結(jié)構(gòu)
步驟2:重新命名該表,創(chuàng)建另一個(gè)表
步驟3:執(zhí)行完步驟2后,就在數(shù)據(jù)庫(kù)中創(chuàng)建了一個(gè)克隆表。如果想從舊表中復(fù)制數(shù)據(jù),可以使用 INSERT INTO… SELECT 語(yǔ)句。
# 從 yitiuao_coding 表中獲取 yitiao 這一列SELECT yitiuaocoding FROM yitiuao_coding;
SELECT yitiao_coding, yitiao_it, yitiao_name FROM yitiao;
SELECT * FROM yitiao;
# 重復(fù)的行只顯示一次SELECT DISTINCT yitiao_id FROM yitiao;
注意,行0開(kāi)始數(shù),查找5行是:0,1,2,3,4行,第6行同理從行0開(kāi)始數(shù)
# 只查找5行SELECT yitiao_idFROM yitiaoLIMIT 5;# 查找第6行開(kāi)始的5行SELECT yitiao_idFROM yitiaoLIMIT 6, 5;# 限定表名的列SELECT yitiao.yitiao_idFROM yitiao;
# 用yitiao_coding的字母順序排序SELECT yitiao_coding FROM yitiaoORDER BY yitiao_coding;# 先用價(jià)格排序,再用名稱排序SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiaoORDER BY yitiao_price, yitiao_coding;
無(wú)說(shuō)明默認(rèn)升序,降序需要用DESC(descrease)加以說(shuō)明
如果要在多個(gè)列上進(jìn)行降序,需要對(duì)每個(gè)列都進(jìn)行DESC說(shuō)明
# 價(jià)格降序SELECT yitiao_id, yitiao_price, yitiao_coding FROM yitiaoORDER BY yitiao_price DESC;# 先對(duì)價(jià)格降序,再用名稱排序(無(wú)說(shuō)明默認(rèn)升序)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 在指定的兩個(gè)值之間
選擇單個(gè)值
# 名字等于fusesSELECT yitiao_id, yitiao_price, yitiao_codingFROM yitiaoWHERE yitiao_mane = "fuses";# 價(jià)格大于10SELECT yitiao_id, yitiao_price, yitiao_codingFROM yitiaoWHERE yitiao_price > 10;#供應(yīng)商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,則該運(yùn)算符返回 true。
IS NOT NULL:如果列值不為NULL,則該運(yùn)算符返回 true。
該運(yùn)算符用于兩個(gè)值的對(duì)比,當(dāng)兩個(gè)值都為 NULL 時(shí)(這一點(diǎn)與 = 運(yùn)算符不同),返回 true。
包含 NULL 的條件都是比較特殊的。不能在列中使用 = NULL 或 ! = NULL 來(lái)尋找 NULL 值。這樣的比對(duì)通常都是失敗的,因?yàn)椴豢赡艿弥@樣的比對(duì)是否為真。
# NULL表示空值,no valueSELECT yitiao_id,yitiao_coding,yitiao_priceFROM yitiaoWHERE yitiao_price IS NULL;
AND表示同時(shí)滿足所有條件
# id=1003,價(jià)格小于等于10SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id = 1003 AND yitiao_price <= 10;
OR表示滿足所有的單個(gè)條件
# id是1002或者是價(jià)格等于10SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id = 1002 OR yitiao_price = 10;
次序計(jì)算
MySql優(yōu)先處理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,應(yīng)該加()SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE (yitiao_id = 1002 OR yitiao_id = 1003) AND yitiao_price = 10;
# 查找1002,1003供應(yīng)商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id IN (1002, 1003)ORDER BY yitiao_coding;
NOT表在WHERE子句中用來(lái)否定后跟的條件,NOT IN可以用來(lái)取反
# 查找不是1002,1003供應(yīng)商并用名稱排序SELECT yitiao_id, yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_id NOT IN (1002, 1003)ORDER BY yitiao_coding;
%
表示任何字符串出現(xiàn)任意次數(shù),區(qū)分大小寫(xiě)
_
表示任何字符串出現(xiàn)單次,指一個(gè)字符,其他功能和%
一樣
# 查找以jet起頭的產(chǎn)品名字(和JET起頭不匹配)SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "jet%";# 查找產(chǎn)品名字中任意位置有care字符SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "%care%";# 查找產(chǎn)品名字中以s開(kāi)頭e結(jié)尾的字符,長(zhǎng)度不限SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding LIKE "s%e";
正則表達(dá)式是用來(lái)匹配文本的特殊的串(字符集合)
# 查找列yitiao_coding**包含文本1000**的所有行,和LIKE類(lèi)似SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding **REGEXP "1000"**ORDER BY yitiao_coding;# . 是正則表達(dá)式中一個(gè)特殊的字符,表示匹配任意一個(gè)字符,查找列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]是一個(gè)范圍,[a-z]匹配任意字母字符
用
/
為前導(dǎo)來(lái)匹配,如/.
# 匹配帶.的特殊字符SELECT yitiao-name, yitiao_priceFROM yitiaoWHERE yitiao_coding REGEXP "http://."ORDER BY yitiao_coding;
/f 換頁(yè), /n 換行, /r 回車(chē),/t 制表,/v 縱向制表
0個(gè)或多個(gè)字符,+ 1個(gè)或多個(gè)字符,?0個(gè)或1個(gè)字符,{n} 指定n個(gè)字符,{n,} 指定不少于 n個(gè)字符,{n,m}指定n-m個(gè)字符
^xx 以xx開(kāi)頭,xx$ 以xx結(jié)束,[[:<:f]] 詞的開(kāi)始,[[:>:]] 詞的結(jié)尾
#尋找以 "st" 開(kāi)頭的名稱,查詢?nèi)缦拢簃ysql> SELECT name FROM person_tbl WHERE name REGEXP "^st";#尋找以 "ok" 結(jié)尾的名稱,查詢?nèi)缦拢簃ysql> SELECT name FROM person_tbl WHERE name REGEXP "ok$";
將值聯(lián)結(jié)到一起構(gòu)成單個(gè)值
# 字符串拼接select concat(str1,str2...)# 把兩列合并為一列select concat(vender, country) as yitiaofrom test;
AS
賦予聯(lián)結(jié)后的單個(gè)詞一個(gè)別名
SELECT Contact(vend_name, "(",vend_country,")") **AS** vend_titleFROM vendorsORDER BY vend_name;
Left() 返回左邊的字符串, Right() 返回右邊的字符串,Length() 返回字符串的長(zhǎng)度,Locate() 找出串的一個(gè)子串,SubString() 返回子串的字符,Soundex() 返回字符串的SOUNDEX值(類(lèi)似發(fā)音的字符串),RTrim刪除右邊多余的空格,LTrim刪除左邊多余的空格, Upper() 轉(zhuǎn)為大寫(xiě),Lower() 轉(zhuǎn)為小寫(xiě),
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() 返回一個(gè)時(shí)間的年份,Month() 返回一個(gè)時(shí)間的月份,Date() 返回一個(gè)時(shí)間的日期,Day() 返回一個(gè)時(shí)間的天數(shù),Hour() 返回一個(gè)時(shí)間的小時(shí),Minute() 返回一個(gè)時(shí)間的分鐘,Second() 返回一個(gè)時(shí)間的秒鐘,Now() 返回當(dāng)前日期和時(shí)間,Time() 返回一個(gè)日期的時(shí)間,AddDate() 增加一個(gè)日期,AddTime() 增加一個(gè)時(shí)間
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;
# 查找訂單號(hào)是2005的產(chǎn)品數(shù)量和價(jià)格SELECT yitiao_id, yitiao_qty, yitiao_priceFROM yitiaoWHERE order_num = 2005;# 上述 查找后計(jì)算總價(jià)值(數(shù)量*價(jià)格)SELECT yitiao_id, yitiao_qty, yitiao_price, **yitiao_qty/*yitiao_price AS expanded_price**FROM yitiaoWHERE order_num = 2005;
Abs() 返回一個(gè)數(shù)的絕對(duì)值,Sqrt() 返回一個(gè)數(shù)的平方根, Rand() 返回一個(gè)隨機(jī)數(shù),Pi() 返回圓周率Exp(),返回一個(gè)數(shù)的指數(shù)值,Mod() 返回除操作的余數(shù),Cos() 返回一個(gè)角度的余弦值 Sin() 返回一個(gè)角度的正弦值,Tan() 返回一個(gè)角度的正切值
# 求產(chǎn)品平均值SELECT AVG(yitiao_price) AS avg_priceFROM yitiao;# AVG(DISTINCT), 相同價(jià)格只出現(xiàn)一次,計(jì)算平均值SELECT AVG(DISTINCT yitiao_price) AS avg_priceFROM yitiao;
COUNT(*) AS cust_num, 對(duì)所有列進(jìn)行計(jì)數(shù)的,但是只返回cust_num里的計(jì)數(shù)結(jié)果COUNT(*)對(duì)所有進(jìn)行計(jì)數(shù),COUNT(column)對(duì)除掉NULL的列進(jìn)行計(jì)數(shù)# 求客戶數(shù)量SELECT COUNT(*) AS num_custFROM customers;# 求有郵箱的客戶數(shù)量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的所有數(shù)量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;
# 不同供應(yīng)商包含的產(chǎn)品計(jì)數(shù)并分組SELECT yitiao_id, COUNT(*) AS yitiao_numFROM yitiaoGROUP BY yitiao_id;
WHERE針對(duì)特定值(每個(gè)值,原值),HAVING針對(duì)分組過(guò)濾后的值**
# 查找買(mǎi)了2次以上的客戶,此處不能用WHERESELECT cust_id, COUT(*) AS order_numFROM ordersGROUP BY cust_idHAVING COUNT(*) >= 2;# 價(jià)格為10以上,具有2個(gè)以上產(chǎn)品的供應(yīng)商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
在幾個(gè)關(guān)系表中,檢索TNT2物品的客戶信息,但是沒(méi)有直接一個(gè)表體現(xiàn)這個(gè)信息,一步一步過(guò)濾,方式如下:
# 查找包含物品TNT2的所有訂單編號(hào)SELECT order_numFROM orderitemsWHERE yitiao_id = "TNT2";輸出結(jié)果(2005,2007)# 查找該訂單編號(hào)的所有客戶IDSELECT cust_idFROM ordersWHERE oder_num IN (2005,2007);輸出結(jié)果(1001,1004)# 查找該客戶ID的所有客戶信息SELECT cust_infoFROM customersWHERE cust_id IN (1001, 1004);輸出結(jié)果利用子查詢,方式如下:SELECT cust_infoFROM customersWHERE cust_id **IN** (SELECT cust_idFROM ordersWHERE oder_num **IN**(SELECT order_numFROM orderitemsWHERE yitiao_id = "TNT2"));
# 從2個(gè)關(guān)系表中導(dǎo)出數(shù)據(jù)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內(nèi)部聯(lián)結(jié)-上述的第二種寫(xiě)法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起過(guò)濾作用
# 先找到物品ID是TNT2的供應(yīng)商,再找到此供應(yīng)商ID下的其他物品,把1個(gè)表別名成2個(gè)表,p1輸出物品名字和ID,p2用作關(guān)聯(lián)TNT2的語(yǔ)法和結(jié)果輸出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";**
關(guān)系表中有一樣的列,通過(guò)表別名和篩選,使每個(gè)列只返回一次# *通配符只對(duì)c表使用,其他表的重復(fù)列沒(méi)有被查找出來(lái)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";
# 為了查找所有客戶的下單數(shù)量,包括沒(méi)有訂單的客戶, LEFT OUTER JOIN...ON**表示從左邊的表(customers)中選擇所有行SELECT customers.cust_id, orders.order_numFROM customersLEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;
# 內(nèi)部聯(lián)結(jié),表之間相等的行聯(lián)結(jié)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;# 外部聯(lián)結(jié),表之間有不相關(guān)聯(lián)的行聯(lián)結(jié)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]# 把李四的地址改為上海(默認(rèn)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 子句不起作用# 下面我們?cè)侔?i 這一列恢復(fù)到 testalter_tbl 中,使用 ADD 并指定列定義:ALTER TABLE testalter_tbl ADD i INT;# 要想把列放到一個(gè)特定位置,可以使用兩種方法,第一種方法是使用 FIRST,讓指定列成為第一列;第二種則采用 # AFTER 后跟給定列名的方式,指示新列應(yīng)該放到給定列名的后面。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;# 標(biāo)識(shí)符 FIRST 和 AFTER 只能和 ADD 子句一起使用。這也意味著,如果要重新定位一列,就必須先用 DROP # 刪除它,然后再用 ADD 將它添加到新的位置。
更改數(shù)據(jù)類(lèi)型,把列 c 從 CHAR(1) 變?yōu)?CHAR(10):ALTER TABLE testalter_tbl MODIFY c CHAR(10);# CHANGE 的語(yǔ)法稍有不同。必須把所要改變的列名放到 CHANGE 關(guān)鍵字的后面然后指定新的列定義ALTER TABLE testalter_tbl CHANGE 原列名 新列名 列定義;# 如果想利用 CHANGE 將 j 從 BIGINT 轉(zhuǎn)為 INT,并且不改變列名,則語(yǔ)句如下:ALTER TABLE testalter_tbl CHANGE j j INT;
在利用 MODIFY 或 CHANGE 修改列時(shí),還可以指定該列是否能有 NULL 值,以及它的默認(rèn)值。如果我們不這樣處理,MySQL 會(huì)自動(dòng)為這些屬性指定相關(guān)值。
# NOT NULL 列默認(rèn)值為100:MODIFY j BIGINT NOT NULL DEFAULT 100;# 使用 ALTER 命令可以改變?nèi)魏瘟械哪J(rèn)值A(chǔ)LTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;# 使用 DROP 子句與 ALTER 命令,可以去除任何列中的默認(rèn)限制ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
結(jié)合使用 TYPE 子句與 ALTER 命令,可以使用表類(lèi)型
ALTER TABLE testalter_tbl TYPE = MYISAM;
使用 ALTER TABLE 語(yǔ)句的 RENAME 選項(xiàng)可以對(duì)表進(jìn)行重命名
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
可以為表創(chuàng)建唯一索引,唯一索引要求任意兩行的索引值不能相同
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);# 可以使用一或多個(gè)列來(lái)創(chuàng)建索引CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author)# 降序在列中索引數(shù)值,可以在列名后添加保留字 DESC(Descending)CREATE UNIQUE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)
為表添加索引,可以采用4種語(yǔ)句
# 該語(yǔ)句添加一個(gè)主鍵。意味著索引值必須是唯一的,不能為 NULLALTER TABLE tbl_name ADD PRIMARY KEY (column_list)# 該語(yǔ)句為必須唯一的值(除了 NULL 值之外,NULL 值可以多次出現(xiàn))ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)# 語(yǔ)句為可能多次出現(xiàn)的值創(chuàng)建一般索引ALTER TABLE tbl_name ADD INDEX index_name (column_list)# 語(yǔ)句創(chuàng)建專(zhuān)用于文本搜索的 FULLTEXT 索引ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
為現(xiàn)有表添加索引
ALTER TABLE testalter_tbl ADD INDEX (c);# 可以使用 DROP 子句以及 ALTER 命令刪除索引ALTER TABLE testalter_tbl DROP INDEX (c);
添加主鍵也采用類(lèi)似方式,但要保證主鍵一定在列上,是 NOT NULL
# 在現(xiàn)有表中添加主鍵,先使列為 NOT NULL,然后再將其作為主鍵ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);# 刪除一個(gè)主鍵ALTER TABLE testalter_tbl DROP PRIMARY KEY;
# 先創(chuàng)建一個(gè)表,然后插入一些行,不需要提供記錄ID,因?yàn)檫@是由 MySQL 自動(dòng)增加的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");
如果一定要對(duì) AUTO_INCREMENT 列進(jìn)行重新排序,那么正確的方式是將該列從表中刪除,然后再添加它。下面這個(gè)范例中就用了這個(gè)技巧,在 insect 表中對(duì) id 值重新排序。
ALTER TABLE insect DROP id;ALTER TABLE insectADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARY KEY (id);
MySQL 默認(rèn)以 1 作為序列初始值,但你也可以在創(chuàng)建表時(shí)指定其他的數(shù)字,以 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 );
可以在表中正確的字段內(nèi)使用 PRIMARY KEY 或 UNIQUE 索引來(lái)終止重復(fù)記錄。比如下面這張表,由于沒(méi)有這樣的索引或主鍵,因此 first_name與last_name 就被重復(fù)記錄了下來(lái)。
CREATE TABLE person_tbl (first_name CHAR(20),last_name CHAR(20),sex CHAR(10) );
為了防止表中出現(xiàn)同樣姓名的值,為其添加一個(gè) PRIMARY KEY。同時(shí)要注意將索引列聲明為 NOT NULL,這是因?yàn)?PRIMARY KEY 不允許出現(xiàn)空值
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。如果該記錄與現(xiàn)存的某個(gè)記錄重復(fù),IGNORE 關(guān)鍵字就會(huì)讓 MySQL 默默地將其摒棄,不會(huì)產(chǎn)生任何錯(cuò)誤。
# 下面這個(gè)范例不會(huì)產(chǎn)生任何錯(cuò)誤,不會(huì)插入會(huì)產(chǎn)生重復(fù)的記錄。INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES ( "Jay", "Thomas");# 使用 **REPLACE** 而不是 INSERT。如果是一個(gè)重復(fù)記錄,新的記錄將會(huì)替換舊有記錄。REPLACE INTO person_tbl (last_name, first_name) VALUES ( "Ajay", "Kumar");
強(qiáng)制唯一性的另一種辦法是為表添加 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) );
# 下面是計(jì)算表中姓名記錄重復(fù)的查詢:SELECT COUNT(*) as repetitions, last_name, first_nameFROM person_tbl GROUP BY last_name, first_nameHAVING repetitions > 1;
該查詢返回表 person_tbl 中所有的重復(fù)記錄。一般來(lái)說(shuō),要想確認(rèn)重復(fù)記錄,需要采取以下步驟:
使用DISTINCT(獨(dú)的) 和 SELECT 語(yǔ)句來(lái)查找表中的重復(fù)記錄。
SELECT DISTINCT last_name, first_nameFROM person_tblORDER BY last_name;
另一種辦法是添加 GROUP BY 子句,命名選擇的列。消除重復(fù)記錄并只選擇指定列中的唯一值組合。
SELECT last_name, first_nameFROM person_tblGROUP BY (last_name, first_name);
下面這種技巧也可以消除表中存在的所有重復(fù)記錄。
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 。即使該表已經(jīng)存在,你也可以利用這種技巧消除重復(fù)記錄,這種做法將來(lái)也依然保險(xiǎn)。
ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);
?今天是堅(jiān)持刷題更文的第49/100天
?各位的點(diǎn)贊、關(guān)注、收藏、評(píng)論、訂閱就是一條創(chuàng)作的最大動(dòng)力
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/119413.html
摘要:今天,一條就帶大家徹底跨過(guò)排序算法這道坎,保姆級(jí)教程建議收藏。利用遞歸算法,對(duì)分治后的子數(shù)組進(jìn)行排序。基本思想堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為,它也是不穩(wěn)定排序。 ...
摘要:標(biāo)簽不區(qū)分大小寫(xiě),但推薦小寫(xiě)。標(biāo)簽可以嵌套,但不能交叉嵌套。標(biāo)簽也稱為元素。比如行內(nèi)標(biāo)簽亦可成行內(nèi)元素。 ??HTML必備知識(shí)詳解?? 第一部分:HTML框架簡(jiǎn)介...
摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...
閱讀 3407·2023-04-25 20:37
閱讀 3149·2021-09-07 09:59
閱讀 1673·2019-08-29 12:43
閱讀 1193·2019-08-28 18:27
閱讀 486·2019-08-26 13:50
閱讀 2037·2019-08-26 10:33
閱讀 3600·2019-08-23 18:39
閱讀 2404·2019-08-23 18:09