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

資訊專(zhuān)欄INFORMATION COLUMN

大廠面試預(yù)備篇——《兩萬(wàn)字MySql基礎(chǔ)總結(jié)》??建議收藏

dreamtecher / 3148人閱讀

?? 一條獨(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ī)矩——一鍵三連

文章目錄


?? MySql不區(qū)分大小寫(xiě),但是很多人愿意對(duì)重要語(yǔ)句用大寫(xiě),用表名等用小寫(xiě),便于閱讀

數(shù)據(jù)庫(kù)

選擇數(shù)據(jù)庫(kù)

USE name;

顯示可用數(shù)據(jù)庫(kù)

SHOW DATABASES;

顯示可用表

SHOW TABLES;

獲取表的一個(gè)列

SHOW COLUMNS FROM yitiao_coding;

數(shù)據(jù)類(lèi)型

數(shù)值類(lèi)型

  • 整數(shù)類(lèi)型:tinyint smallint mediumint int bigint
  • 浮點(diǎn)類(lèi)型:float double
  • 定點(diǎn)小數(shù)類(lèi)型:decimal

日期類(lèi)型

year time date datetime timestamp

字符串類(lèi)型

  • 文本字符串:char varchar tinytext text mediumtext longtext enum set
  • 二進(jìn)制字符串:bit binary tinyblob blog mediumblob longblob

創(chuàng)建表

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

復(fù)制表

可以采用如下步驟來(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ǔ)句。

查找數(shù)據(jù)

查找列

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

查找多個(gè)列

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;

執(zhí)行順序

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

選擇查詢

WHERE子句操作符

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

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;

IN指定條件范圍

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

NOT & NOT IN

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;

模糊查詢

LIKE子句+通配符 %

%表示任何字符串出現(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á)式

正則表達(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;

OR的匹配

# 查找列yitiao_coding包含文本1000,2000的行SELECT yitiao_coding, yitiao_priceFROM yitiaoWHERE yitiao_coding REGEXP "1000|2000"ORDER BY yitiao_coding;

匹配幾個(gè)字符之一

# 匹配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 縱向制表

重復(fù)元字符

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

文本數(shù)值時(shí)間計(jì)算處理

Concat() 拼接

將值聯(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;

Upper()轉(zhuǎn)為大寫(xiě),Lower()轉(zhuǎn)為小寫(xiě)

SELECT vend_name, Upper(vend_name) AS vend_name_upcaseFROM vendorsORDER BY vend_name;

日期和時(shí)間處理函數(shù)

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í)間

查找一個(gè)特定日期的訂單

SELECT yitiao_id, yitiao_codingFROM yitiaoWHERE Date(order_date) = "2020-09-02"ORDER BY yitiao_coding;

查找特定的時(shí)間段

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;

算數(shù)計(jì)算

# 查找訂單號(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;

數(shù)值處理函數(shù)

Abs() 返回一個(gè)數(shù)的絕對(duì)值,Sqrt() 返回一個(gè)數(shù)的平方根, Rand() 返回一個(gè)隨機(jī)數(shù),Pi() 返回圓周率Exp(),返回一個(gè)數(shù)的指數(shù)值,Mod() 返回除操作的余數(shù),Cos() 返回一個(gè)角度的余弦值 Sin() 返回一個(gè)角度的正弦值,Tan() 返回一個(gè)角度的正切值

數(shù)據(jù)處理

AVG() 平均值

# 求產(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() 計(jì)數(shù)

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;

SUM() 求和

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

SELECT COUNT(*) AS item_numMIN(yitiao_price) AS min_priceMAX(yitiao_price) AS max_priceAVG(yitiao_price) AS avg_priceFROM yitiao;

分組

創(chuàng)建分組

# 不同供應(yīng)商包含的產(chǎn)品計(jì)數(shù)并分組SELECT yitiao_id, COUNT(*) AS yitiao_numFROM yitiaoGROUP BY yitiao_id;

過(guò)濾分組,

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;

語(yǔ)法順序

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT

子查詢

利用子查詢過(guò)濾

在幾個(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"));

聯(lián)結(jié)表

創(chuàng)建聯(lián)結(jié) JOIN

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

聯(lián)結(jié)多個(gè)表

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ò)濾作用

自聯(lián)結(jié)

# 先找到物品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";**

自然聯(lián)結(jié)

關(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";

外部聯(lián)結(jié)

# 為了查找所有客戶的下單數(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;

使用帶聚集函數(shù)的聯(lián)結(jié)

# 內(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;

更新數(shù)據(jù)

更新查詢Update

UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]# 把李四的地址改為上海(默認(rèn)Beijing)Update employee set city = "Shanghai" where id = 2;

更改表結(jié)構(gòu)

# 在表employee增加一列addrAlter table employee **add** colunm addr varchar(40);

更新表名

Rename Table 表名 to 新表名;

Alter選擇

刪除、添加列或?qū)ζ渲匦露ㄎ?/h3>
# 從表中刪除 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)型

更改數(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;

ALTER TABLE 對(duì) Null 及默認(rèn)值屬性的作用

在利用 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;

改變表類(lèi)型

結(jié)合使用 TYPE 子句與 ALTER 命令,可以使用表類(lèi)型

ALTER TABLE testalter_tbl TYPE = MYISAM;

對(duì)表進(jìn)行重命名

使用 ALTER TABLE 語(yǔ)句的 RENAME 選項(xiàng)可以對(duì)表進(jìn)行重命名

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

Index索引

簡(jiǎn)單而唯一的索引

可以為表創(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)

添加與刪除 INDEX 的ALTER 命令

為表添加索引,可以采用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);

利用 ALTER 命令來(lái)添加與刪除主鍵

添加主鍵也采用類(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;

序列

使用 AUTO_INCREMENT 列

# 先創(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ì)已有序列進(jìn)行重新編號(hào)

如果一定要對(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 );

重復(fù)處理

防止表中出現(xiàn)重復(fù)記錄

可以在表中正確的字段內(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) );

確認(rèn)重復(fù)記錄,并計(jì)算重復(fù)記錄數(shù)

# 下面是計(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ù)記錄,需要采取以下步驟:

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

從查詢結(jié)果中消除重復(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ù)記錄

下面這種技巧也可以消除表中存在的所有重復(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ān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<