SQL學(xué)習(xí)

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ù)

MySQL 函數(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 |?

+------------+-------------------+

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末匆光,一起剝皮案震驚了整個(gè)濱河市套像,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌终息,老刑警劉巖凉夯,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異采幌,居然都是意外死亡劲够,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門休傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來征绎,“玉大人,你說我怎么就攤上這事磨取∪耸粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵忙厌,是天一觀的道長(zhǎng)凫岖。 經(jīng)常有香客問我,道長(zhǎng)逢净,這世上最難降的妖魔是什么哥放? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮爹土,結(jié)果婚禮上甥雕,老公的妹妹穿的比我還像新娘。我一直安慰自己胀茵,他們只是感情好社露,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琼娘,像睡著了一般峭弟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脱拼,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天瞒瘸,我揣著相機(jī)與錄音,去河邊找鬼挪拟。 笑死挨务,一個(gè)胖子當(dāng)著我的面吹牛击你,可吹牛的內(nèi)容都是我干的玉组。 我是一名探鬼主播谎柄,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惯雳!你這毒婦竟也來了朝巫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤石景,失蹤者是張志新(化名)和其女友劉穎劈猿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潮孽,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揪荣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了往史。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗颈。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椎例,靈堂內(nèi)的尸體忽然破棺而出挨决,到底是詐尸還是另有隱情,我是刑警寧澤订歪,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布脖祈,位于F島的核電站,受9級(jí)特大地震影響刷晋,放射性物質(zhì)發(fā)生泄漏盖高。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一眼虱、第九天 我趴在偏房一處隱蔽的房頂上張望或舞。 院中可真熱鬧,春花似錦蒙幻、人聲如沸映凳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈豌。三九已至,卻和暖如春抒和,著一層夾襖步出監(jiān)牢的瞬間矫渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工摧莽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庙洼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像油够,于是被迫代替她去往敵國(guó)和親蚁袭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容