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