建立表
最基本的建立
在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!收工