1 安裝MySQL
進(jìn)入MySQL官網(wǎng)春畔,登錄
如何在Macbook上安裝MySQL_百度經(jīng)驗(yàn)
我之后改了個(gè)狈邑,怕忘記 先把原始的放上去,哈哈
安裝好之后碘菜,啟動(dòng)的時(shí)候發(fā)現(xiàn)總是啟動(dòng)不了凹蜈,原因是端口被占用了,所以導(dǎo)致無法啟動(dòng)MySQL
查看端口占用命令 sudo losf -i : 3306
冒號(hào)后是你的端口號(hào)
MySQL常用端口就是3306忍啸,發(fā)現(xiàn)被占用了 仰坦,應(yīng)該是上一個(gè)沒有卸載干凈的MySQL
用命令 sudo kill -9 8593 (8593是占用端口的PID值)
把端口程序殺死之后 發(fā)現(xiàn)能順利啟動(dòng)了。
啟動(dòng)后
2 MySQL卸載
執(zhí)行下列命令
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
rm -rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*
其實(shí)不同的安裝方式有些東西的存儲(chǔ)位置不一樣计雌,刪除完檢查一下下面這些文件是否刪除了悄晃,沒有的話則刪除掉:
/usr/local/Cellar 里的mysql文件
/usr/local/var 里的mysql文件
/cd tmp 里的mysql.sock, mysql.sock.lock, my.cnf文件
pid文件和err文件都在/usr/local/var/mysql里確保刪除了
brew安裝的安裝包存儲(chǔ)在/usr/local/Library/Cache/Homebrew也可以一并刪除
執(zhí)行brew cleanup
執(zhí)行完基本就卸載干凈了,可以從新安裝了
最后終于進(jìn)來了凿滤,快哭了
3 導(dǎo)入數(shù)據(jù)庫
下載數(shù)據(jù)包到桌面
然后啟動(dòng)本地MySQL
mysql -u root -p
輸入自己設(shè)置的密碼(123)
就啟動(dòng)了
然后倒入數(shù)據(jù)庫妈橄,先要?jiǎng)?chuàng)建數(shù)據(jù)庫
mysql>CREATE DATABASE IF NOT EXISTS yibaidb?DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
mysql> use yiibaidb;
然后是導(dǎo)入數(shù)據(jù)庫
mysql> use yiibaidb;
mysql> source /Users/qiaoye/Desktop/yiibaidb.sql;
然后他就自己在哪里導(dǎo)入了鼠渺,等到結(jié)束后我們來測(cè)試下我們導(dǎo)入的數(shù)據(jù)庫;
mysql> select city,phone,country from `offices`;
4 學(xué)習(xí)查詢語句
????使用select語句從表中或者視圖中獲取數(shù)據(jù)眷细,表由行和列組成,如電子表格鹃祖。通常溪椎,我們只希望看到子集行,子集列恬口,或者兩者的組合校读。select是結(jié)果集,它是由行列表祖能,每行由相同的數(shù)目組成歉秫。
? ? yibaidb中的employees表的結(jié)構(gòu)。它是8列:?jiǎn)T工人數(shù)养铸,姓氏雁芙,名字,分機(jī)钞螟,電子郵件兔甘,辦公室代碼,報(bào)告鳞滨,職位洞焙。
? ? select語句控制要查那些行和列,例如拯啦,如果只對(duì)員工的名字和姓氏感興趣澡匪,或者只想查看某位員工信息,select都可以幫助執(zhí)行操作褒链。
SELECT語句有以下語法:
????SELECT之后是逗號(hào)分隔列或星號(hào)(*)的列表唁情,表示要返回所有列。
? ? FROM指定要查詢數(shù)據(jù)的表或者視圖碱蒙;
? ? JOIN根據(jù)某些連接條件從其他表中獲取數(shù)據(jù)荠瘪;
? ? WHERE過濾結(jié)果集中的行;
? ? GROUP BY 將一組行組成小分組赛惩,并對(duì)每個(gè)小分組應(yīng)用聚合函數(shù)哀墓。
? ? HAVING過濾器基于GROUP BY子句定義的小分組;
? ? ORDER BY指定用于排序的列的列表喷兼;
? ? LIMIT限制返回行的數(shù)量篮绰;
語句中的SELECT 和 FROM 語句是必須的,其他部分都是可選的季惯;
SELECT 語句允許通過在SELECT子句中指定逗號(hào)分隔列的列表來查詢表的部分?jǐn)?shù)據(jù)吠各。例如臀突,僅要查看員工的名字,姓氏和職位贾漏,使用以下查詢:
SELECT?
? ? lastname,firstname,jobtitle;
FROM
? ? employees;
即使員工表中有很多列候学,SELECT也只會(huì)返回表中的所有行的三列數(shù)據(jù)
比較下列返回的區(qū)別:
SELECT * FROM employees;
如果要獲取employees中所有行的數(shù)據(jù),可以列出SELECT子句中的所有列名纵散,或者只需使用(*)表示您想從表的所有列獲取數(shù)據(jù)梳码,如下查詢:
他返回了employee的所有列和行。應(yīng)該使用(*)進(jìn)行測(cè)試伍掀。建議顯示獲取數(shù)據(jù)的列掰茶,原因如下:????
? ? 1 使用星號(hào)(*)可能會(huì)返回不使用的列的數(shù)據(jù)。它在MySQL數(shù)據(jù)庫服務(wù)器和應(yīng)用程序之間產(chǎn)生不必要的I/O磁盤和網(wǎng)絡(luò)流量蜜笤。
? ? 2 如果明確指定列濒蒋,則結(jié)果集更可預(yù)測(cè)并且更易于管理。想象一下把兔,當(dāng)您使用星號(hào)(*)并且有人通過添加更多列更改表格數(shù)據(jù)時(shí)沪伙,將會(huì)得到一個(gè)與預(yù)期結(jié)果不同的結(jié)果集;
? ? 3 使用星號(hào)(*)可能會(huì)將敏感信息暴露給未經(jīng)授權(quán)的用戶县好;
去重語法
去重語法:SELECT DISTINCT? [COLUMN_NAME]? FROM [TABLE_NAME]
來看看去重后結(jié)果:
注意:
(1)DISTINCT 等關(guān)鍵字建議使用大寫焰坪,其他的表名建議用小寫,便于區(qū)分聘惦;
(2)DISTINCT關(guān)鍵字要在去重列名之前某饰;
查詢前N條語句
mysql查詢前10條語句:SELECT * FROM table_name limit 0,10;
case .... end
case函數(shù)有兩種格式,
簡(jiǎn)單case函數(shù):
CASE sex?
? ? WHEN '1' THEN '男'
? ? WHEN ‘2’ THEN ‘女’
ELSE '其他' END
case 搜索函數(shù):
CASE WHEN sex = '1' THEN '男'
? ? ? ? ? ?WHEN sex = '2' THEN '女'
ELSE '其他' END
這兩種方式善绎,可以實(shí)現(xiàn)相同的功能黔漂。簡(jiǎn)單Case函數(shù)的寫法相對(duì)比較簡(jiǎn)潔,但是和Case搜索函數(shù)相比禀酱,功能方面會(huì)有些限制炬守,比如寫判斷式。?
還有一個(gè)需要注意的問題剂跟,Case函數(shù)只返回第一個(gè)符合條件的值减途,剩下的Case部分將會(huì)被自動(dòng)忽略。?
篩選語句 where
如果使用SELECT語句曹洽,但不使用WHERE子句在表中查詢鳍置,則會(huì)獲取表中的所有數(shù)據(jù),這些記錄大部分是不想要的記錄送淆。
WHERE語句允許根據(jù)指定的過濾表達(dá)式或條件來指定要選擇的行税产。
假設(shè)只想從employees中獲取銷售代表員工,可以使用以下查詢:
SELECT?
? ? lastname,firstname,jobtitle
FROM?
? ? employees
WHERE
? ? jobtitle = 'Sales Rep'
執(zhí)行后得到以下結(jié)果
????即使WHERE子句出現(xiàn)在語句的句尾,但MySQL會(huì)首先使用WHERE子句的表達(dá)式來選擇匹配的行辟拷,他選擇具有職位名稱為銷售代表的記錄撞羽。
例如,要在辦公室代碼(officeCode)等于1中查找所有銷售代表衫冻,請(qǐng)使用以下查詢:
SELECT lastname,firstname,jobtitle FROM employees WHERE jobtitle='Sales Rep' AND officeCode='1';
WHERE操作符
=? ?幾乎任何數(shù)據(jù)類型都可以用它
<> 或 !=? 不等于
<? ? 小于诀紊,通常使用數(shù)字和日期/時(shí)間數(shù)據(jù)類型
>? ? ? 大于
<=? ? ?小于或等于
>=? ? ?大于或等于
以下查詢使用不等于(!=)運(yùn)算符來獲取不是銷售代表的其它所有員工:
SELECT lastname,firstname,jobtitle FROM employees WHERE jobtitle <> 'Sales Rep';
以下查詢將獲得辦公室代碼大于5的每位員工:
辦公室代碼小于或等于4(<= 4)的員工呢?
通配符是進(jìn)行模糊查詢的時(shí)候用到的
% : LIKE '****%'? (***指的是已知的模糊的文本)
_:? LIKE '***_'?(***指的是已知的模糊的文本)
用通配符_時(shí)隅俘,為單字符匹配渡紫,要注意空格:
5. 分組語句 GROUP BY
作用:GROUP BY 語句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。會(huì)把值相同放到一個(gè)組中考赛,最終查詢出的結(jié)果只會(huì)顯示組中一條記錄。
1)基本用法:?
根據(jù)?sex?字段分組莉测,查詢用戶名颜骤、年齡、電話捣卤、性別忍抽。?
這就分組成功了!男的一組 女的一組董朝,還有一組那啥鸠项,咳咳,搞不清楚的子姜,但是都只顯示了組中一條記錄祟绊,我們的效果不夠明顯,接著看下面的例子哥捕。)
2)GROUP BY 語句中的GROUP_CONCAT()函數(shù)
根據(jù)sex 字段進(jìn)行分組并查看username字段和age字段的詳細(xì)信息牧抽。(這下對(duì)基本用法就很好理解了。因?yàn)樗J(rèn)只顯示了組中一條記錄遥赚,如果想看組內(nèi)所以的用戶信息扬舒,就需要用到GROUP_CONCAT()函數(shù)。接著往下↓)
SELECT GROUP_CONCAT(username),GROUP_CONCAT(age),sex FROM testusers GROUPBY sex;
3)COUNT()函數(shù):統(tǒng)計(jì)記錄總數(shù)
根據(jù)sex 字段分組凫佛,查詢性別和用戶名讲坎,年齡的詳細(xì)信息并統(tǒng)計(jì)各組用戶數(shù)量。
(查出來記錄以后自己數(shù)愧薛?太萌了吧晨炕?利用COUNT()函數(shù)統(tǒng)計(jì)記錄總數(shù)。當(dāng)然細(xì)心的兄dei已經(jīng)發(fā)現(xiàn)問題了毫炉,為什么只有三個(gè)男的府瞄,COUNT()函數(shù)統(tǒng)計(jì)出來四個(gè)?[難道有兩根?!] ,咳咳遵馆,是因?yàn)樵贑OUNT()函數(shù)中鲸郊,寫COUNT(*)會(huì)統(tǒng)計(jì)我們表中的NULL值,如果不想統(tǒng)計(jì)NULL值货邓,請(qǐng)寫COUNT(字段名)秆撮。看我們上面的表中换况,最后一條記錄的username是NULL,所以只有三個(gè)男的卻統(tǒng)計(jì)出四根diao.呸职辨,統(tǒng)計(jì)出四個(gè)男生。PS:代碼段中AS xxx=取別名)
SELECT COUNT(*) AS totalUsers, GROUP_CONCAT(username) AS userDetail ,GROUP_CONCAT(age) AS userAge,sex FROM testusers GROUP BY sex;
4)加WHERE條件?
在年齡大于等于18的范圍內(nèi)戈二,根據(jù)sex分組舒裤,查詢性別和用戶名、年齡的詳細(xì)信息并統(tǒng)計(jì)各組用戶數(shù)量
5)聚合函數(shù)[‘SUM()求和函數(shù)’,’MAX()函數(shù):求最大值’,’MIN()函數(shù):求最小值’,’AVG()函數(shù):求平均值’]觉吭。一個(gè)例子整合運(yùn)用(計(jì)算每組用戶薪水的各項(xiàng)值)腾供。
SELECT COUNT(*) AS totalUsers,GROUP_CONCAT(username) AS userDetail,sex, SUM(salary) AS sum_salary,MAX(salary) AS max_salary,MAX(salary) AS max_salary,MIN(salary) AS min_salary,AVG(salary) AS avg_salary FROM testusers GROUP BY sex;
6):HAVING?子句:對(duì)分組結(jié)果進(jìn)行二次篩選?
根據(jù)性別分組,查詢性別和用戶名鲜滩,年齡的詳細(xì)信息并統(tǒng)計(jì)各組用戶總數(shù)伴鳖,得出結(jié)果后進(jìn)行二次篩選出用戶總數(shù)在5人及以上的組。相當(dāng)于WHERE是一次篩選徙硅,HAVING是在二/再次篩選.
SELECT COUNT(*) AS totalUsers,GROUP_CONCAT(age) AS userAge,GROUP_CONCAT(username) AS userDetail,sex FROM testusers GROUP BY sex HAVING totalUsers>=5;
6. 排序語句 ORDER BY?
SELECT field1, field2,...fieldN table_name1, table_name2...ORDER BY field1, [field2...] [ASC [DESC]]
ASC 是升序
DESC 是降序
7. 函數(shù)? ? 時(shí)間函數(shù) ? ? 數(shù)值函數(shù) ? ? 字符串函數(shù)
列舉了詳細(xì)的函數(shù)說明
8. SQL注釋
1 單行注釋可以用“#”
2 多行注釋可以用/**/
項(xiàng)目一:查找重復(fù)的電子郵箱
CREATE TABLE email (ID INT NOT NULL PRIMARY KEY, Email VARCHAR(255)); %創(chuàng)建表格
INSERT INTO email VALUES('1','a@b.com'); %輸入表格內(nèi)容
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
SELECT Email %查找步驟
FROM email
GROUP BY email having count (Email)>1;
項(xiàng)目二:查找大國(guó)
CREATE TABLE World( %創(chuàng)建表格
country VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World %輸入表格內(nèi)容
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);
SELECT country,populaiton,area %查找步驟
FROM World
WHERE area>3000000 or population>25000000;
MySQL表操作
1 MySQL表數(shù)據(jù)類型
MySQL支出多種類型榜聂,大致分為三類,數(shù)值嗓蘑,日期/時(shí)間 和 字符串類型
數(shù)值類型
MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類型须肆。
這些數(shù)值包括嚴(yán)格數(shù)值數(shù)據(jù)類型(INTGER、SMALLINT桩皿、DECIMAL和NUMERIC)以及近似數(shù)值類型(FLOAT休吠、REAL、DOUBLE业簿、PRECISION)
日期和時(shí)間
表示時(shí)間值的日期和時(shí)間類型為DATATIME DATA TIMESTAMP TIME和YEAR
表示時(shí)間類型有一個(gè)有效范圍和一個(gè)零值瘤礁,當(dāng)指定不合法的MySQL不能表示的值時(shí)使用‘零’值。
字符串類型
字符串類型是指CHAR梅尤、VARCHAR柜思、BINARY、VARBINARY巷燥、BLOB赡盘、TEXT、ENUM和 SET缰揪,該節(jié)描述了這些類型如何工作以及在如何在查詢中使用這些類型
MySQL主鍵
表中每一行都應(yīng)該有可以唯一標(biāo)識(shí)自己的一列(或一組列)陨享。
一個(gè)顧客可以使用顧客編號(hào)列葱淳,而訂單可以使用訂單ID
主鍵(primary Key)一列(或一組列)其值可以能夠唯一區(qū)分表中的每一行。
唯一標(biāo)識(shí)表中每行的這個(gè)列(或這個(gè)組列)稱為主鍵抛姑,沒有主鍵赞厕,更行或者刪除表中的特定行將變得較為困難,因?yàn)闆]有安全的方法保證只涉及相關(guān)的行定硝。
雖然并不是總是需要主鍵皿桑,但是大多是數(shù)據(jù)庫設(shè)計(jì)人員都應(yīng)該保證他們創(chuàng)建的每個(gè)表有一個(gè)主鍵,以便于數(shù)據(jù)的操作和管理蔬啡。
表中的任何列都可以作為主鍵诲侮,只要滿足以下兩個(gè)條件:
1 任何兩行都不具有相同的主鍵值
2 每行都必須有一個(gè)主鍵值
主鍵的最好習(xí)慣:
除了強(qiáng)制要求的,還應(yīng)該保持幾個(gè)好習(xí)慣為:
1 不更新主鍵列的值
2 不重用主鍵列的值
3 不在主鍵中使用可能會(huì)更改的值
總之不應(yīng)該使用一個(gè)具有實(shí)際意義的id作為主鍵箱蟆,并且一個(gè)表必須有一個(gè)主鍵沟绪,為方便擴(kuò)展,松耦合空猜,高可用的系統(tǒng)做鋪墊绽慈。
MySQL創(chuàng)建數(shù)據(jù)表
創(chuàng)建MySQL數(shù)據(jù)表需要以下信息
1 表名?
2 表字段名
3 定義每個(gè)表字段
以下為創(chuàng)建數(shù)據(jù)表的SQL通用語法:
CREAT TABLE table_name (column_name column_type);
以下例子
CREATE TABLE IF NOT EXISTS `courses`(`student_id` INT UNSIGNED AUTO_INCREMENT,`student` VARCHAR(100) NOT NULL,`class` VARCHAR(100) NOT NULL,PRIMARY KEY(student_id));
創(chuàng)建表之前要先依賴數(shù)據(jù)庫 才可以建表;
1 如果你不想字段為?NULL?可以設(shè)置字段的屬性為?NOT NULL抄肖, 在操作數(shù)據(jù)庫時(shí)如果輸入該字段的數(shù)據(jù)為NULL?,就會(huì)報(bào)錯(cuò)窖杀。
2 AUTO_INCREMENT定義列為自增的屬性漓摩,一般用于主鍵,數(shù)值會(huì)自動(dòng)加1入客。
3 PRIMARY KEY關(guān)鍵字用于定義列為主鍵管毙。 您可以使用多列來定義主鍵,列間以逗號(hào)分隔桌硫。
4 ENGINE 設(shè)置存儲(chǔ)引擎夭咬,CHARSET 設(shè)置編碼。
存儲(chǔ)引擎有3重:InnoDB? MyISAM? MEMORY
InnoDB:支持事務(wù)處理铆隘,支持外鍵卓舵,支持崩潰修復(fù)能力和并發(fā)控制。如果需要對(duì)事務(wù)的完整性要求比較高(比如銀行)膀钠,要求實(shí)現(xiàn)并發(fā)控制(比如售票)掏湾,那選擇InnoDB有很大的優(yōu)勢(shì)。如果需要頻繁的更新肿嘲、刪除操作的數(shù)據(jù)庫融击,也可以選擇InnoDB,因?yàn)橹С质聞?wù)的提交(commit)和回滾(rollback)雳窟。?
MyISAM:插入數(shù)據(jù)快尊浪,空間和內(nèi)存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實(shí)現(xiàn)處理高效率拇涤。如果應(yīng)用的完整性捣作、并發(fā)性要求比 較低,也可以使用工育。
MEMORY:所有的數(shù)據(jù)都在內(nèi)存中虾宇,數(shù)據(jù)的處理速度快,但是安全性不高如绸。如果需要很快的讀寫速度嘱朽,對(duì)數(shù)據(jù)的安全性要求較低,可以選擇MEMOEY怔接。它對(duì)表的大小有要求搪泳,不能建立太大的表。所以扼脐,這類數(shù)據(jù)庫只使用在相對(duì)較小的數(shù)據(jù)庫表岸军。
用SQL向表中添加數(shù)據(jù):
MySQL表中使用INSERT INTO SQL 來添加數(shù)據(jù):
INSERT INTO table_name (field1,field2....fieldN)
? ? ? ? ? ? ? ? ? ? ? ? ? ?VALUES(value1,value2....valueN);
如果數(shù)據(jù)是字符型的,必須使用單引號(hào)或者雙引號(hào)如 "value"
一次性插入多個(gè)
// 一次性插入多個(gè)
$ insert into tab_name (col_1, col_2) values
('value_1a', 'value_1b'),
('value_2a', 'value_2b');
//插入時(shí)有主鍵沖突瓦侮,改為更新操作
insert into tab_name (id, col_1, col_2) values
(13, 'value_1', 'value_2')
on duplicate key update
col_1 = 'value_1', col_2 = 'value_2'
// 將查詢結(jié)果插入到數(shù)據(jù)(不應(yīng)該出現(xiàn)在真實(shí)項(xiàng)目里艰赞,因?yàn)榛鶖?shù)大時(shí),會(huì)增加大量數(shù)據(jù))
$ insert into tab_name (col_1, col_2) select col_1, col_2 from tab_name2
// 字段數(shù)和格式相同肚吏,才能講不通字段名的插入
insert into tab_name (col_1, col_2) select col_3, col_4 from tab_name3
// 沖突替換方妖,否則插入
replace into teacher values
(1, 'value_1', 'value_2', 'value_3')
// 導(dǎo)入數(shù)據(jù)(使用outfile導(dǎo)出的數(shù)據(jù),避免導(dǎo)入時(shí)主鍵沖突罚攀,應(yīng)為null)
// 也支持?jǐn)?shù)據(jù)格式設(shè)置党觅,同outfile
$ load data infile 'path' into tab_name;
插入數(shù)據(jù)
mysql> INSERT INTO courses(student,class) value ("A","math");
這是插入一行數(shù)據(jù)之后的表格;
插入完畢斋泄,現(xiàn)在尋找大于5節(jié)的課程杯瞻。
mysql> select class? from courses group by class having count(*)>=5;
首先選擇了class,并按照這列進(jìn)行分組炫掐,把組別大于5選擇出來魁莉,里邊有2次選擇,having count募胃。
4 用SQL語句刪除表
MySQL中刪除數(shù)據(jù)表是非常容易操作的沛厨, 但是你再進(jìn)行刪除表操作時(shí)要非常小心,因?yàn)閳?zhí)行刪除命令后所有數(shù)據(jù)都會(huì)消失摔认。
DROP TABLE table_name ;
刪除表內(nèi)數(shù)據(jù)用 delete 格式為:
delete from 表名 where 刪除條件;
實(shí)例:刪除學(xué)生表內(nèi)姓名為張三的記錄逆皮。
delete from student where T_name = "張三";
清除表內(nèi)數(shù)據(jù),但是保留表結(jié)構(gòu)用truncate参袱。格式為:
truncate table "表名"电谣;
實(shí)例:清除學(xué)生表內(nèi)的所有數(shù)據(jù)秽梅。
truncate table "student";
1 當(dāng)你不在需要該表的時(shí)候,用drop剿牺;
2 當(dāng)你仍要保留該表企垦,但是要?jiǎng)h除所以記錄的時(shí)候,用truncate晒来;
3 當(dāng)你要?jiǎng)h除部分記錄的時(shí)候钞诡,用delete;
5 用SQL語句修改表
當(dāng)我們需要修改數(shù)據(jù)表名或者修改數(shù)據(jù)表字段時(shí)湃崩,就需要使用到MySQL ALTER命令荧降。
刪除,添加或修改表字段
如下命令使用了 ALTER 命令及 DROP 子句來刪除以上創(chuàng)建表的 i 字段:
mysql> ALTER TABLE testalter_tbl DROP i;
如果數(shù)據(jù)表中只剩余一個(gè)字段則無法使用DROP來刪除字段攒读。
MySQL 中使用 ADD 子句來向數(shù)據(jù)表中添加列朵诫,如下實(shí)例在表 testalter_tbl 中添加 i 字段,并定義數(shù)據(jù)類型:
mysql> ALTER TABLE testalter_tbl ADD i INT;
執(zhí)行以上命令后薄扁,i 字段會(huì)自動(dòng)添加到數(shù)據(jù)表字段的末尾剪返。
如果你需要指定新增字段的位置,可以使用MySQL提供的關(guān)鍵字FIRST(設(shè)定為第一列)AFTER字段名(設(shè)定位于某個(gè)字段之后)邓梅。
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;
修改字段類型及名稱
如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 脱盲。
例如,把字段 c 的類型從 CHAR(1) 改為 CHAR(10)日缨,可以執(zhí)行以下命令:
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 語法有很大的不同钱反。 在 CHANGE 關(guān)鍵字之后,緊跟著的是你要修改的字段名殿遂,然后指定新字段名及類型诈铛。嘗試如下實(shí)例:
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
ALTER TABLE testalter_tbl CAHNGE j j INT;
ALTER TABLE 對(duì) Null 值和默認(rèn)值的影響
當(dāng)你修改字段的時(shí)候乙各,你可以指定是否包含值或者是否設(shè)置為默認(rèn)值墨礁。
以下實(shí)例随珠,指定字段j為NOT NULL 且默認(rèn)值為 100伞访;
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
如果不設(shè)置默認(rèn)值,MySQL會(huì)自動(dòng)設(shè)置該字段為NULL
修改表名
嘗試以下實(shí)例將數(shù)據(jù)表 testalter_tbl 重命名為 alter_tbl:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
添加列:
ALTER TABLE 表名 ADD COLUMN 列名 VARCHAR(30);
刪除列:
ALTER TABLE 表名 DROP COLUMN 列名沛善;
項(xiàng)目四 :交換工資
創(chuàng)建一個(gè)salary表
mysql> CREATE TABLE IF NOT EXISTS `salary`(`id` INT UNSIGNED AUTO_INCREMENT,`name` VARCHAR(100) NOT NULL,`sex` VARCHAR(100) NOT NULL,`salary` VARCHAR(100) NOT NULL,PRIMARY KEY(id));
mysql> INSERT INTO salary (name,sex,salary) value ("A","m","2500");
........
交換f 和 m? 的值
?UPDATE salary SET sex=CASE sex?
? ? -> WHEN "f" THEN "m"
? ? -> WHEN "m" THEN "f"
? ? -> END
? ? -> WHERE sex IN("f","m");
使用批量更新的辦法就可以了蹲坷。
輸出如下:
2.2 MySQL 基礎(chǔ) (三)- 表聯(lián)結(jié)
MySQL 別名
查詢數(shù)據(jù)是的時(shí)候驶乾,如果表名很長(zhǎng),使用起來不方便循签,此時(shí)就可以取一個(gè)別名级乐,用這個(gè)別名代替表的名稱。
SELECT? * FROM 表名 [AS] 別名;
為表取別名的時(shí)候县匠,as關(guān)鍵字可以省略不寫
為student 表取別名S风科,并查詢student表中g(shù)ender字段值為nv記錄
為字段取別名
在查詢數(shù)據(jù)的時(shí)候撒轮,為了顯示查詢結(jié)果更加直觀,可以為一個(gè)字段取一個(gè)別名贼穆,
SELECT 字段名 [AS] 別名 FROM 表名;
查詢student表中所有記錄的题山,name和gender字段值,并為這兩個(gè)字段起別名故痊,stu_name和stu_gender
可以看到顶瞳,顯示的查詢結(jié)果是指定的別名,而不是student表中的字段名愕秫。
INNER JOIN
在真正的應(yīng)用中經(jīng)常需要從多個(gè)數(shù)據(jù)表中讀取數(shù)據(jù)慨菱。本節(jié)介紹如何使用MySQL的JOIN在兩個(gè)或多個(gè)表中查詢數(shù)據(jù)。
你可以在SELECT UPDATE DELETE語句中使用MySQL的JOIN來聯(lián)合多表來查詢豫领。
INNER JOIN (內(nèi)連接 或 等值連接):獲得兩個(gè)表中字段匹配關(guān)系的記錄抡柿。
LEFT JOIN (左連接):獲取左表所有記錄,即使右表沒有對(duì)應(yīng)匹配的記錄等恐。
RIGHT JOIN(右連接):與LEFT JOIN相反洲劣,用于獲取右表的所有記錄,即使左表沒有對(duì)應(yīng)的匹配的連接课蔬。
CROSS JOIN(交叉連接):
為了方便理解每種類型的連接囱稽,我們是使用以下具有以下結(jié)構(gòu)的表:t1 和 t2表:
USE testdb;
CREATE TABLEt1 (id INT PRIMARYKEY, pattern VARCHAR(50) NOTNULL);
CREATE TABLEt2 (id VARCHAR(50) PRIMARYKEY, pattern VARCHAR(50) NOTNULL);
t1 和 t2 表都有pattern列,此列也是兩個(gè)表的公共列二跋。執(zhí)行以下插入語句將數(shù)據(jù)插入到t1 和 t2 中
INSERT INTO t1(id,pattern)
VALUES
(1,'Divot'),(2,'Brick'),(3,'Grid');
INSERT INTO t2 (id,pattern)
VALUES?
('A','Brick'),('B','Grid'),('C','Diamond');
MySQL交叉連接 CROSS JOIN
CROSS JOIN 生成來自多個(gè)表的行的笛卡爾乘積战惊。假設(shè)你使用CROSS JOIN 來連接t1 和 t2表,結(jié)果集將包括t1 表中的行和 t2 表中的行的組合扎即。
要執(zhí)行交叉連接(最后得到笛卡爾乘積)吞获,請(qǐng)使用CROSS JOIN子句,如以下語句所示谚鄙;
SELECT t1.id, t2.id FROM t1 CROSS JOIN t2;
執(zhí)行以下語句可以得到以下結(jié)果:
t1 表中的每一行與t2 表中的每一行結(jié)合形成笛卡爾乘積各拷。
下圖顯示了t1 和 t2 表之間的CROSS JOIN 連接;
MySQL的內(nèi)連接 INNER JOIN?
????要形成一個(gè)INNER JOIN連接子句闷营,需要一個(gè)稱之為連接謂詞的條件烤黍。INNER JOIN需要兩個(gè)連接的表中的行具有匹配的列值。INNER JOIN通過組合基于連接謂詞的兩個(gè)連接表的列值來創(chuàng)建結(jié)果集傻盟。
????要連接兩個(gè)表速蕊。INNER JOIN 將第一個(gè)表中的每一行與第二表中的每一行進(jìn)行比較,以找到滿足連接謂詞的行對(duì)娘赴。每當(dāng)通過匹配非NULL值來滿足連接謂詞的時(shí)规哲,兩個(gè)表中每個(gè)匹配的列值將包含在結(jié)果集中(可以簡(jiǎn)單理解為兩個(gè)表的交集)。
SELECT t1.id t2.id?
? ? FROM?
????????????t1
? ? ? ? ? ? ? ? ? ? INNER JOIN?
? ? ? ? ? ? t2? ? ?ON t1.pattern = t2.pattern;
在上面語句中诽表,以下表達(dá)式是連接謂詞:
t1.pattern = t2.pattern?
這意味著t1 和 t2表中的行必須在 pattern列中具有相同的值才能包含在結(jié)果中唉锌。
下圖顯示了t1 和 t2 表之間的 INNER JOIN
在此圖中腥光,兩個(gè)表中的行必須具有相同pattern列值,才能包含在結(jié)果集中糊秆。
MySQL左連接(LEFT JOIN)
類似于INNER JOIN武福,LEFT JOIN也需要連接謂詞。當(dāng)使用連接LEFT JOIN連接兩個(gè)表中的時(shí)痘番,介紹了左表和右表的概念捉片。
與INNER JOIN 不同 LEFT JOIN 返回左表的所有行,包括連接謂詞的所有行汞舱。對(duì)于不匹配連接謂詞的行伍纫,右表的列將使用NULL值顯示在結(jié)果集中。
以下子句使用 LEFT JOIN 連接t1 和 t2 表:
SELECT t1.id, t2.id
FROM?
? ? ? ? ? ? t1?
? ? ? ? ? ? LEFT JOIN?
? ? ? ? ? ? t2 ON t1.pattern = t2.pattern
ORDER BY t1.id;
????如上所見昂芜,t1表中的所有行都包含在結(jié)果集中莹规。對(duì)于t2 表(右表)中沒有任何匹配t1 表(左表)中的行,在t2表中的列使用NULL顯示泌神。
MySQL右連接(RIGHT JOIN)
右連接(RIGHT JOIN)類似于左連接(LEFT JOIN)除了表的處理是相反的良漱。使用RIGHT JOIN,右表t2 中的每一行將顯示在結(jié)果集中欢际。對(duì)于右表沒有左表(t1)中的匹配的行母市,左表t1 會(huì)顯示NULL
SELECT?
? ? t1.id ,t2.id?
FROM?
? ? t1?
? ? ? ? ? ? RIGHT? JOIN?
? ? t2 ON t1.pattern = t2.pattern?
ORDER BY t2.id
UNION
MySQL UNION 操作符用于連接兩個(gè)以上的 SELECT 語句的結(jié)果組合到一個(gè)結(jié)果集合中。多個(gè) SELECT 語句會(huì)刪除重復(fù)的數(shù)據(jù)损趋。
SELECT expression1, expression2, ... expression_n
FROM tables?
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
1 expression1, expression2, ... expression_n: 要檢索的列患久。
2 tables:?要檢索的數(shù)據(jù)表。
3 WHERE conditions:?可選浑槽, 檢索條件蒋失。
4 DISTINCT:?可選,刪除結(jié)果集中重復(fù)的數(shù)據(jù)桐玻。默認(rèn)情況下 UNION 操作符已經(jīng)刪除了重復(fù)數(shù)據(jù)篙挽,所以 DISTINCT 修飾符對(duì)結(jié)果沒啥影響。
5 ALL:?可選畸冲,返回所有結(jié)果集嫉髓,包含重復(fù)數(shù)據(jù)观腊。
SQL UNION 實(shí)例
下面的 SQL 語句從 "Websites" 和 "apps" 表中選取所有不同的country(只有不同的值):
SELECT country FROM Websites
UNION?
SELECT country FROM apps
ORDER BY country;
UNION 不能用于列出兩個(gè)表中所有的country邑闲。如果一個(gè)網(wǎng)站和app來自同一個(gè)國(guó)家,每個(gè)國(guó)家只會(huì)出現(xiàn)一次梧油,UNION只會(huì)選取不同的值苫耸,請(qǐng)使用UNION ALL 來選取不重復(fù)的值!
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
帶有 WHERE 的 SQL UNION ALL
下面的 SQL 語句使用 UNION ALL 從 "Websites" 和 "apps" 表中選取所有的中國(guó)(CN)的數(shù)據(jù)(也有重復(fù)的值):
SELECT country,name FROM Websites
WHERE conutry='CN'
UNION ALL?
SELECT country,app_name FROM apps
WHERE conutry='CN'
ORDER BY country;
3作業(yè):
mysql>select*from person;
mysql>select*from address;
mysql>select FirstName, LastName, City, State from Address
left join Person?
on Person.PersonId=Address.PersonId order by Person.PersonId;
mysql>create table emailtmp as select*fromemail;
mysql>delete emailtmp from emailtmp,email?
where emailtmp.email=email.email and emailtmp.id>email.id;
mysql>select*from email;
mysql>select*from emailtmp;
MySQL文件的導(dǎo)入以及導(dǎo)出
通過MySQL客戶端shell連接到服務(wù)器儡陨,選擇使用的數(shù)據(jù)庫褪子,輸入SQL代碼量淌。
作業(yè)
項(xiàng)目七: 各部門工資最高的員工(難度:中等)
創(chuàng)建Employee?表,包含所有員工信息嫌褪,每個(gè)員工有其對(duì)應(yīng)的?Id, salary 和 department Id呀枢。
+----+-------+--------+--------------+?
| Id | Name | Salary | Department
| 1 | Joe | 70000 | 1 |?
| 2 | Henry | 80000 | 2 |?
| 3 | Sam | 60000 | 2 |?
| 4 | Max | 90000 | 1 |?
+----+-------+--------+--------------+
創(chuàng)建Department?表,包含公司所有部門的信息笼痛。
+----+----------+?
| Id | Name |?
| 1 | IT |?
| 2 | Sales |?
+----+----------+
編寫一個(gè) SQL 查詢裙秋,找出每個(gè)部門工資最高的員工。例如缨伊,根據(jù)上述給定的表格摘刑,Max 在 IT 部門有最高工資,Henry 在 Sales 部門有最高工資刻坊。
+------------+----------+--------+?
| Department | Employee | Salary |?
| IT | Max | 90000 |?
| Sales | Henry | 80000 |?
+------------+----------+--------+
CREATE TABLE IF NOT EXISTS `Employee`(`id` INT UNSIGEND AUTO_INCREMENT, `NAME` VARCHAR(100) NOT NULL, `Salary` VARCHAR(100) NOT NULL, `Department` INT NOT NULL, PRIMARY KEY(`id`));
mysql> INSERT INTO Employee(id,NAME,Salary,Department) VALUES(1,"Joe","70000",1);
mysql> INSERT INTO Employee(id,NAME,Salary,Department) VALUES(2,"Henry","80000",2);
...
mysql> INSERT INTO Employee(id,NAME,Salary,Department) VALUES(4,"Max","90000",1);
mysql> CREATE TABLE `Department`(id INT PRIMARY KEY,Name VARCHAR(100));
mysql> insert into Department(id,Name) values (1,"IT");
mysql> insert into Department(id,Name) values (2,"Sales");
mysql> select Department.name as Department,Employee.name as Employee,Salary from Department,Employee where Employee.Department = Department.id AND Employee.Salary IN(select Max(salary) from Employee group by Department);
項(xiàng)目八: 換座位(難度:中等)
小美是一所中學(xué)的信息科技老師枷恕,她有一張?seat?座位表,平時(shí)用來儲(chǔ)存學(xué)生名字和與他們相對(duì)應(yīng)的座位 id谭胚。
其中縱列的?**id?**是連續(xù)遞增的
小美想改變相鄰倆學(xué)生的座位徐块。
你能不能幫她寫一個(gè) SQL query?來輸出小美想要的結(jié)果呢?
?請(qǐng)創(chuàng)建如下所示seat表:
+---------+---------+?
| id | student |
?| 1 | Abbot |?
| 2 | Doris |?
| 3 | Emerson |
?| 4 | Green |?
| 5 | Jeames |?
+---------+---------+
假如數(shù)據(jù)輸入的是上表灾而,則輸出結(jié)果如下:
+---------+---------+?
| id | student |?
| 1 | Doris |
?| 2 | Abbot |?
| 3 | Green |
?| 4 | Emerson |
?| 5 | Jeames |?
+---------+---------+
如果學(xué)生人數(shù)是奇數(shù)蛹锰,則不需要改變最后一個(gè)同學(xué)的座位。
mysql> select(case when mod(id,2)=1 and id=(select count(*) from seat) then id when mod(id,2)=1 then id+1 else id-1 end) as ID,Student from seat order by id;
count(*)返回總行數(shù)
mod(id,2)= 1 返回奇書
項(xiàng)目九: 分?jǐn)?shù)排名(難度:中等)
編寫一個(gè) SQL 查詢來實(shí)現(xiàn)分?jǐn)?shù)排名绰疤。如果兩個(gè)分?jǐn)?shù)相同铜犬,則兩個(gè)分?jǐn)?shù)排名(Rank)相同。請(qǐng)注意轻庆,平分后的下一個(gè)名次應(yīng)該是下一個(gè)連續(xù)的整數(shù)值癣猾。換句話說,名次之間不應(yīng)該有“間隔”余爆。
創(chuàng)建以下score表:
+----+-------+
?| Id | Score |?
| 1 | 3.50 |
?| 2 | 3.65 |
?| 3 | 4.00 |?
| 4 | 3.85 |
?| 5 | 4.00 |?
| 6 | 3.65 |?
+----+-------+
例如纷宇,根據(jù)上述給定的?Scores?表,你的查詢應(yīng)該返回(按分?jǐn)?shù)從高到低排列):
+-------+------+
?| Score | Rank |
| 4.00 | 1 |
?| 4.00 | 1 |
?| 3.85 | 2 |
?|?3.65 | 3 |
?| 3.65 | 3 |?
| 3.50 | 4 |?
+-------+------+
SELECT score,
(SELECT COUNT(DISTINCT score)
FROM scores WHERE score>=s.score) RANK
FROM scores s ORDER BY score DESC;
項(xiàng)目十:行程和用戶(難度:困難)?
Trips?表中存所有出租車的行程信息蛾方。
每段行程有唯一鍵 Id像捶,Client_Id 和?Driver_Id 是?Users?表中 Users_Id 的外鍵。
Status 是枚舉類型桩砰,枚舉成員為 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)拓春。
+----+-----------+-----------+---------+--------------------+----------+?
| Id | Client_Id | Driver_Id | City_Id | Status |Request_at|?
| 1 | 1 | 10 | 1 | completed |2013-10-01|?
| 2 | 2 | 11 | 1 | cancelled_by_driver|2013-10-01|
?| 3 | 3 | 12 | 6 | completed |2013-10-01|?
| 4 | 4 | 13 | 6 | cancelled_by_client|2013-10-01|?
| 5 | 1 | 10 | 1 | completed |2013-10-02|?
| 6 | 2 | 11 | 6 | completed |2013-10-02|?
| 7 | 3 | 12 | 6 | completed |2013-10-02|?
| 8 | 2 | 12 | 12 | completed |2013-10-03|?
| 9 | 3 | 10 | 12 | completed |2013-10-03|?
| 10 | 4 | 13 | 12 | cancelled_by_driver|2013-10-03|?
+----+-----------+-----------+---------+--------------------+----------+
Users?表存所有用戶。
每個(gè)用戶有唯一鍵 Users_Id亚隅。
Banned 表示這個(gè)用戶是否被禁止硼莽,Role 則是一個(gè)表示(‘client’, ‘driver’, ‘partner’)的枚舉類型。
?+----------+--------+--------+?
| Users_Id | Banned | Role |?
| 1 | No | client |?
| 2 | Yes | client |?
| 3 | No | client |
?| 4 | No | client |?
| 10 | No | driver |
?| 11 | No | driver |
?| 12 | No | driver |
?| 13 | No | driver |
?+----------+--------+--------+?
寫一段 SQL 語句查出?**2013年10月1日?**至?**2013年10月3日?**期間非禁止用戶的取消率煮纵。
基于上表懂鸵,你的 SQL 語句應(yīng)返回如下結(jié)果偏螺,取消率(Cancellation Rate)保留兩位小數(shù)。
?+------------+-------------------+?
| Day | Cancellation Rate |?
| 2013-10-01 | 0.33 |?
| 2013-10-02 | 0.00 |?
| 2013-10-03 | 0.50 |?
+------------+-------------------+