最基本的建立:SQL小白入門指南

建立表

最基本的建立

在mysql中,資料的家就叫做表,張三住在張家,李四住在李家,他們屬於一個家庭單元,mysql的表也是一樣的邏輯。

我們可以給mysql的表起一個名字,然後規定表裡面的成員有哪些,例如整個宇宙都在用的student的例子:

create table student ( s_name varchar(120) comment ‘學生的名字’, s_age integer comment ‘學生的年齡’, s_class varchar(120) comment ‘學生的班級’)

像這樣執行一下我們就能給我們的學生建立一個大家庭啦。

這樣我們就得到了一個類似excel表裡的東西:

s_name

s_age

s_class

學生的名字

學生的年齡

學生的班級

當然,這個語句裡面還有幾個值得注意的地方

1、comment語句,是用來給這個欄位加一箇中文的註釋的。

2、varchar(數字) 是用來規定欄位的型別的

我們可以簡單理解mysql的型別,無非就是數字和字元還有時間,數字就是integer,字元就是varchar,大部分情況下int和varchar已經夠用了,對於我們初學者來說,只需要分辨它的資料型別是字串還是數字還是時間就好啦。

怎麼檢視一個已經建好的表的資訊呢

desc student;

用Desc關鍵字加表名就可以查到啦,大概就是像下面的結果:

s_name varchar(120)s_age int(11)s_class varchar(120)

基本上跟我們輸入的一毛一樣對不對。

對於初學者來說,建立表理論上只需要懂這麼多就可以了。總結下來就是

各回各家各找各媽

每個資料都有自己的家,它們在mysql裡面的名字叫“表”。

如果你到了後期想要知道更多的關於建立表的知識,歡迎提問。

修改欄位

修改欄位使用alter語句,那為啥我們要修改欄位嘞?因為有些時候我們建了一個表,起初就像是我們在上面兼得student表,它只有三個欄位,姓名年齡班級,但是恰好某一天班主任因為一件特殊的事情,他想要知道學生們的身高。

那我們就需要去改一下我們建好的表啦。

使用這個語句來更改mysql中的表:

alter table student add column s_height integer comment ‘學生的身高’

上面的是我們在這個表裡面,add column , 新增了一個欄位,後面的資訊跟建立表的時候一毛一樣。

執行這個就能給student加一個身高欄位啦!

那麼問題來了,如果班主任發現學生的名字比120個字元還要大怎麼辦?

s_name varchar(120) 我們知道上面給學生的名稱設定了120個字元,萬一有一個學生叫

尼古拉斯安琪拉大魚寶貝...

,得,名字比120個字元還要多咋辦?

哈哈哈,不慌,我們還可以用alter來更改欄位的長度!

alter table student modify column s_name varchar(225) comment ‘學生的名字’

這樣就可以啦!

還是一樣,初學者知道怎麼加欄位和改欄位資訊就行了。

注意,改欄位要考慮已經有了的資料哦,萬一你把一個本來120個字元的名字,改成了20個字元,豈不是大家的長度都不夠啦

插入資料

現在我們已經有了一個完美的student表啦,但是,它裡面還沒有學生入住,辣怎麼行!我們必須得給裡面插入一些資料才行吧,否則班主任就太孤獨了。

我們用下面的語句在mysql中插入一條資料:

insert into student ( s_name, s_age, s_class, s_height) values ( ‘張三丰’, 17, ‘三年二班’, 188)

讓我來翻譯一下這個語句吧:

insert into student ( 這裡寫每個成員的資訊列表) values ( 這裡寫每個資訊的值)

怎麼樣,插入語句是最簡單的了吧,注意被一個資訊對應了每一個數據的順序,並且你輸入的值,需要跟自己規定的一樣哦,

各回各家,各找各媽

嫌棄一次只能插入一條資料太慢?辣怎麼行!mysql支援用逗號把很多values隔開,這樣就能一次性插入多條啦

insert into student ( s_name, s_age, s_class, s_height) values ( ‘張四豐’, 16, ‘一年二班’, 160),( ‘李五六’, 15, ‘幼年大班’, 177)

修改和刪除資料

修改

哎呀,突然發現剛剛插入的資料,張三丰的身高弄錯了怎麼辦!他明明是2米的!辣怎麼行!

不慌,mysql可以改,使用update語句就可以改了

update student set s_height=200 where s_name=‘張三丰’

這裡我們還接觸到了where這個條件語句,它的意思就是生效的範圍,我們在修改資料的時候,

一定不要忘記加where

哦,如果你這麼寫:

update student set s_height=200;

那麼你就完蛋啦, 你會把所有人的身高都改成200。

趕緊捲鋪蓋跑路了。

刪除

我們決定開除李五六,沒有別的理由,用下面的語句就好:

delete from student where s_name = ‘李五六’

記住

一定不要忘記加where

,在delete的時候還應該加上limit 100

delete from student where s_name = ‘李五六’ limit 100

這樣可以保住小命哦。

第一個查詢

終於到了激動人心的時候了

讓我們先來簡單瞭解下select的簡單結構

select 欄位列表 from 表名 where 條件

怎麼樣,很簡單吧,例如我現在要看一下student裡面的張三丰

select * from student where s_name=‘張三丰’

顯示的結果會是:

s_name

s_age

s_class

s_height

張三丰

17

三年二班

200

很簡單吧,以此類推,如果我們只想知道張三丰所在的班級,應該這麼查:

select s_class from student where s_name=‘張三丰’

s_class

三年二班

這樣就查出來張三丰屬於三年二班啦。

條件語句

哈哈哈,九陽神功已經練成,讓我們來多嘗試幾次

使用age的大小比較,檢視大於16歲的學生:

select * from student where s_age > 16

s_name

s_age

s_class

s_height

張三丰

17

三年二班

200

使用多個條件並聯,大於15歲且身高小於190的學生

select * from student where s_age > 15 and s_height < 190

s_name

s_age

s_class

s_height

張四豐

16

一年二班

160

like語句

like語句的作用是做模糊匹配,例如我們隱隱約約記得一個叫張x的人,我們可以透過like來模糊查詢:

select * from student where s_name like ‘%張%’

s_name

s_age

s_class

s_height

三豐

17

三年二班

200

這裡有一個知識點:

1、

like '%張%'

字元前後都有%,表示匹配到“張”這個字就會命中

2、

like '%張'

只有字元前有%,表示字元末尾匹配到“張”這個字才會命中

3、

like '張%'

只有字元後有%,表示字元開頭匹配到“張”這個字才會命中

你學廢了嗎?

join操作解釋

在mysql中,最令人頭疼的除了group by恐怕就是join語句了,left join ? right join ? 辣怎麼行!完全看不懂!

JOIN的含義就如英文單詞“join”一樣,連線

好多表

,大致分為內連線,外連線,右連線,左連線,自然連線。

JOIN 就是將一張表的每一條記錄,與另一張表的每一條記錄

強行

拼在一起。

所以,如果A表有n條記錄,B表有m條記錄,結果就會產生n*m條記錄。

強扭的瓜雖然不甜,但是join的瓜還是很甜的。

為了便於實驗,我們現在新建一個表插入一些資料

1、學校表

create table school ( sch_name varchar(120) comment ‘學校的名稱’, sch_address varchar(220) comment ‘學校的地址’)

弄幾個學校進去

insert into school (sch_name, sch_address) values ( ‘手大’, ‘北京東路32號’),( ‘肚子大’, ‘朝陽南路1號’),( ‘臉大’, ‘南京南路3號’)

老師表

create table teacher ( tea_name varchar(120) comment ‘老師的名字’, tea_subject varchar(220) comment ‘老師教的科目’)

insert into teacher ( tea_name, tea_subject) values ( ‘馬爸爸’, ‘社會學’),( ‘王爸爸’, ‘資本論’),( ‘特靠譜’, ‘嘴炮學’)

好的,萬事大吉!現在我們就可以試試join長啥樣了

JOIN

select * from student as A join school B join teacher C

as

語句是給這張表起一個好記的名字,因為student school teacher在這一串查詢條件裡面太長了,所以給他們叫A、B、C好了

這裡我們可以看看最終得到了什麼樣的資料?

——一共可以得到8個欄位共18條資料,實在是太多啦,我簡單列舉出張三丰的資料:

s_name

s_age

s_class

s_height

sch_name

sch_address

tea_name

tea_subject

張三丰

17

三年二班

200

臉大

南京南路3號

馬爸爸

社會學

張三丰

17

三年二班

200

臉大

朝陽南路1號

王爸爸

資本論

張三丰

17

三年二班

200

臉大

北京東路32號

特靠譜

嘴炮學

張三丰

17

三年二班

200

肚子大

朝陽南路1號

王爸爸

資本論

張三丰

17

三年二班

200

肚子大

南京南路3號

馬爸爸

社會學

張三丰

17

三年二班

200

肚子大

北京東路32號

特靠譜

嘴炮學

張三丰

17

三年二班

200

手大

朝陽南路1號

馬爸爸

社會學

張三丰

17

三年二班

200

手大

南京南路3號

王爸爸

資本論

張三丰

17

三年二班

200

手大

北京東路32號

特靠譜

嘴炮學

可以看到join操作就是把這幾張表,

強行

拼湊在一起

我們也可以加上where條件,控制資料

select * from student as A join school B join teacher C where A。s_name=‘張三丰’ and B。sch_name=‘手大’ and C。tea_name=‘特靠譜’

這樣我們就只拿了一條資料:

s_name

s_age

s_class

s_height

sch_name

sch_address

tea_name

tea_subject

張三丰

17

三年二班

200

手大

北京東路32號

特靠譜

嘴炮學

所以JOIN的作用是什麼?

就是把幾張表強行揉在一起

我們可以在join的表名後加

on語句

,它跟where是一樣的,但是它是join表的條件語句

select * from student as A join school B on B。sch_name=‘臉大’ join teacher C

s_name

s_age

s_class

s_height

sch_name

sch_address

tea_name

tea_subject

張三丰

17

三年二班

200

臉大

南京南路3號

馬爸爸

社會學

張三丰

17

三年二班

200

臉大

朝陽南路1號

王爸爸

資本論

張三丰

17

三年二班

200

臉大

北京東路32號

特靠譜

嘴炮學

這樣join的表就過濾掉了其他的資料,跟where條件的作用是一樣的。

INNER JOIN

inner join 又叫做內連線,emm,其實它就是取交集,

我們前面知道了join是強行把幾張表揉在一起,而inner join,是把幾張表的交集部分揉在一起。(交集,就是幾個表中共有的一摸一樣的那部分)

inner join 是一定要寫on的,如果不寫on的話,就跟join差不多啦。在on中寫出a和b交集的部分。

為了演示,我得再給老師表加一個班級欄位,然後改掉馬爸爸的班級

alter table teacher add column tea_class varchar(200) comment ‘老師的班級’;update teacher set tea_class=‘三年二班’ where tea_name=‘馬爸爸’;

好啦接下來我們試一下inner join

select * from student as A inner join teacher C on C。tea_class=A。s_class

s_name

s_age

s_class

s_height

tea_name

tea_subject

tea_class

張三丰

17

三年二班

200

馬爸爸

社會學

三年二班

這樣我們就查出來老師馬爸爸所在的三年二班的所有學生列表了。

amazing!

可以再插入一個學生再查詢一次試試:

insert into student ( s_name, s_age, s_class, s_height) values ( ‘王八’, 22, ‘三年二班’, 177)

s_name

s_age

s_class

s_height

tea_name

tea_subject

tea_class

王八

22

三年二班

200

馬爸爸

社會學

三年二班

張三丰

17

三年二班

177

馬爸爸

社會學

三年二班

amazing!

LEFT JOIN

left join 又叫做左連線,它對應的還有一個右連線,emm,其實它也是取交集,

left join含義就是求兩個表的交集

外加左變表剩下的資料

。 跟innerjoin的區別就在於它會同時拿到左邊表剩下的資料!

讓我們來執行一個查詢試試

select * from student as A left join teacher C on C。tea_class=A。s_class

s_name

s_age

s_class

s_height

tea_name

tea_subject

tea_class

王八

22

三年二班

200

馬爸爸

社會學

三年二班

張三丰

17

三年二班

177

馬爸爸

社會學

三年二班

張四豐

16

一年二班

160

amazing,這樣看是不是很明顯了?

left join就是left join語句左邊的表,保留全部資料,同時連線上右邊的表,不匹配的欄位就是空的。

RIGHT JOIN

與left join極為相似,只是它取的是left join語句右邊的表的全部資料,不匹配的欄位是空的。

select * from student as A right join teacher C on C。tea_class=A。s_class

s_name

s_age

s_class

s_height

tea_name

tea_subject

tea_class

王八

22

三年二班

200

馬爸爸

社會學

三年二班

張三丰

17

三年二班

177

馬爸爸

社會學

三年二班

王爸爸

資本論

特靠譜

嘴炮學

amazing!

group by

終於講到了這裡!你也看到了這裡!

group by,顧名思義,就是分組

直接上一個簡單的例子看一下:

select s_name,s_class from student group by s_class

s_name

s_class

張三丰

三年二班

張四豐

一年二班

顧名思義,就是按照s_class欄位來進行分組,把所有重複的剔除掉,只保留不一樣的那一行,可以看到這次的結果裡面沒有“王八”那一條資料,因為它跟其他的資料重複了。因為王八跟張三丰都是同一個班級“三年二班”的,group by去掉了重複的行。

一般group by是搭配統計函式count來使用的,往下看就可以看到啦。

having

group by 還可以寫分組過後的條件語句,其實它的寫法跟where一樣的,只是它是專門寫在group by後面的。

select s_name,s_class from student group by s_class having s_name=‘張三丰’

s_name

s_class

張三丰

三年二班

order by

order by 就更簡單了,就是根據後面的欄位來排序,desc是倒序,asc是正序,字元比首字母,數字比大小,日期比先後

select s_name,s_class,s_age from student group by s_name,s_class,s_age order by s_age desc

s_name

s_class

s_age

王八

三年二班

22

張三丰

三年二班

17

張四豐

一年二班

16

order by跟group by一起用的時候,寫在group by後面哦

簡單函式

count

在group by那裡我們看到了group by的用法,一般我們用的最多的還是使用group by來count一個數據出現的次數

例如

select s_name, count(1) as num from student group by s_name

s_name

num

王八

1

張三丰

1

張四豐

1

它們仨都只出現了一次,如果我們再插入一條資料:

insert into student ( s_name, s_age, s_class, s_height) values ( ‘王八’, 22, ‘三年二班’, 177)

再來查詢一遍

select s_name, count(1) as num from student group by s_name

s_name

num

王八

2

張三丰

1

張四豐

1

三年二班就有2只王八了。

max min avg

1、然後我們可以使用max獲取最大的那一個數據

select max(s_age) as max_age from student

結果是22

2、使用min獲取最小的哪一個資料:

select min(s_age) as min_age from student

結果是16

3、使用avg獲取平均值

select avg(s_age) as avg_age from student

結果是19。25

它們的妙用在這裡

1、找到年齡最大的同學

select s_name from student where s_age=( select max(s_age) as max_age from student)

2、找到年齡最小的同學

select s_name from student where s_age=( select min(s_age) as max_age from student)

3、找到年齡比平均年齡小的同學

select s_name from student where s_age<( select avg(s_age) as max_age from student)

str_to_date date_format

1、str_to_date把字元轉換成時間

select str_to_date(‘2021-10-01’, ‘%Y-%m-%d’);

2、date_format把時間轉成想要的字串

select date_format(NOW(), ‘%Y哈哈哈%m哈哈哈%d’);

ps 中間的哈哈哈可以換成任意的東西哦, NOW()是查詢當前時間

其他函式

菜鳥教程有一堆關於其他函式的描述,可以看看

https://www。runoob。com/mysql/mysql-functions。html

結束

game over!收工

原文連結:https://www。cnblogs。com/ztfjs/p/sql。html