【D1n910】(13/42)學(xué)習(xí)【MySQL數(shù)據(jù)庫(kù)】C++語(yǔ)言程序設(shè)計(jì) - MySQL數(shù)據(jù)庫(kù)的筆記
正常操作,正常分析,大家好,我是D1N910,這是我觀看【MySQL數(shù)據(jù)庫(kù)】C++語(yǔ)言程序設(shè)計(jì) - MySQL數(shù)據(jù)庫(kù)從而整理的學(xué)習(xí)筆記。我會(huì)繼續(xù)努力的。
本篇 D1n910】(13/42)學(xué)習(xí)【MySQL數(shù)據(jù)庫(kù)】C++語(yǔ)言程序設(shè)計(jì) - MySQL數(shù)據(jù)庫(kù)的筆記
的主要內(nèi)容是 MySQL數(shù)據(jù)庫(kù) 的增刪改查!
小知識(shí)點(diǎn),desc 指令可以查看表結(jié)構(gòu),desc = description
description
n. 描述;說明;形容;描寫(文字);類型
舉個(gè)例子:
學(xué)習(xí)自

如果你沒看過之前的專欄內(nèi)容,那么強(qiáng)烈建議一定要先看看再繼續(xù)往下看




Unit 6 DML 操作
DML 數(shù)據(jù)操縱語(yǔ)言(Data Manipulation Language, DML)
1.插入語(yǔ)句 insert
語(yǔ)法
insert into 表名 [(字段列表)] values (值列表);
其中字段列表帶中括號(hào)就是可以不填寫,默認(rèn)則匹配全部字段。
一般場(chǎng)景
有自增長(zhǎng)字段的場(chǎng)景
這里能夠看到class_no不是按順序的原因是因?yàn)槲抑坝?insert 語(yǔ)句的時(shí)候插入失敗了幾次,但是這也同樣會(huì)占用自增長(zhǎng)的編號(hào)的。所以自增長(zhǎng)的編號(hào)只是唯一的,但不是說一定是連續(xù)的。
插入有使用默認(rèn)值的場(chǎng)景
回顧課程表的字段信息
已添加的教師信息
自增長(zhǎng)字段可以直接用null,默認(rèn)值字段想用默認(rèn)值得用 default;
如果想要在values中缺省默認(rèn)值字段,可以在表后括號(hào)內(nèi)指定填寫的字段;
?? 錯(cuò)誤示例,違反了外鍵約束:插入了不存在的教師編號(hào) 007
???錯(cuò)誤示例,違反了唯一約束:插入了重復(fù)的教師編號(hào) 001;
教師編號(hào) teacher_no 是我們之前設(shè)置了 unique 的字段.
批量插入多行數(shù)據(jù)
如果這邊報(bào)錯(cuò)
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`choose`.`student`, CONSTRAINT `students_class_fk` FOREIGN KEY (`class_no`) REFERENCES `classes` (`class_no`))
這是因?yàn)橥怄I限制, classes 表的?class_no 字段和要添加的不符合
修改后就OK了
Insert...select語(yǔ)句
-- 在insert語(yǔ)句中使用select子句可以將源表的查詢結(jié)果添加到目標(biāo)表中
語(yǔ)法
如果目標(biāo)表名和復(fù)制的表的字段一樣,那么字段列表1就是可選的,用 * 表示全部
示例
* like 在之前學(xué)過是用來拷貝表結(jié)構(gòu)而不包含表數(shù)據(jù)。
這個(gè)的作用主要是對(duì)原表進(jìn)行備份
2.update語(yǔ)句 更新SQL數(shù)據(jù) 更新數(shù)據(jù)
語(yǔ)法
示例
創(chuàng)建表 score,包含如下字段:
添加測(cè)試數(shù)據(jù)
先創(chuàng)建一個(gè) exam 表來作測(cè)試用
更改多個(gè)字段
執(zhí)行結(jié)果如下
測(cè)試更新語(yǔ)句違反外鍵約束的場(chǎng)景
這里的原因是子表中已經(jīng)有引用了 class_no 為 3 的外鍵了,那么改主表的?class_no 3 為 4就會(huì)報(bào)錯(cuò)。
1.3.刪除語(yǔ)句
回顧原來exam表中的數(shù)據(jù)
使用 where 進(jìn)行刪除
可以看到 exam_score 小于 45 的 stu_no=5 的數(shù)據(jù)被刪除了。
沒有 where 進(jìn)行刪除
統(tǒng)統(tǒng)干掉惹 ψ(`?′)ψ
進(jìn)行違反外鍵約束的刪除
可以看到刪除失敗了,原因是子表還用著 class_no=1 的數(shù)據(jù)捏?╮(╯_╰)╭
1.4.truncate語(yǔ)句
truncate
vt.截?cái)?截短,縮短,刪節(jié)(尤指掐頭或去尾)
adj.截短的;被刪節(jié)的
--來自百度翻譯
語(yǔ)法
> truncate table table_name;
功能
截?cái)啾?,雖然不是增刪改,功能上相當(dāng)于沒有where子句的delete
語(yǔ)句示例
>使用truncate語(yǔ)句刪除表score中的數(shù)據(jù)
直接清理掉了 ヾ(?ε?`*)
>使用truncate語(yǔ)句刪除表student中的數(shù)據(jù)
失敗了 ヾ(?ε?`*)
>?使用truncate語(yǔ)句階段數(shù)據(jù)后會(huì)使得自增字段恢復(fù)初始值,回憶之前設(shè)定的 exam的內(nèi)容,stu_no是自增字段
Unit 7 基本查詢語(yǔ)句
目錄
select語(yǔ)句
使用select子句指定字段列表
基本查詢語(yǔ)句
使用distinct過濾結(jié)果集中重復(fù)數(shù)據(jù)
使用imit限定返回行數(shù)
1.select語(yǔ)句
select語(yǔ)句的語(yǔ)法格式如下
select 字段列表 from 數(shù)據(jù)源
[ where 條件表達(dá)式]
????[ group by 分組字段[ having 條件表達(dá)式]]
????????[ order by 排序字段 [asc|desc]]
其中
字段列表:指定要檢索的字段,* 表示全部字段
數(shù)據(jù)源:檢索的表或視圖
where子句:用于指定記錄的過濾條件,是結(jié)果為真或者假的表達(dá)式
group by子句:用于對(duì)檢索數(shù)據(jù)進(jìn)行分組,
Having子句:依附于?group by?的。只有g(shù)roup by語(yǔ)句中才能用。對(duì)分組后的數(shù)據(jù)進(jìn)行篩選,篩選后選擇符合條件的組
order by子句:用于對(duì)結(jié)果集進(jìn)行排序?asc/decs 升序/降序
2.使用select子句指定字段列表
字段列表的指定方式
示例
????使用表達(dá)式
前面的我們都清楚,使用函數(shù)的意思就是select 能夠讓 mysql 執(zhí)行函數(shù)然后返回結(jié)果。
其中version、now是mysql 內(nèi)置的函數(shù)
????命名別名
????????很明顯,上面直接用函數(shù)名或者1+1等作為表頭不是很好看,那么可以另起一個(gè)名稱,函數(shù)后接 as+別名,或者直接省略 as 然后加別名即可。
????????字段或表達(dá)式 [as] 別名
????????select version() as 版本號(hào),now() 服務(wù)器時(shí)間
order by子句:用于對(duì)結(jié)果集進(jìn)行排序?asc/decs 升序/降序
默認(rèn)是 asc,升序 ascend
如果要降序,必須寫 desc,下降
3.基本查詢語(yǔ)句
下面可以看出 select 后面跟著的字段內(nèi)容就是在努力地為輸出表格而服務(wù)的。
下面再看看函數(shù)方面的應(yīng)用,下面是我們前面定義的 exam 表。
插入一個(gè)數(shù)據(jù)
上面是三列,通過函數(shù)能夠得到?exam_score、regular_score 得到的一個(gè)成績(jī)
同樣我們也可以用別名使得得到的表頭更好看。
4.使用distinct過濾結(jié)果集中重復(fù)數(shù)據(jù)
distinct
adj.不同的;明顯的;清晰的;清楚的;明白的;有區(qū)別的;不同種類的;確定無疑的;確切的
-- 來自百度翻譯
正常查詢完整的表時(shí),因?yàn)橛?primary key 主鍵對(duì)應(yīng)的列,那么就不會(huì)有重復(fù)的行,
但是如果只是部分查詢表,只是部分列的話,那么極有可能就有重復(fù)的行,
可利用distinct過濾結(jié)果集中重復(fù)數(shù)據(jù)。只用在select和字段列表之間加?distinct 這∫個(gè)單詞就行。
示例
????單列
????多列
其中
tables是系統(tǒng)數(shù)據(jù)庫(kù)information_schema中的一張表,用來保存數(shù)據(jù)庫(kù)中表和視圖的信息。
能夠看到 TABLES

這里關(guān)注 tables 的三個(gè)字段:

查詢數(shù)據(jù)

這里我們的一共有338行數(shù)據(jù)

可以看出表名基本上不會(huì)重復(fù),但是數(shù)據(jù)庫(kù)名和類型就重復(fù)很多了。如果我們查詢時(shí)候不包含表名,會(huì)發(fā)現(xiàn)包含大量的重復(fù)數(shù)據(jù)。
得到的很多行。

使用 distinct 后,就只有五行了。
5.使用imit限定返回行數(shù)
limit 不在SQL中要求,但是不同產(chǎn)品都會(huì)有這樣的需求,所以每個(gè)產(chǎn)品使用的方式可能都不同,這個(gè)limit只是 MySQL 的用法。這個(gè)操作有一個(gè)統(tǒng)一的名稱叫分頁(yè)。

語(yǔ)法
? ??
其中:
start: 表示從第一行記錄開始檢索,缺省值為0,表示第一行
length: 表示要檢索的行數(shù)
示例
列出information_schema.tables表中的前10行記錄的table_schema, table_name
列出information_schema.tables表中的第七頁(yè)(每頁(yè)10行)。這里為什么第七頁(yè)是從60行開始?
原因 0行~9行 是第一頁(yè),即第一頁(yè)的第一行是整張表的第0行(下標(biāo)從0開始)。
第n頁(yè)的第一行就是?(n-1)*10=60.
那么第七頁(yè)的第一行就是 (7-1)*10=60.
同樣成功。
注意,各人表不同,也許你處輸出結(jié)果和我不一樣,無礙。

未完待續(xù)
學(xué)習(xí)進(jìn)度(13/42)
恭喜你掌握 SQL 的增刪改查!