前言
本文是 MYSQL零基礎(chǔ)小白學(xué)習(xí) 系列的第二篇文章,點(diǎn)此閱讀 上一篇文章
文末包郵送《分布式中間件核心原理與RocketMQ最佳實(shí)踐 》(點(diǎn)擊下方目錄直達(dá))一本,本文每+1000瀏覽額外加抽一人
6. 實(shí)戰(zhàn)案例詳解
需求:設(shè)計(jì)包含如下信息的學(xué)生表,請(qǐng)注重?cái)?shù)據(jù)類型、長(zhǎng)度的合理性。
- 編號(hào)
- 姓名,姓名最長(zhǎng)不超過(guò)10個(gè)漢字
- 性別,因?yàn)槿≈抵挥袃煞N可能,因此最多一個(gè)漢字
- 生日,取值為年月日
- 成績(jī),小數(shù)點(diǎn)后保留兩位
- 地址,最大長(zhǎng)度不超過(guò) 64
- 學(xué)生狀態(tài)(用數(shù)字表示,正常、休學(xué)、畢業(yè)…)
在完成這樣一個(gè)案例前,首先要?jiǎng)?chuàng)建一個(gè)學(xué)生數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)中創(chuàng)建一張新的表,創(chuàng)建表時(shí)注意語(yǔ)法格式,數(shù)據(jù)類型和長(zhǎng)度的合理性。
以管理員身份運(yùn)行命令提示符cmd,啟動(dòng)Mysql服務(wù),登錄MySQL:
創(chuàng)建學(xué)生信息數(shù)據(jù)庫(kù):
create database if not exists student;
使用student
數(shù)據(jù)庫(kù):
use student;
創(chuàng)建數(shù)據(jù)表:
create table stu(
id int ,-- 編號(hào)
name varchar(10),-- 姓名
gender char(1),-- 性別
birthday date,-- 生日
score double(5,2) ,-- 分?jǐn)?shù)
addr varchar(50),-- 地址
status tinyint-- 狀態(tài)
);
現(xiàn)在,我們已經(jīng)學(xué)會(huì)了寫SQL來(lái)操作數(shù)據(jù)庫(kù),但是我們?cè)诿钚兄袑慡QL時(shí),往往有體驗(yàn)感差,效率低等問(wèn)題,現(xiàn)在開始我們就要學(xué)習(xí)在MySQL的圖形化客戶端Navicat中執(zhí)行SQL語(yǔ)句
。
Navicat 為數(shù)據(jù)庫(kù)管理、開發(fā)和維護(hù)提供了一款直觀而強(qiáng)大的圖形化界面,大大的提高了工作效率,建議在學(xué)習(xí)中也使用這款開發(fā)工具。接下來(lái),在Navicat中新建數(shù)據(jù)庫(kù),新建查詢,我們就可以編寫SQL并且執(zhí)行SQL語(yǔ)句了。
7. DML- 增刪改數(shù)據(jù)
7.1 添加數(shù)據(jù)
給指定列添加數(shù)據(jù):
insert into 表名(列名1,列名2...) values(值1,值2...);
給全部列添加數(shù)據(jù):
insert into 表名 values(值1,值2...);
批量添加數(shù)據(jù):
insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...),(值1,值2...)...;
批量添加數(shù)據(jù)(省略字段名):
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...)...;
在開發(fā)過(guò)程中添加數(shù)據(jù)時(shí)是不建議省略字段名的,這樣降低了代碼的可讀性,使效率下降。例如:
查詢表中的所有數(shù)據(jù)的方法是:
select * from 表名;
后面會(huì)用到的。
需求:往下面的tb_user
表中添加一條數(shù)據(jù)。
insert into tb_user(id,name) values(2,'李四');
添加成功:
7.2 修改數(shù)據(jù)
修改表的數(shù)據(jù):
update 表名 set 列名1=值1,列名2=值2...[where 條件];
在修改數(shù)據(jù)時(shí),也可以不使用where條件,此時(shí)的操作是修改整列數(shù)據(jù),這樣的操作是很危險(xiǎn)的。
需求:把下面tb_user
表中的張三的密碼改為abc23
update tb_user set passwor d ='abc123' where name='張三';
修改成功:
7.3 刪除數(shù)據(jù)
刪除表的數(shù)據(jù):
delete from 表名 [where 條件];
在刪除某條數(shù)據(jù)時(shí),如果不使用where條件,將會(huì)導(dǎo)致刪除整個(gè)表的數(shù)據(jù)。
需求:刪除tb_user表中的李四記錄。
delete from tb_user where name='李四';
操作成功:
8. DQL- 數(shù)據(jù)的查詢操作
查詢是數(shù)據(jù)操作至關(guān)重要的一部分,
比如說(shuō)在所有商品中查找出價(jià)格在規(guī)定范圍內(nèi)的所有商品,要想把數(shù)據(jù)庫(kù)中的數(shù)據(jù)在客戶端中展示給用戶,一般都進(jìn)行了查詢的操作。
在實(shí)際開發(fā)中,我們要根據(jù)不同的需求,并且考慮查詢的效率來(lái)決定怎樣進(jìn)行查詢,學(xué)習(xí)查詢前,可以先看看查詢的完整語(yǔ)法:
SELECT
字段列表
FROM
表名列表
WHERE
條件列表
GROUP BY
分組字段
HAVING
分組后條件
ORDER BY
排序字段
LIMIT
分頁(yè)限定
根據(jù)查詢的完整語(yǔ)法中的關(guān)鍵字,我們分別來(lái)學(xué)習(xí)基礎(chǔ)查詢,條件查詢,排序查詢,分組查詢和分頁(yè)查詢。
下面的練習(xí)中使用以下的案例學(xué)習(xí)單表查詢:
-- 刪除stu表
drop table if exists stu;
-- 創(chuàng)建stu表
CREATE TABLE stu (
id int, -- 編號(hào)
name varchar(10), -- 姓名
age int, -- 年齡
gender varchar(5), -- 性別
math double(5,2), -- 數(shù)學(xué)成績(jī)
english double(5,2) -- 英語(yǔ)成績(jī)
);
-- 添加數(shù)據(jù)
INSERT INTO stu(id,name,age,gender,math,english)
VALUES
(1,'小張',23,'男',66,78),
(2,'小李',20,'女',98,87),
(3,'小陳',55,'男',56,77),
(4,'小樊',20,'女',76,65),
(5,'小馬',20,'男',86,NULL),
(6,'小趙',57,'男',99,99);
在Navicat中選中SQL并執(zhí)行:
8.1 基礎(chǔ)查詢
1. 基礎(chǔ)查詢語(yǔ)法
查詢多個(gè)字段:
select 字段列表 from 表名;
查詢?nèi)孔侄危?/p>
select * from 表名;
去除重復(fù)記錄:
select distinct 字段列表 from 表名;
起別名操作:
select 字段名 別名 from 表名;
2. 基礎(chǔ)查詢練習(xí)
使用學(xué)生表進(jìn)行基礎(chǔ)查詢練習(xí):
查詢多個(gè)字段的練習(xí):
select name,math from stu;
起別名操作練習(xí):
select name,english 英語(yǔ)成績(jī) from stu;
8.2 條件查詢
1. 條件查詢語(yǔ)法
一般語(yǔ)法:
select 字段列表 from 表名 where 條件列表;
條件查詢一般配合運(yùn)行符進(jìn)行,下面是常見的幾個(gè)運(yùn)算符:
運(yùn)算符 | 功能描述 |
---|---|
> < = ! | 大于 小于 等于 不等于 |
between…and… | 在這個(gè)范圍之內(nèi) |
in(…) | 多選一 |
is null / is not null | 是null / 不是null |
and 或 && | 并且 |
or 或 || | 或者 |
2. 條件查詢練習(xí)
使用學(xué)生表進(jìn)行條件查詢練習(xí):
查詢年齡大于20的學(xué)生信息:
select * from stu where age>20;
查詢年齡等于18歲 或者 年齡等于20歲 或者 年齡等于21歲的學(xué)生信息:
select * from stu where age in(18,20,21);
模糊查詢使用like關(guān)鍵字,可以使用通配符進(jìn)行占位:
- _ : 代表單個(gè)任意字符
- % : 代表任意個(gè)數(shù)字符
查詢姓名中含有張的學(xué)生信息:
select * from stu where name like '%張%';
8.3 排序查詢
1. 排序查詢語(yǔ)法
select 字段列表 from 表名 order by 排序字段名1 [排序方式]...;
注:排序方式有兩種:分別是升序ASC和降序DESC,默認(rèn)情況下是升序ASC。
2. 排序查詢練習(xí)
使用學(xué)生表進(jìn)行排序查詢練習(xí):
查詢學(xué)生信息,按照數(shù)學(xué)成績(jī)降序排列:
select * from stu order by math DESC;
8.4 聚合函數(shù)
1. 聚合函數(shù)語(yǔ)法
什么是聚合函數(shù)呢?在進(jìn)行查詢操作時(shí),往往需要對(duì)一整列進(jìn)行運(yùn)算,例如可以計(jì)算一整列成績(jī)數(shù)據(jù)的平均值,我們就要使用聚合函數(shù)。下面是常見的聚合函數(shù):
函數(shù)名 | 功能 |
---|---|
count(列名) | 統(tǒng)計(jì)數(shù)量(一般選用不為null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
一般語(yǔ)法:
select 聚合函數(shù) from 表名;
注:NULL值不參與聚合函數(shù)運(yùn)算。
2.聚合函數(shù)練習(xí)
使用學(xué)生表進(jìn)行聚合函數(shù)的練習(xí):
統(tǒng)計(jì)該表中一共有幾個(gè)學(xué)生:
select count(id) from stu;
上面我們使用某一字段進(jìn)行運(yùn)算,這樣做可能面臨的問(wèn)題是某一個(gè)值可能是NULL,所以我們一般使用 *
進(jìn)行運(yùn)算,因?yàn)橐恍兄胁豢赡芩械淖侄味际荖ULL。
select count(*) from stu;
查詢數(shù)學(xué)成績(jī)的平均分:
select avg(math) from stu;
8.5 分組查詢
1. 分組查詢語(yǔ)法
select 字段列表 from 表名 [where 分組前的條件限定] group by 分組字段名 [having 分組后的條件過(guò)濾]
注:分組之后,查詢的字段為聚合函數(shù)和分組字段,查詢其他字段無(wú)任何意義。
2. 分組查詢練習(xí)
使用學(xué)生表進(jìn)行分組查詢練習(xí):
查詢男同學(xué)和女同學(xué)各自的數(shù)學(xué)平均分,以及各自人數(shù),要求:分?jǐn)?shù)低于70分的不參與分組:
select gender, avg(math),count(*) from stu where math > 70 group by gender;
查詢男同學(xué)和女同學(xué)各自的數(shù)學(xué)平均分,以及各自人數(shù),要求:分?jǐn)?shù)低于70分的不參與分組,分組之后人數(shù)大于2個(gè)的:
select gender, avg(math),count(*) from stu where math > 70 group by gender having count(*) > 2;
注:where 和 having
執(zhí)行時(shí)機(jī)不一樣:where 是分組之前進(jìn)行限定,不滿足where條件,則不參與分組,而having是分組之后對(duì)結(jié)果進(jìn)行過(guò)濾。所以,where 不能對(duì)聚合函數(shù)進(jìn)行判斷,having 可以。
8.6 分頁(yè)查詢
1. 分頁(yè)查詢語(yǔ)法
在我們的印象中,網(wǎng)頁(yè)在展示大量的數(shù)據(jù)時(shí),往往不是把數(shù)據(jù)一下全部展示出來(lái),而是用分頁(yè)展示的形式,其實(shí)就是對(duì)數(shù)據(jù)進(jìn)行分頁(yè)查詢的操作,即每次只查詢一頁(yè)的數(shù)據(jù)展示到頁(yè)面上。
select 字段列表 from 表名 limit 查詢起始索引,查詢條目數(shù);
在 limit
關(guān)鍵字中,查詢起始索引這個(gè)參數(shù)是從0開始的。
2. 分頁(yè)查詢練習(xí)
使用學(xué)生表進(jìn)行分頁(yè)查詢練習(xí):
從0開始查詢,查詢3條數(shù)據(jù):
select * from stu limit 0,3;
起始索引 = (當(dāng)前頁(yè)碼 - 1) * 每頁(yè)顯示的條數(shù)
在SQL標(biāo)準(zhǔn)中,一共規(guī)定了6種不同的約束,
包括非空約束,唯一約束和檢查約束等,而在MySQL中是不支持檢查約束的,所以這篇文章先對(duì)其余5種約束做一個(gè)詳解和練習(xí)。
9. 約束的概念
約束是作用于表中列上的規(guī)則,用于限制加入表的數(shù)據(jù)。
例如,作為主鍵的列一定是非空的唯一的,否則將無(wú)法對(duì)數(shù)據(jù)進(jìn)行區(qū)分。約束的存在保證了數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性、有效性和完整性。所以約束在數(shù)據(jù)庫(kù)設(shè)計(jì)中是非常重要的。
10. 約束的分類
前面說(shuō)到SQL標(biāo)準(zhǔn)把約束分為了6大類,分別是非空約束,唯一約束,主鍵約束,檢查約束,默認(rèn)約束和外鍵約束,添加約束時(shí)我們只需要在SQL中添加關(guān)鍵詞,便可以限制表中的數(shù)據(jù)。
約束類型 | 功能 |
---|---|
非空約束 NOT NULL | 保證列中所有的數(shù)據(jù)不能有null值 |
唯一約束 UNIQUE | 保證列中所有數(shù)據(jù)各不相同 |
主鍵約束 PRIMARY KEY | 主鍵是一行數(shù)據(jù)的唯一標(biāo)識(shí),要求非空且唯一 |
檢查約束 CHECK | 保證列中的值滿足某一條件 |
默認(rèn)約束 DEFAULT | 保存數(shù)據(jù)時(shí),未指定值則采用默認(rèn)值 |
外鍵約束 FOREIGN KEY | 外鍵用來(lái)讓兩個(gè)表的數(shù)據(jù)之間建立鏈接,保證數(shù)據(jù)的一致性和完整性 |
11. 非空約束
目的:保證列中所有的數(shù)據(jù)不能有null值
添加約束:
CREATE TABLE 表名(
列名 數(shù)據(jù)類型 NOT NULL,
…
);
建完表后添加非空約束:
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型 NOT NULL;
刪除約束:
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型;
12. 唯一約束
目的:保證列中所有數(shù)據(jù)各不相同
添加約束:
CREATE TABLE 表名(
列名 數(shù)據(jù)類型 UNIQUE [AUTO_INCREMENT],
-- AUTO_INCREMENT: 當(dāng)不指定值時(shí)自動(dòng)增長(zhǎng)
…
);
CREATE TABLE 表名(
列名 數(shù)據(jù)類型,
…
[CONSTRAINT] [約束名稱] UNIQUE(列名)
);
建完表后添加唯有約束:
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型 UNIQUE;
刪除約束:
ALTER TABLE 表名 DROP INDEX 字段名;
【免費(fèi)贈(zèng)書】
【!參與方式!】
點(diǎn)贊+收藏+評(píng)論本文“人生苦短,我愛MySQL”
截止日期:2023-04-15 早上9:00
注:抽獎(jiǎng)方式為<程序隨機(jī)抽取>,會(huì)在我的主頁(yè)動(dòng)態(tài)如期公布中獎(jiǎng)?wù)撸]到家。
【內(nèi)容簡(jiǎn)介↓】
本書從分布式系統(tǒng)的基礎(chǔ)概念講起,逐步深入分布式系統(tǒng)中間件進(jìn)階實(shí)戰(zhàn),并在最后結(jié)合一個(gè)大型項(xiàng)目案例進(jìn)行講解,重點(diǎn)介紹了使用Spring Cloud框架整合各種分布式組件的過(guò)程,讓讀者不但可以系統(tǒng)地學(xué)習(xí)分布式中間件的相關(guān)知識(shí),而且還能對(duì)業(yè)務(wù)邏輯的分析思路、實(shí)際應(yīng)用開發(fā)有更為深入的理解。
全書共分12章,前3個(gè)章節(jié)是學(xué)習(xí)分布式系統(tǒng)架構(gòu)的準(zhǔn)備階段。第1章開篇部分,講解演進(jìn)過(guò)程中分布式系統(tǒng)是如何出現(xiàn)的;第2章Spring部分,講解如何搭建目前流行的Spring Boot和Spring Cloud框架;第3章容器部分,講解目前最流行的Docker容器技術(shù)和Kubernetes容器編排工具;第4~8章深入講解消息中間件RocketMQ的相關(guān)知識(shí),理論與實(shí)戰(zhàn)并存;第9章將深入RocketMQ底層,探索閱讀源碼的樂趣,掌握精通RocketMQ的同時(shí)學(xué)會(huì)閱讀源碼的方法;第10章和第11章講解分布式系統(tǒng)中必須考慮的問(wèn)題:分布式事務(wù)與分布式鎖;第12章以一個(gè)電商系統(tǒng)業(yè)務(wù)為例,讓讀者體驗(yàn)一個(gè)項(xiàng)目從無(wú)到有的過(guò)程,并學(xué)以致用。
本書內(nèi)容由淺入深、結(jié)構(gòu)清晰、實(shí)例豐富、通俗易懂、實(shí)用性強(qiáng),適合需要全方位學(xué)習(xí)分布式中間件相關(guān)技術(shù)的人員,也適合培訓(xùn)學(xué)校作為培訓(xùn)教材,還可作為大、中專院校相關(guān)專業(yè)的教學(xué)參考書。
京東自營(yíng)購(gòu)買鏈接:《分布式中間件核心原理與RocketMQ最佳實(shí)踐》文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-418802.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-418802.html
到了這里,關(guān)于【數(shù)據(jù)庫(kù)通關(guān)之路】 MySQL 全路線學(xué)習(xí)知識(shí)點(diǎn)梳理(中)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!