mysql基础操作(详细版)--增删改查
文章目錄
- 1.數(shù)據(jù)類型
- 2.運(yùn)算符
- 3.正則表達(dá)式
- 4.多表關(guān)系
- 5.常用的邏輯關(guān)鍵字
- ——————————
- 1.數(shù)據(jù)庫(kù)常用操作
- 表常用操作
- 2.創(chuàng)建表
- 3.數(shù)據(jù)插入
- 4.數(shù)據(jù)修改
- 5.數(shù)據(jù)刪除
- 6.數(shù)據(jù)約束
- 6.1主鍵約束
- 6.2自增長(zhǎng)約束
- 6.3非空約束
- 6.4唯一約束
- 6.5默認(rèn)約束
- 6.6零填充約束
- 6.7外鍵約束
- 7.DQL查詢
- **7.1簡(jiǎn)單查詢示例**
- **7.2條件查詢示例**
- 7.3排序查詢
- 7.4聚合查詢
- 7.5分組查詢
- 7.6分頁(yè)查詢
- 8.數(shù)據(jù)復(fù)制
- 9.多表聯(lián)合查詢
- 9.1交叉連接查詢
- 9.2內(nèi)連接查詢
- 9.3外連接查詢
- 9.4子查詢
- 9.5自關(guān)聯(lián)查詢
- 9.4子查詢
- 9.5自關(guān)聯(lián)查詢
1.數(shù)據(jù)類型
數(shù)據(jù)類型:在創(chuàng)建表的時(shí)候?yàn)楸碇凶侄沃付〝?shù)據(jù)類型,只有數(shù)據(jù)符合類型要求才能存儲(chǔ)起來
**原則:**夠用就行,盡量使用取值范圍小的,而不用大的,這樣可以更多的節(jié)省存儲(chǔ)空間。
分類:
- 數(shù)值類型:
| TINYINT | 1 byte | (-128,127) | (0,255) | 小整數(shù)值 |
| SMALLINT | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整數(shù)值 |
| MEDIUMINT | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數(shù)值 |
| INT或INTEGER | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數(shù)值 |
| BIGINT | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數(shù)值 |
| FLOAT | 4 bytes | (-3.402 823 466 E+38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點(diǎn)數(shù)值 |
| DOUBLE | 8 bytes | (-1.797 693 134 862 315 7 E+308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點(diǎn)數(shù)值 |
| DECIMAL | 依賴于M和D的值 | 依賴于M和D的值 | 小數(shù)值 |
- 字符串類型:
| CHAR | 0-255 bytes | 定長(zhǎng)字符串 |
| VARCHAR | 0-65535 bytes | 變長(zhǎng)字符串 |
| TINYBLOB | 0-255 bytes | 不超過 255 個(gè)字符的二進(jìn)制字符串 |
| TINYTEXT | 0-255 bytes | 短文本字符串 |
| BLOB | 0-65 535 bytes | 二進(jìn)制形式的長(zhǎng)文本數(shù)據(jù) |
| TEXT | 0-65 535 bytes | 長(zhǎng)文本數(shù)據(jù) |
| MEDIUMBLOB | 0-16 777 215 bytes | 二進(jìn)制形式的中等長(zhǎng)度文本數(shù)據(jù) |
| MEDIUMTEXT | 0-16 777 215 bytes | 中等長(zhǎng)度文本數(shù)據(jù) |
| LONGBLOB | 0-4 294 967 295 bytes | 二進(jìn)制形式的極大文本數(shù)據(jù) |
| LONGTEXT | 0-4 294 967 295 bytes | 極大文本數(shù)據(jù) |
- 日期類型:
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 時(shí)間值或持續(xù)時(shí)間 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時(shí)間值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結(jié)束時(shí)間是第 2147483647 秒,北京時(shí)間 2038-1-19 11:14:07,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時(shí)間值,時(shí)間戳 |
2.運(yùn)算符
概述:數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)確立后,表中的數(shù)據(jù)代表的意義就已經(jīng)確定。通過MySQL運(yùn)算符進(jìn)行運(yùn)算,就可以獲取到表結(jié)構(gòu)以外的另一種數(shù)據(jù)。例如,學(xué)生表中存在一個(gè)birth字段,這個(gè)字段表示學(xué)生的出生年份。而運(yùn)用MySQL的算術(shù)運(yùn)算符用當(dāng)前的年份減學(xué)生出生的年份,那么得到的就是這個(gè)學(xué)生的實(shí)際年齡數(shù)據(jù)。
分類:
- 算術(shù)運(yùn)算符:
| + | 加法運(yùn)算 |
| - | 減法運(yùn)算 |
| * | 乘法運(yùn)算 |
| / 或 DIV | 除法運(yùn)算,返回商 |
| % 或 MOD | 求余運(yùn)算,返回余數(shù) |
- 比較運(yùn)算符:
| = | 等于 |
| < 和 <= | 小于和小于等于 |
| > 和 >= | 大于和大于等于 |
| <=> | 安全的等于,兩個(gè)操作碼均為NULL時(shí),其所得值為1;而當(dāng)一個(gè)操作碼為NULL時(shí),其所得值為0 |
| <> 或!= | 不等于 |
| IS NULL 或 ISNULL | 判斷一個(gè)值是否為 NULL |
| IS NOT NULL | 判斷一個(gè)值是否不為 NULL |
| LEAST | 當(dāng)有兩個(gè)或多個(gè)參數(shù)時(shí),返回最小值 |
| GREATEST | 當(dāng)有兩個(gè)或多個(gè)參數(shù)時(shí),返回最大值 |
| BETWEEN AND | 判斷一個(gè)值是否落在兩個(gè)值之間 |
| IN | 判斷一個(gè)值是IN列表中的任意一個(gè)值 |
| NOT IN | 判斷一個(gè)值不是IN列表中的任意一個(gè)值 |
| LIKE | 通配符匹配 |
| REGEXP | 正則表達(dá)式匹配 |
- 邏輯運(yùn)算符:
| NOT 或者 ! | 邏輯非 |
| AND 或者 && | 邏輯與 |
| OR 或者 || | 邏輯或 |
| XOR | 邏輯異或 |
- 位運(yùn)算符:
| | | 按位或 |
| & | 按位與 |
| ^ | 按位異或 |
| << | 按位左移 |
| >> | 按位右移 |
| ~ | 按位取反,反轉(zhuǎn)所有比特 |
3.正則表達(dá)式
概述:
- 正則表達(dá)式(regularexpression)描述了一種字符串匹配的規(guī)則,正則表達(dá)式本身就是一個(gè)字符串,使用這個(gè)字符串來描述、用來定義匹配規(guī)則,匹配一系列符合某個(gè)句法規(guī)則的字符串。在開發(fā)中,正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)規(guī)則的文本。
- MySQL通過REGEXP關(guān)鍵字支持正則表達(dá)式進(jìn)行字符串匹配。
| ^ | 匹配輸入字符串的開始位置。 |
| $ | 匹配輸入字符串的結(jié)束位置。 |
| . | 匹配除 “\n” 之外的任何單個(gè)字符。 |
| […] | 字符集合。匹配所包含的任意一個(gè)字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a(chǎn)’。 |
| [^…] | 負(fù)值字符集合。匹配未包含的任意字符。例如, ‘**[^**abc]’ 可以匹配 “plain” 中的’p’。 |
| p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 則匹配 “zood” 或 “food”。 |
| * | 匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價(jià)于{0,}。 |
| + | 匹配前面的子表達(dá)式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價(jià)于 {1,}. |
| {n} | n 是一個(gè)非負(fù)整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個(gè) o。 |
| {n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
正則表達(dá)式示例:
- ^ 在字符串開始處進(jìn)行匹配
SELECT ‘a(chǎn)bc’ REGEXP ‘^a’;
- $ 在字符串末尾開始匹配
SELECT ‘a(chǎn)bc’ REGEXP ‘a(chǎn)$’;
SELECT ‘a(chǎn)bc’ REGEXP 'c$’;
- . 匹配任意字符
SELECT ‘a(chǎn)bc’ REGEXP ‘.b’;
SELECT ‘a(chǎn)bc’ REGEXP ‘.c’;
SELECT ‘a(chǎn)bc’ REGEXP ‘a(chǎn).’;
- […] 匹配括號(hào)內(nèi)的任意單個(gè)字符
SELECT ‘a(chǎn)bc’ REGEXP ‘[xyz]’;
SELECT ‘a(chǎn)bc’ REGEXP ‘[xaz]’;
- [^…] 注意^符號(hào)只有在[]內(nèi)才是取反的意思,在別的地方都是表示開始處匹配
SELECT ‘a(chǎn)’ REGEXP ‘[^abc]’;
- a* 匹配0個(gè)或多個(gè)a,包括空字符串。 可以作為占位符使用.有沒有指定字符都可以匹配到數(shù)據(jù)
SELECT 'stab’REGEXP ‘.ta*b’;
SELECT 'stb’REGEXP ‘.ta*b’;
SELECT ''REGEXP ‘a(chǎn)*’;
- a+ 匹配1個(gè)或者多個(gè)a,但是不包括空字符
SELECT ‘stab’ REGEXP ‘.ta+b’;
SELECT ‘stb’ REGEXP ‘.ta+b’;
- a? 匹配0個(gè)或者1個(gè)a
SELECT 'stb’REGEXP ‘.ta?b’;
SELECT 'stab’REGEXP ‘.ta?b’;
SELECT 'staab’REGEXP ‘.ta?b’;
- a1|a2 匹配a1或者a2,
SELECT ‘a(chǎn)’ REGEXP ‘a(chǎn)|b’;
SELECT ‘b’ REGEXP ‘a(chǎn)|b’;
SELECT ‘b’ REGEXP ‘^(a|b)’;
SELECT ‘a(chǎn)’ REGEXP ‘^(a|b)’;
SELECT ‘c’ REGEXP ‘^(a|b)’;
- a{m} 匹配m個(gè)a
SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{4}c’;
SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{3}c’;
- a{m,n} 匹配m到n個(gè)a,包含m和n
SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{3,5}c’;
SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{4,5}c’;
SELECT ‘a(chǎn)uuuuc’ REGEXP ‘a(chǎn)u{5,10}c’;
- (abc) abc作為一個(gè)序列匹配,不用括號(hào)括起來都是用單個(gè)字符去匹配,如果要把多個(gè)字符作為一個(gè)整體去匹配就需要用到括號(hào),所以括號(hào)適合上面的所有情況。
SELECT 'xababy’REGEXP ‘x(abab)y’;
SELECT 'xababy’REGEXP ‘x(ab)*y’;
SELECT 'xababy’REGEXP ‘x(ab){1,2}y’;
4.多表關(guān)系
分類:
一對(duì)一關(guān)系:
- 一個(gè)學(xué)生只有一張身份證;一張身份證只能對(duì)應(yīng)一學(xué)生。
- 在任一表中添加唯一外鍵,指向另一方主鍵,確保一對(duì)一關(guān)系。
- 一般一對(duì)一關(guān)系很少見,遇到一對(duì)一關(guān)系的表最好是合并表。
一對(duì)多或多對(duì)一關(guān)系:
- 一個(gè)部門有多個(gè)員工,一個(gè)員工只能對(duì)應(yīng)一個(gè)部門
- 實(shí)現(xiàn)原則:在多的一方建立外鍵,指向一的一方的主鍵
多對(duì)多關(guān)系:
- 一個(gè)學(xué)生可以選擇很多門課程,一個(gè)課程也可以被很多學(xué)生選擇
- 實(shí)現(xiàn)原則:多對(duì)多關(guān)系實(shí)現(xiàn)需要借助第三張中間表。中間表至少包含兩個(gè)字段,將多對(duì)多的關(guān)系,拆成一對(duì)多的關(guān)系,中間表至少要有兩個(gè)外鍵,這兩個(gè)外鍵分別指向原來的那兩張表的主鍵
5.常用的邏輯關(guān)鍵字
- ALL關(guān)鍵字
格式:
select…from …wherec > all(查詢語(yǔ)句)
–等價(jià)于:
select…from … where c > result1 and c > result2 and c > result3
特點(diǎn):
– 查詢年齡大于‘1003’部門所有年齡的員工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
–查詢不屬于任何一個(gè)部門的員工信息
select* from emp3 where dept_id != all(selectdeptno from dept3);
- ANY關(guān)鍵字、SOME關(guān)鍵字
格式:
select …from …where c > any(查詢語(yǔ)句)
–等價(jià)于:
select …from … where c > result1 or c > result2 or c > result3
特點(diǎn):
– 查詢年齡大于‘1003’部門任意一個(gè)員工年齡的員工信息
select * from emp3 where age > all(select age from emp3 where dept_id = '1003’);
- IN關(guān)鍵字
格式:
select …from …where c in(查詢語(yǔ)句)
–等價(jià)于:
select …from … where c = result1 or c = result2 or c =result3
特點(diǎn):
– 查詢研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;
- EXISTS關(guān)鍵字
格式:
select …from …where exists(查詢語(yǔ)句)
特點(diǎn):
– 查詢公司是否有大于60歲的員工,有則輸出
select * from emp3 a where exists(select * from emp3 b where a.age > 60);
– 查詢有所屬部門的員工信息
select* from emp3 a where exists(select* from dept3 b where a.dept_id =b.deptno);
——————————
1.數(shù)據(jù)庫(kù)常用操作
-
show databases; 查看所有數(shù)據(jù)庫(kù)
create databases 數(shù)據(jù)庫(kù)名; 創(chuàng)建數(shù)據(jù)庫(kù)
use 數(shù)據(jù)庫(kù)名; 使用數(shù)據(jù)庫(kù)
-
表常用操作
| 查看當(dāng)前數(shù)據(jù)庫(kù)的所有表名稱 | show tables; |
| 查看指定某個(gè)表的創(chuàng)建語(yǔ)句 | show create table 表名; |
| 查看表結(jié)構(gòu) | desc 表名 |
| 刪除表 | drop table 表名 |
| 表添加列 | alter table 表名 add 列名 類型(長(zhǎng)度) [約束]; |
| 修改列名和類型 | alter table 表名 change 舊列名新列名類型(長(zhǎng)度) 約束; |
| 表刪除列 | alter table 表名 drop 列名; |
| 修改表名 | rename table 表名 to 新表名; |
2.創(chuàng)建表
普通創(chuàng)建表:
create table [if not exists]表名(
字段名1 類型【寬度】 【約束條件】 [comment ‘字段說明’],
字段名2 類型【寬度】 【約束條件】 [comment ‘字段說明’],
字段名3 類型【寬度】 【約束條件】 [comment ‘字段說明’]
)[表的一些設(shè)置];
3.數(shù)據(jù)插入
- INSERT INTO 表名 values(屬性值,屬性值…);
insert into student values(1001,‘男’,18,‘1996-12-23’,‘北京’,83.5);
4.數(shù)據(jù)修改
- update 表名 set 字段名=值,字段名=值…;
updatestudent set address ='重慶’;
- update 表名 set 字段名=值,字段名=值… where 條件;
updatestudent set address ='北京’where id =1004
5.數(shù)據(jù)刪除
- delete from表名 [where條件];
– 刪除sid為1004的學(xué)生數(shù)據(jù)
delete from student where sid = 1004;
– 刪除表所有數(shù)據(jù)
delete from student;
- truncate table 表名 或者 truncate表名
– 清空表數(shù)據(jù)
truncate table student;
truncate student;
區(qū)別:delete和truncate原理不同,delete只刪除內(nèi)容,而truncate類似于drop table ,可以理解為先將整個(gè)表刪除,然后再創(chuàng)建該表。
6.數(shù)據(jù)約束
概述:表中數(shù)據(jù)的限制條件
目的:就是為了保證表中的記錄完整性和有效性,比如用戶表有些列的值(手機(jī)號(hào))不能為空,有些列的值(身份證號(hào))不能重復(fù)。
分類:
- 主鍵約束(primary key) PK
- 自增長(zhǎng)約束(auto_increment)
- 非空約束(not null)
- 唯一性約束(unique)
- 默認(rèn)約束(default)
- 零填充約束(zerofill)
- 外鍵約束(foreign key) FK
6.1主鍵約束
概述:
- MySQL主鍵約束是一個(gè)列或者多個(gè)列的組合,其值能唯一地標(biāo)識(shí)表中的每一行,方便在RDBMS中盡快的找到某一行。
- 主鍵約束相當(dāng)于唯一約束 + 非空約束的組合,主鍵約束列不允許重復(fù),也不允許出現(xiàn)空值。
- 每個(gè)表最多只允許一個(gè)主鍵
- 主鍵約束的關(guān)鍵字是:primary key
- 當(dāng)創(chuàng)建主鍵的約束時(shí),系統(tǒng)默認(rèn)會(huì)在所在的列和列組合上建立對(duì)應(yīng)的唯一索引
添加單列主鍵:
- 方式1:
create table 表名(
…
<字段名> <數(shù)據(jù)類型> primary key
… );
- 方式2:
create table 表名(
…
[constraint <約束名>] primary key [字段名] );
添加多列主鍵(聯(lián)合主鍵):
create table 表名(
…
primary key (字段1,字段2,…,字段n)
);
除此之外,還可以在表創(chuàng)建之后對(duì)表結(jié)構(gòu)修改來對(duì)主鍵進(jìn)行操作
- 添加主鍵:
alter table <表名> add primary key(字段列表);
- 刪除主鍵:
alter table <數(shù)據(jù)表名> drop primary key;
6.2自增長(zhǎng)約束
概述:
- 在 MySQL中,當(dāng)主鍵定義為自增長(zhǎng)后,這個(gè)主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)定義自動(dòng)賦值。每增加一條記錄,主鍵會(huì)自動(dòng)以相同的步長(zhǎng)進(jìn)行增長(zhǎng)。
- 通過給字段添加 auto_increment 屬性來實(shí)現(xiàn)主鍵自增長(zhǎng)
特點(diǎn):
- 默認(rèn)情況下,auto_increment的初始值是 1,每新增一條記錄,字段值自動(dòng)加 1。
- 一個(gè)表中只能有一個(gè)字段使用 auto_increment約束,且該字段必須有唯一索引,以避免序號(hào)重復(fù)(即為主鍵或主鍵的一部分)。
- auto_increment約束的字段必須具備 NOT NULL 屬性。
- auto_increment約束的字段只能是整數(shù)類型(TINYINT、SMALLINT、INT、BIGINT 等)。
- auto_increment約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達(dá)到上限,auto_increment就會(huì)失效。
添加自定義約束:
create table t_user1(
id int primary key auto_increment,
name varchar(20) );
自定義約束初始值設(shè)置:
- 方式1:
– 方式1,創(chuàng)建表時(shí)指定
create table t_user2 (
id int primary key auto_increment,
name varchar(20)
)auto_increment=100;
- 方式2:
alter table t_user2 auto_increment=100;
問:delete和truncate在刪除后自增列的變化
答:delete數(shù)據(jù)之后自動(dòng)增長(zhǎng)從斷點(diǎn)開始,truncate數(shù)據(jù)之后自動(dòng)增長(zhǎng)從默認(rèn)起始值開始。
6.3非空約束
概述:非空約束(not null)指字段的值不能為空。對(duì)于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時(shí)沒有指定值,數(shù)據(jù)庫(kù)系統(tǒng)就會(huì)報(bào)錯(cuò)。
添加非空約束:
- 方式1:<字段名><數(shù)據(jù)類型> not null;
- 方式2:alter table 表名 modify 字段類型 not null;
刪除非空約束:
- alter table 表名 modify 字段 類型;
6.4唯一約束
概述:唯一約束(Unique Key)是指所有記錄中字段的值不能重復(fù)出現(xiàn)。例如,為 id 字段加上唯一性約束后,每條記錄的 id 值都是唯一的,不能出現(xiàn)重復(fù)的情況
添加唯一約束:
- 方式1:<字段名> <數(shù)據(jù)類型> unique
- 方式2: altertable 表名add constraint 約束名 unique(列名);
刪除唯一約束:
- alter table <表名> drop index <唯一約束名>;
6.5默認(rèn)約束
概述:MySQL 默認(rèn)值約束用來指定某列的默認(rèn)值。
添加默認(rèn)約束:
- 方式1:<字段名> <數(shù)據(jù)類型> default <默認(rèn)值>;
- 方式2:alter table 表名 modify 列名 類型 default 默認(rèn)值;
刪除默認(rèn)約束:
alter table <表名> modify column <字段名> <類型> default null;
6.6零填充約束
概述:
-
插入數(shù)據(jù)時(shí),當(dāng)該字段的值的長(zhǎng)度小于定義的長(zhǎng)度時(shí),會(huì)在該值的前面補(bǔ)上相應(yīng)的0
-
zerofill默認(rèn)為int(10)
-
當(dāng)使用zerofill時(shí),默認(rèn)會(huì)自動(dòng)加unsigned(無符號(hào))屬性,使用unsigned屬性后,數(shù)值范圍是原值的2倍,例如,有符號(hào)為-128+127,無符號(hào)為0256
添加零填充約束:
<字段名> <數(shù)據(jù)類型> zerofill;
6.7外鍵約束
概述:
- MySQL外鍵約束(FOREIGN KEY)是表的一個(gè)特殊字段,經(jīng)常與主鍵約束一起使用。對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
- 外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。比如,一個(gè)水果攤,只有蘋果、桃子、李子、西瓜等4 種水果,那么,你來到水果攤要買水果就只能選擇蘋果、桃子、李子和西瓜,其它的水果都是不能購(gòu)買的。
特點(diǎn):
- 主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表。
- 必須為主表定義主鍵。
- 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這 個(gè)外鍵的內(nèi)容就是正確的。
- 在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。
- 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
- 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類型相同
創(chuàng)建外鍵約束:
- 方式1(在create table語(yǔ)句中定義):
[constraint <外鍵名>] foreign key 字段名 [,字段名2,…] references <主表名> 主鍵列1 [,主鍵列2,…]
- 方式2(修改表的結(jié)構(gòu)):
alter table <數(shù)據(jù)表名> add constraint <外鍵名> foreign key(<列名>) references <主表名> (<列名>);
外鍵約束下,添加數(shù)據(jù):必須先給主表添加數(shù)據(jù),不然由于外鍵約束,主表不存在該列的值,就無法給從表添加數(shù)據(jù)。
外鍵約束下,刪除數(shù)據(jù):主表的數(shù)據(jù)被從表依賴時(shí),不能刪除,否則可以刪除;從表的數(shù)據(jù)可以隨便刪除。
刪除外鍵約束:
alter table <表名> drop foreign key <外鍵約束名>;
多對(duì)多關(guān)系下添加外鍵約束:在兩個(gè)表為多對(duì)多關(guān)系是需要一個(gè)中間表,將中間表作為從表,分別與其他兩個(gè)表建立外鍵約束。
7.DQL查詢
概述:
- 數(shù)據(jù)庫(kù)管理系統(tǒng)一個(gè)重要功能就是數(shù)據(jù)查詢,數(shù)據(jù)查詢不應(yīng)只是簡(jiǎn)單返回?cái)?shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),還應(yīng)該根據(jù)需要對(duì)數(shù)據(jù)進(jìn)行篩選以及確定數(shù)據(jù)以什么樣的格式顯示。
- MySQL提供了功能強(qiáng)大、靈活的語(yǔ)句來實(shí)現(xiàn)這些操作。
- MySQL數(shù)據(jù)庫(kù)使用select語(yǔ)句來查詢數(shù)據(jù)。
語(yǔ)法格式:
SELECT
selection_list /要查詢的列名稱/
FROM
table_list /要查詢的表名稱/
WHERE
condition /行條件/
GROUP BY
grouping_columns /對(duì)結(jié)果分組/
HAVING
condition /分組后的行條件/
ORDER BY
sorting_columns /對(duì)結(jié)果分組/
LIMIT
offset_start, row_count /結(jié)果限定/
7.1簡(jiǎn)單查詢示例
- 查詢所有的商品.
select * from product;
- 查詢商品名和商品價(jià)格.
select pname,price from product;
- 別名查詢.使用的關(guān)鍵字是as(as可以省略的).
– 表別名:
select * from product as p;
– 列別名:
select pname as pn from product;
- 去掉重復(fù)值.
select distinct price from product;
- 查詢結(jié)果是表達(dá)式(運(yùn)算查詢):將所有商品的價(jià)格+10元進(jìn)行顯示.
select pname,price+10 from product;
7.2條件查詢示例
- 查詢商品名稱為“海爾洗衣機(jī)”的商品所有信息:
select * from product where pname = ‘海爾洗衣機(jī)’;
- 查詢價(jià)格為800商品
select * from product where price = 800;
- 查詢價(jià)格不是800的所有商品
select * from product where price != 800;
select * from product where price <> 800;
select * from product where not(price = 800);
- 查詢商品價(jià)格大于60元的所有商品信息
select * from product where price > 60;
- 查詢商品價(jià)格在200到1000之間所有商品
select * from product where price >= 200 and price <=1000;
select * from product where price between 200 and 1000;
- 查詢商品價(jià)格是200或800的所有商品
select * fromproduct where price = 200 or price = 800;
select * fromproduct where price in (200,800);
- 查詢含有‘褲’字的所有商品
select * fromproduct where pname like ‘%褲%';
- 查詢以’海’開頭的所有商品
select * fromproduct where pname like ‘海%’;
- 查詢第二個(gè)字為’蔻’的所有商品
select * fromproduct where pname like ‘_蔻%’;
- 查詢category_id為null的商品
select * fromproduct where category_id is null;
- 查詢category_id不為null分類的商品
select * fromproduct where category_id is not null;
- 使用least求最小值
select least(10, 20, 30); – 10
select least(10, null , 30); --null
- 使用greatest求最大值
select greatest(10, 20, 30);
select greatest(10, null, 30); --null
7.3排序查詢
特點(diǎn):
- asc代表升序,desc代表降序,如果不寫默認(rèn)升序
- orderby用于子句中可以支持單個(gè)字段,多個(gè)字段,表達(dá)式,函數(shù),別名
- orderby子句,放在查詢語(yǔ)句的最后面。LIMIT子句除外
排序查詢示例:
- 使用價(jià)格排序(降序)
select * from product order by price desc;
- 在價(jià)格排序(降序)的基礎(chǔ)上,以分類排序(降序)
select * from product order by price desc,category_id asc;
- 顯示商品的價(jià)格(去重復(fù)),并排序(降序)
select distinct price from product order by price desc;
7.4聚合查詢
概述:之前我們做的查詢都是橫向查詢,它們都是根據(jù)條件一行一行的進(jìn)行判斷,而使用聚合函數(shù)查詢是縱向查詢,它是對(duì)一列的值進(jìn)行計(jì)算,然后返回一個(gè)單一的值;另外聚合函數(shù)會(huì)忽略空值。
| count() | 統(tǒng)計(jì)指定列不為NULL的記錄行數(shù); |
| sum() | 計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0 |
| max() | 計(jì)算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算; |
| min() | 計(jì)算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算; |
| avg() | 計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0 |
聚合查詢示例:
- 查詢商品的總條數(shù)
select count(*) from product;
- 查詢價(jià)格大于200商品的總條數(shù)
select count(*) from product where price > 200;
- 查詢分類為’c001’的所有商品的總和
select sum(price) from product where category_id = ‘c001’;
- 查詢商品的最大價(jià)格
select max(price) from product;
- 查詢商品的最小價(jià)格
select min(price) from product;
- 查詢分類為’c002’所有商品的平均價(jià)格
select avg(price) from product where category_id = ‘c002’;
注意:
- count函數(shù)對(duì)null值的處理
如果count函數(shù)的參數(shù)為星號(hào)(*),則統(tǒng)計(jì)所有記錄的個(gè)數(shù)。而如果參數(shù)為某字段,不統(tǒng)計(jì)含null值的記錄個(gè)數(shù)。
- sum和avg函數(shù)對(duì)null值的處理
這兩個(gè)函數(shù)忽略null值的存在,就好該條記錄不存在一樣。
- max和min函數(shù)對(duì)null值的處理
max和min兩個(gè)函數(shù)同樣忽略null值的存在。
7.5分組查詢
概述:分組查詢是指使用group by字句對(duì)查詢信息進(jìn)行分組
格式:select 字段1,字段2… from 表名 group by 分組字段 having 分組條件;
注意:
- 如果要進(jìn)行分組的話,則SELECT子句之后,只能出現(xiàn)分組的字段和統(tǒng)計(jì)函數(shù),其他的字段不能出現(xiàn)
- 分組之后對(duì)統(tǒng)計(jì)結(jié)果進(jìn)行篩選的話必須使用having,不能使用where。因?yàn)閣here子句用來篩選FROM子句中指定的操作所產(chǎn)生的行
- group by 子句用來分組WHERE子句的輸出
- having子句用來從分組的結(jié)果中篩選行
總結(jié):where不能在group by后面出現(xiàn),分組后篩選只能使用having。
7.6分頁(yè)查詢
概述:分頁(yè)查詢?cè)陧?xiàng)目開發(fā)中常見,由于數(shù)據(jù)量很大,顯示屏長(zhǎng)度有限,因此對(duì)數(shù)據(jù)需要采取分頁(yè)顯示方式。例如數(shù)據(jù)共有30條,每頁(yè)顯示5條,第一頁(yè)顯示1-5條,第二頁(yè)顯示6-10條。
格式:
- 方式1-顯示前n條
select 字段1,字段2… from 表明 limit n
- 方式2-分頁(yè)顯示
select 字段1,字段2… from 表明 limit m,n
m: 整數(shù),表示從第幾條索引開始
n: 整數(shù),表示查詢多少條數(shù)據(jù)
–從第4條開始顯示,顯示5條
select* from product limit 3,5
8.數(shù)據(jù)復(fù)制
概述:將一張表的數(shù)據(jù)導(dǎo)入到另一張表中
- 方式1:
insert into Table2(field1,field2,…) select value1,value2,… from Table1
insert into Table2 select *from Table1
要求:目標(biāo)表(Table2)必須存在。
- 方式2:
SELECT value1, value2 into Table2 from Table1
要求:目標(biāo)表Table2不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復(fù)制到Table2中。
9.多表聯(lián)合查詢
9.1交叉連接查詢
概述:
- 交叉連接查詢返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積
- 笛卡爾積可以理解為一張表的每一行去和另外一張表的任意一行進(jìn)行匹配
- 假如A表有m行數(shù)據(jù),B表有n行數(shù)據(jù),則返回m*n行數(shù)據(jù)
- 笛卡爾積會(huì)產(chǎn)生很多冗余的數(shù)據(jù),后期的其他查詢可以在該集合的基礎(chǔ)上進(jìn)行條件篩選
格式:
select from 表1,表2,表3….;
9.2內(nèi)連接查詢
概述:內(nèi)連接查詢求多張表的交集
隱式內(nèi)連接(SQL92標(biāo)準(zhǔn)):select * from A,B where 條件;
顯示內(nèi)連接(SQL99標(biāo)準(zhǔn)):select * from A inner join B on 條件;
– 查詢?nèi)藬?shù)大于等于3的部門,并按照人數(shù)降序排序
select deptno,count(1) as total_cnt from dept3,emp3 where dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
select deptno,count(1) as total_cnt from dept3 join emp3 on dept3.deptno= emp3.dept_id group by deptno having total_cnt >= 3 order by total_cnt desc;
9.3外連接查詢
概述:連接結(jié)果不僅包含符合連接條件的行,同時(shí)也包含自身不符合條件的行。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-dUU5reKN-1666602441451)(D:\智慧筆囊\mysql\assets\1666428799461.png)]
格式(outer可以省略):
- 左外連接:left outer join
select * from A left outer join Bon 條件;
- 右外連接:right outer join
select * from A right outer join Bon 條件;
- 滿外連接: full outer join
select * from A full outer join B on 條件;
問:內(nèi)連接和外連接的區(qū)別?
答:內(nèi)連接的結(jié)果是兩個(gè)表都符合條件的,但外連接是至少有一方是不符合條件的,通俗的來說,就是至少有一個(gè)表的值是都存在的。
注意:注意:oracle里面有full join,可是在mysql對(duì)full join支持的不好。我們可以使用union來達(dá)到目的。
9.4子查詢
概述:子查詢就是指的在一個(gè)完整的查詢語(yǔ)句之中,嵌套若干個(gè)不同功能的小查詢,從而一起完成復(fù)雜查詢的一種編寫形式,通俗一點(diǎn)就是包含select嵌套的查詢。
特點(diǎn):
- 單行單列:返回的是一個(gè)具體列的內(nèi)容,可以理解為一個(gè)單值數(shù)據(jù);
- 單行多列:返回一行數(shù)據(jù)中多個(gè)列的內(nèi)容;
- 多行單列:返回多行記錄之中同一列的內(nèi)容,相當(dāng)于給出了一個(gè)操作范圍;
- 多行多列:查詢返回的結(jié)果是一張臨時(shí)表
– 查詢年齡最大的員工信息,顯示信息包含員工號(hào)、員工名字,員工年齡
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查詢年研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;
– 查詢研發(fā)部20歲以下的員工信息,包括員工號(hào)、員工名字,部門名字
select eid,age,ename,name from (select * from dept where name = '研發(fā)部 ')t1,(select * from emp3 where age <20)t2
9.5自關(guān)聯(lián)查詢
概述:MySQL有時(shí)在信息查詢時(shí)需要進(jìn)行對(duì)表自身進(jìn)行關(guān)聯(lián)查詢,即一張表自己和自己關(guān)聯(lián),一張表當(dāng)成多張表來用。
注意:自關(guān)聯(lián)時(shí),表必須給表起別名。
格式:
select字段列表 from 表1 a ,表1 b where 條件;
或者
select字段列表 from 表1 a [left] join 表1 b on 條件;
注意:注意:oracle里面有full join,可是在mysql對(duì)full join支持的不好。我們可以使用union來達(dá)到目的。
9.4子查詢
概述:子查詢就是指的在一個(gè)完整的查詢語(yǔ)句之中,嵌套若干個(gè)不同功能的小查詢,從而一起完成復(fù)雜查詢的一種編寫形式,通俗一點(diǎn)就是包含select嵌套的查詢。
特點(diǎn):
- 單行單列:返回的是一個(gè)具體列的內(nèi)容,可以理解為一個(gè)單值數(shù)據(jù);
- 單行多列:返回一行數(shù)據(jù)中多個(gè)列的內(nèi)容;
- 多行單列:返回多行記錄之中同一列的內(nèi)容,相當(dāng)于給出了一個(gè)操作范圍;
- 多行多列:查詢返回的結(jié)果是一張臨時(shí)表
– 查詢年齡最大的員工信息,顯示信息包含員工號(hào)、員工名字,員工年齡
select eid,ename,age from emp3 where age = (select max(age) from emp3);
– 查詢年研發(fā)部和銷售部的員工信息,包含員工號(hào)、員工名字
select eid,ename,t.name from emp3 where dept_id in (select deptno,name from dept3 where name = ‘研發(fā)部’ or name = ‘銷售部’) ;
– 查詢研發(fā)部20歲以下的員工信息,包括員工號(hào)、員工名字,部門名字
select eid,age,ename,name from (select * from dept where name = '研發(fā)部 ')t1,(select * from emp3 where age <20)t2
9.5自關(guān)聯(lián)查詢
概述:MySQL有時(shí)在信息查詢時(shí)需要進(jìn)行對(duì)表自身進(jìn)行關(guān)聯(lián)查詢,即一張表自己和自己關(guān)聯(lián),一張表當(dāng)成多張表來用。
注意:自關(guān)聯(lián)時(shí),表必須給表起別名。
格式:
select字段列表 from 表1 a ,表1 b where 條件;
或者
select字段列表 from 表1 a [left] join 表1 b on 條件;
----------根據(jù)黑馬程序員課程的學(xué)習(xí)總結(jié)
總結(jié)
以上是生活随笔為你收集整理的mysql基础操作(详细版)--增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Core ML and Vision
- 下一篇: 致远oa打开mysql密码是多少钱_致远