數(shù)據(jù)蛙第一周學(xué)習(xí)記錄

文中加入了自己的一些理解,如有不對請?jiān)u論指教O(∩_∩)O。
感謝老師的詳細(xì)講解和指導(dǎo)怔揩。

SQL與MySQL介紹

SQL: 結(jié)構(gòu)化查詢語言(Structured Query Language)簡稱SQL蔗坯,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)蛛芥。
MySQL: MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)提鸟。
兩者關(guān)系:一個(gè)是語言一個(gè)是系統(tǒng),可以再M(fèi)ySQL軟件下些SQL語句仅淑。

數(shù)據(jù)庫基礎(chǔ)

  • 數(shù)據(jù)庫(database)保存有組織的數(shù)據(jù)的容器称勋,數(shù)據(jù)庫與數(shù)據(jù)庫軟件是兩回事,MySQL是數(shù)據(jù)庫軟件涯竟,可以在其中創(chuàng)建數(shù)據(jù)庫赡鲜。


    database

    如上圖,data庐船、exercise等是數(shù)據(jù)庫(database)银酬,schema就是數(shù)據(jù)庫對象的集合,這個(gè)集合包含了各種對象如:表筐钟、視圖揩瞪、存儲過程、索引等篓冲。兩者關(guān)系暫時(shí)不展開李破,以后單獨(dú)介紹。

  • 表(table)某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單


    table

    如上圖纹因,world庫下有city喷屋、country、countrylanguage三個(gè)表瞭恰。

  • 列(column)表中的一個(gè)字段屯曹。所有表都是由一列或者多列組成的。


    column

    如上圖,city表下有ID恶耽、Name等5個(gè)字段密任。

  • 行(row)表中的一個(gè)記錄。
    city表中的每一行都是一條記錄
  • 主鍵(primary key)一列(或一組列)偷俭,其值嫩夠唯一區(qū)分表中的每一行浪讳。表中的每一行都應(yīng)該有一個(gè)唯一標(biāo)識自己的一列,表中的任何列都可以作為主鍵涌萤,但是必須滿足以下條件:
  1. 任意兩行不具有相同主鍵
  2. 每一行都必須有一個(gè)主鍵


    pramary key

    如上圖淹遵,city表中的字段ID作為該表的主鍵。

SQL介紹

  • SQL是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫负溪,專門用來與數(shù)據(jù)庫進(jìn)行通信的語言
  • SQL不是某個(gè)特定的數(shù)據(jù)庫專用語言透揣,幾乎所有的DBMS都支持SQL
  • SQL簡單易學(xué),需要學(xué)習(xí)的關(guān)鍵詞很少(會再總結(jié)一篇SQL關(guān)鍵詞文章)
  • SQL可以進(jìn)行非常復(fù)雜和高級的數(shù)據(jù)庫操作

檢索數(shù)據(jù)

  • 使用select選取列數(shù)據(jù)川抡,返回的結(jié)果是無序的
  1. SQL不區(qū)分大小寫
  2. 結(jié)束SQL語句需要使用分號(;)
  3. SQL語句會忽略空格
  4. 使用limit 限制返回結(jié)果行數(shù)
    使用某個(gè)庫辐真,用use database(庫名)
use world;

查詢語句,如已制定庫崖堤,則可以select 字段名 from 表名
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from city;
未指定庫侍咱,則可以select 字段名 from 庫名.表名

select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from world.city;

切換庫,直接用use database

use data;

limit的使用密幔,只顯示10行楔脯,limt 10

select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from city limit 10;

查看數(shù)據(jù)庫的列表

show databases;

查看表的列表

show tables;

查看表字段信息

show columns from city;
show columns

如上圖,int(11)胯甩、char(35)等淤年,里面的數(shù)字表示最大顯示寬度。int最大有效顯示寬度是255蜡豹。顯示寬度與存儲大小或類型包含的值的范圍無關(guān)麸粮。

  • 使用order by 排序數(shù)據(jù)
  1. desc 降序
  2. asc 升序
  3. order by 位于 from子句之后
use world;
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from city order by CountryCode desc,Population asc LIMIT 10;

默認(rèn)為升序排列(asc),多字段排序有先后镜廉,如在CountryCode 排序組內(nèi)對Population 進(jìn)行排序弄诲。

過濾數(shù)據(jù)

  • 在select語句中,數(shù)據(jù)根據(jù)where子句指定的搜索條件進(jìn)行過濾
  • 多個(gè)過濾子句使用 and/or 連接
  • where子句中的圓括號決定了計(jì)算次序
  • in/not
    and/or過濾時(shí)要注意先后順序娇唯,必要時(shí)加括號
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from world.city where population >= 100000 and population <= 500000 and (countrycode = "NLD" or countrycode = "AFG");

或者用in/not齐遵,not in表示不在

select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from world.city where population >= 100000 and population <= 500000 and countrycode in ("NLD", "AFG");

通配符

  • 通配符(wildcard) 用來匹配值的一部分的特殊字符,通配符可以替代一個(gè)或多個(gè)字符塔插。在搜索子句中使用通配符必須使用like操作符
  • 百分號(%)通配符
  1. “abc%” 以abc開頭梗摇,任意字符結(jié)尾的數(shù)據(jù)
  2. ‘%abc’ 以abc結(jié)尾,任意字符開頭的數(shù)據(jù)
  3. ‘%abc%’ 任意字符開頭和結(jié)尾想许,中間包含abc
  • 下劃線(_)通配符
  • 只匹配單個(gè)或多個(gè)字符
    ‘_abc’ 以abc結(jié)尾伶授,開頭只有一個(gè)長度的任意字符
  • 注意尾部空格
  • 注意null
    使用通配符進(jìn)行匹配數(shù)據(jù)時(shí)要注意索引失效的問題断序,"%ab"、"%ab%"會導(dǎo)致索引失效的問題糜烹,因?yàn)閟elect會全值匹配违诗,使用左索引來避免(方法一,后續(xù)再展開)
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from city where reverse(NAME) like reverse("%ab");

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

  • SQL支持函數(shù)疮蹦,但是函數(shù)卻不像SQL具有很強(qiáng)的可移植性诸迟,因?yàn)椴煌瑥S商的DBMS會指定不同的特殊函數(shù)
  • 大部分SQL包含的函數(shù)
  1. 用于處理文本
  2. 數(shù)值計(jì)算
  3. 處理時(shí)間
    length()函數(shù)
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION, length(NAME) as len_name from city; #length()在select內(nèi)
select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION from city where length(NAME)=6 #length()在where內(nèi)

substring()、left()愕乎、upper()阵苇、lower()函數(shù)

select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION,substring(NAME,1,3) as sub_name,left(NAME,3) as left_name,upper(NAME) as upper_name,lower(NAME) as lower_name FROM city;

replace()函數(shù)

select ID,NAME,COUNTRYCODE,DISTRICT,POPULATION,replace(NAME, "Al", "lA") from city where length(NAME)=6;

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

date

date()函數(shù)

select date(last_update) from sakila.film where date(last_update)="2006-02-15";

時(shí)間差datediff(),比較的是天的差值感论,parameter1-parameter2

select datediff(now(), last_update) from sakila.film;

匯總數(shù)據(jù)

  • 聚集函數(shù)(aggregate function)運(yùn)行在行組上慎玖,計(jì)算和返回單個(gè)值的函數(shù)
  • 常用的avg/count/max/min/sum
  • distinct
  • 注意,它們會忽略掉null值
select max(population), min(population), avg(population), sum(population) from city;

distinct()需在select后笛粘,distinct前面不可以有其他字段,后面可跟多個(gè)字段湿硝,查找所有字段都不相同的row

select distinct COUNTRYCODE, District from city;

在select語句中可以使用group by子句將行劃分成較小的組薪前,然后,使用聚合函數(shù)返回每一個(gè)組的匯總信息关斜,另外示括,可以使用having子句限制返回的結(jié)果集,因?yàn)閣here關(guān)鍵字無法與聚合函數(shù)一起使用痢畜。

select COUNTRYCODE,District,avg(population) as avg_popu from city group by CountryCode, District having avg(Population)>=1000000;

子查詢

  • 使用 group by 進(jìn)行數(shù)據(jù)分組垛膝,對每個(gè)組應(yīng)用函數(shù)
  • 使用having對組進(jìn)行過濾
select * from (select COUNTRYCODE,District,avg(population) as avg_popu from city group by CountryCode, District) a where avg_popu>=1000000;

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

對多張表進(jìn)行聯(lián)結(jié),使用select選取數(shù)據(jù)
JOIN的方式如下:


join
select a.* from 
(select * from world.city) a 
left join 
(select * from country limit 100) b
on a.countrycode = b.code
left join 
(select * from countrylanguage) c 
on c.countrycode = a.countrycode;

組合查詢

  • 將多個(gè)查詢結(jié)果通過 union 進(jìn)行組合
  • union 規(guī)則:
  1. 必須由兩條或者兩條以上的select語句組成丁稀,語句之間用union分隔
  2. union中的每個(gè)查詢必須包含相同的列吼拥,表達(dá)式或聚集函數(shù)
  3. 列數(shù)據(jù)類型必須兼容
  • union會自動(dòng)對數(shù)據(jù)進(jìn)行去重,如果不需要請使用 union all
  • order by 只能用于最后一條select語句

使用union時(shí)线衫,返回的字段須一致(數(shù)據(jù)類型一致凿可,但是容易混亂)。
默認(rèn)地授账,UNION 操作符選取不同的值(去重)枯跑。如果允許重復(fù)的值,請使用 UNION ALL白热。

select id,name from city where population >= 1000000
union all
select id,name from city where population >= 100000
order by id desc;

創(chuàng)建和操作表

  • 利用 CREATE TABLE 創(chuàng)建表敛助,必須給出下列信息:
  1. 新表的名字,在關(guān)鍵字CREATE TABLE 之后給出
  2. 表列的名字和定義屋确,用逗號隔開
  • 使用NULL值
    在創(chuàng)建表的是否可以定義列允許或者不允許NULL值
  • 主鍵
  1. 表中的一列或者多列可以成為主鍵纳击,這些值或者組合必須唯一
  2. PRIMARY KEY(col)续扔,主鍵不允許有NULL值
  • 指定默認(rèn)值
    關(guān)鍵字DEFAULT可以對列進(jìn)行默認(rèn)值設(shè)置
create table if not exists xiaoming_test2
(
id int not null,
name char(40) not null,
countrycode char(5),
population int,
gnp float,
language char(30)
);

更新/刪除表

  • ALTER TABLE 用來更新表結(jié)構(gòu),但是強(qiáng)烈建議在創(chuàng)建表的時(shí)候就仔細(xì)考慮表結(jié)構(gòu)评疗,不要輕易變動(dòng)
  1. add column char(20)
  2. drop column
  • DROP TABLE 刪除表

插入數(shù)據(jù)

  • insert 是用來插入行到數(shù)據(jù)庫中测砂,插入可以使用幾種方式:
    1. 插入完成的行(不推薦)
    2. 插入行的一部分
    3. 插入多行
    4. 插入某些查詢結(jié)果
  • update用來更新表中的數(shù)據(jù),一定要仔細(xì)百匆,不要省略where字句
  • delete用于從表中刪除特定的行或者從表中刪除所有行砌些,一定要仔細(xì),不要省略where字句
  • 指導(dǎo)原則:
    1. 絕對不要輕易忽略where字句加匈,否則會更新或刪除全部的行
    2. 在使用where條件前先使用select進(jìn)行測試存璃,保證正確無誤,因?yàn)镸ysql是沒有撤銷功能的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雕拼,一起剝皮案震驚了整個(gè)濱河市纵东,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啥寇,老刑警劉巖偎球,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辑甜,居然都是意外死亡衰絮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門磷醋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猫牡,“玉大人,你說我怎么就攤上這事邓线√视眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵骇陈,是天一觀的道長震庭。 經(jīng)常有香客問我,道長你雌,這世上最難降的妖魔是什么归薛? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匪蝙,結(jié)果婚禮上主籍,老公的妹妹穿的比我還像新娘。我一直安慰自己逛球,他們只是感情好千元,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颤绕,像睡著了一般幸海。 火紅的嫁衣襯著肌膚如雪祟身。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天物独,我揣著相機(jī)與錄音袜硫,去河邊找鬼。 笑死挡篓,一個(gè)胖子當(dāng)著我的面吹牛婉陷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播官研,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秽澳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了戏羽?” 一聲冷哼從身側(cè)響起担神,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎始花,沒想到半個(gè)月后妄讯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酷宵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年亥贸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忧吟。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斩披,靈堂內(nèi)的尸體忽然破棺而出溜族,到底是詐尸還是另有隱情,我是刑警寧澤垦沉,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布煌抒,位于F島的核電站,受9級特大地震影響厕倍,放射性物質(zhì)發(fā)生泄漏寡壮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一讹弯、第九天 我趴在偏房一處隱蔽的房頂上張望况既。 院中可真熱鬧,春花似錦组民、人聲如沸棒仍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莫其。三九已至癞尚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乱陡,已是汗流浹背浇揩。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憨颠,地道東北人胳徽。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像烙心,于是被迫代替她去往敵國和親膜廊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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