文中加入了自己的一些理解,如有不對請?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ù)庫赡鲜。
如上圖,data庐船、exercise等是數(shù)據(jù)庫(database)银酬,schema就是數(shù)據(jù)庫對象的集合,這個(gè)集合包含了各種對象如:表筐钟、視圖揩瞪、存儲過程、索引等篓冲。兩者關(guān)系暫時(shí)不展開李破,以后單獨(dú)介紹。
-
表(table)某種特定類型數(shù)據(jù)的結(jié)構(gòu)化清單
如上圖纹因,world庫下有city喷屋、country、countrylanguage三個(gè)表瞭恰。
-
列(column)表中的一個(gè)字段屯曹。所有表都是由一列或者多列組成的。
如上圖,city表下有ID恶耽、Name等5個(gè)字段密任。
- 行(row)表中的一個(gè)記錄。
city表中的每一行都是一條記錄 - 主鍵(primary key)一列(或一組列)偷俭,其值嫩夠唯一區(qū)分表中的每一行浪讳。表中的每一行都應(yīng)該有一個(gè)唯一標(biāo)識自己的一列,表中的任何列都可以作為主鍵涌萤,但是必須滿足以下條件:
- 任意兩行不具有相同主鍵
-
每一行都必須有一個(gè)主鍵
如上圖淹遵,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é)果是無序的
- SQL不區(qū)分大小寫
- 結(jié)束SQL語句需要使用分號(;)
- SQL語句會忽略空格
- 使用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;
如上圖,int(11)胯甩、char(35)等淤年,里面的數(shù)字表示最大顯示寬度。int最大有效顯示寬度是255蜡豹。顯示寬度與存儲大小或類型包含的值的范圍無關(guān)麸粮。
- 使用order by 排序數(shù)據(jù)
- desc 降序
- asc 升序
- 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操作符
- 百分號(%)通配符
- “abc%” 以abc開頭梗摇,任意字符結(jié)尾的數(shù)據(jù)
- ‘%abc’ 以abc結(jié)尾,任意字符開頭的數(shù)據(jù)
- ‘%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ù)
- 用于處理文本
- 數(shù)值計(jì)算
- 處理時(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()函數(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的方式如下:
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ī)則:
- 必須由兩條或者兩條以上的select語句組成丁稀,語句之間用union分隔
- union中的每個(gè)查詢必須包含相同的列吼拥,表達(dá)式或聚集函數(shù)
- 列數(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)建表敛助,必須給出下列信息:
- 新表的名字,在關(guān)鍵字CREATE TABLE 之后給出
- 表列的名字和定義屋确,用逗號隔開
- 使用NULL值
在創(chuàng)建表的是否可以定義列允許或者不允許NULL值 - 主鍵
- 表中的一列或者多列可以成為主鍵纳击,這些值或者組合必須唯一
- 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)
- add column char(20)
- drop column
- DROP TABLE 刪除表
插入數(shù)據(jù)
- insert 是用來插入行到數(shù)據(jù)庫中测砂,插入可以使用幾種方式:
- 插入完成的行(不推薦)
- 插入行的一部分
- 插入多行
- 插入某些查詢結(jié)果
- update用來更新表中的數(shù)據(jù),一定要仔細(xì)百匆,不要省略where字句
- delete用于從表中刪除特定的行或者從表中刪除所有行砌些,一定要仔細(xì),不要省略where字句
- 指導(dǎo)原則:
- 絕對不要輕易忽略where字句加匈,否則會更新或刪除全部的行
- 在使用where條件前先使用select進(jìn)行測試存璃,保證正確無誤,因?yàn)镸ysql是沒有撤銷功能的