【黑马程序员数据库】数据库基础大总结
課程來源:黑馬程序員 MySQL數(shù)據(jù)庫入門到精通
老師講解很細致呀,本文只是對講課筆記的整理,有問題歡迎大家指正!
引擎請下一篇:【黑馬程序員數(shù)據(jù)庫】數(shù)據(jù)庫引擎
java 學習筆記指路
基礎知識
Python轉java補充知識
Java中常見的名詞解釋
前端
【黑馬程序員pink老師前端】HTML
【黑馬程序員pink老師前端】JavaScript基礎大總結
【黑馬程序員pink老師前端】JavaScript函數(shù)與作用域
【黑馬程序員pink老師前端】JavaScript對象
數(shù)據(jù)庫
【黑馬程序員數(shù)據(jù)庫】數(shù)據(jù)庫基礎大總結
【黑馬程序員數(shù)據(jù)庫】數(shù)據(jù)庫引擎
【黑馬程序員數(shù)據(jù)庫】數(shù)據(jù)庫索引
SQL編程
【牛客】SQL刷題篇入門篇
【牛客】SQL刷題篇進階篇
Java 框架
spring框架學習
Mybatis-plus 快速入門
Maven基礎
Zookeeper初認識
HTTP簡介
Tomcat
Servlet
vue入門
目錄
- 0. 數(shù)據(jù)庫學習流程??
- 1. 數(shù)據(jù)庫概念??
- 1.1 基礎概念?
- 1.2 關系和非關系庫?
- 1.3 MySQL的數(shù)據(jù)模型?
- 2. MySQL基礎??
- 2.1 MySQL安裝?
- 2.1.1 連接🔥
- 2.1.2 啟動、停止🔥
- 2.2 MySQL可視化開發(fā)工具?
- 2.3 MySQL分類?
- 2.4 SQL通用語法?
- 2.5 MySQL數(shù)據(jù)庫操作-DDL?
- 2.5.1 對數(shù)據(jù)庫的常用操作🔥
- 2.5.2 對表結構的常用操作🔥
- 2.5.2.1 數(shù)據(jù)類型
- 2.5.2.2 創(chuàng)建表
- 2.5.2.3 對表結構的其他操作
- 2.5.3 修改表結構 🔥
- 2.6 MySQL數(shù)據(jù)庫操作-DML?
- 2.6.1 插入🔥
- 2.6.2 刪除🔥
- 2.6.3 修改🔥
- 2.7 MySQL約束?
- 2.7.1 概念(constraint)🔥
- 2.7.2 作用🔥
- 2.7.3 分類🔥
- 2.7.4 主鍵約束🔥
- 2.7.4.1 概念
- 2.7.4.2 添加單列主鍵
- 2.7.4.3 添加多列聯(lián)合主鍵
- 2.7.4.4 修改表結構添加主鍵
- 2.7.4.5 刪除主鍵
- 2.7.5 自增長約束🔥
- 2.7.5.1 概念
- 2.7.5.2 語法
- 2.7.5.3 特點
- 2.7.5.4 指定自增字段初始值
- 2.7.5.5 delete和truncate在刪除后自增列的變化
- 2.7.6 非空約束🔥
- 2.7.6.1 概念
- 2.7.6.2 語法
- 2.7.6.3 刪除非空約束
- 2.7.7 唯一約束🔥
- 2.7.7.1 概念
- 2.7.7.2 語法
- 2.7.7.3 刪除唯一約束
- 2.7.8 默認約束🔥
- 2.7.8.1 概念
- 2.7.8.2 語法
- 2.7.8.3 刪除默認約束
- 2.7.9 零填充約束🔥
- 2.7.9.1 概念
- 2.7.9.2 語法
- 2.7.9.3 刪除零填充約束
- 2.7.10 思維導圖🔥
- 2.8 MySQL數(shù)據(jù)庫操作-DQL?
- 2.8.1 概念🔥
- 2.8.2 應用🔥
- 2.8.3 語法🔥
- 2.8.4 簡化語法🔥
- 2.8.5 運算符🔥
- 2.8.5.1 算術運算符
- 2.8.5.2 比較(關系)運算符
- 2.8.5.3 邏輯運算符
- 2.8.5.4 位運算符
- 2.8.6 排序查詢(order by)🔥
- 2.8.6.1 語法
- 2.8.6.2 說明
- 2.8.7 聚合查詢🔥
- 2.8.7.1 語法
- 2.8.7.2 說明
- 2.8.7.3 函數(shù)對null值處理
- 2.8.8 分組查詢(group by)🔥
- 2.8.8.1 語法
- 2.8.8.2 實現(xiàn)過程
- 2.8.8.3 分組之后的條件篩選-having
- 2.8.9 分頁查詢(limit)🔥
- 2.8.9.1 語法
- 2.8.10 Insert_into_select語句🔥
- 2.8.10.1 語法
- 2.8.11 思維導圖🔥
- 2.8.12 正則表達式查詢🔥
- 2.8.12.1 概念
- 2.8.12.2 格式
- 3. MySQL多表操作??
- 3.1 多表關系?
- 3.2 外鍵約束
- 3.2.1 定義外鍵規(guī)則
- 3.2.2 創(chuàng)建外鍵約束(一對多)
- 方式1:在創(chuàng)建表時設置外鍵約束
- 方式2:在創(chuàng)建表時設置外鍵約束
- 3.2.3 驗證外鍵約束的作用
- 3.2.4 刪除外鍵約束
- 3.2.5 創(chuàng)建外鍵約束(多對多)
- 3.3 多表聯(lián)合查詢
- 3.3.1 概念
- 3.3.3 交叉連接查詢
- 3.3.4 內(nèi)連接查詢
- 3.3.5 外連接查詢
- 3.3.6 基本子查詢
- 3.3.7 自關聯(lián)查詢
- 3.4思維導圖
0. 數(shù)據(jù)庫學習流程??
1. 數(shù)據(jù)庫概念??
1.1 基礎概念?
| 數(shù)據(jù)庫 | 存儲數(shù)據(jù)的倉庫,數(shù)據(jù)是有組織的進行存儲 | DataBase(DB) |
| 數(shù)據(jù)庫管理系統(tǒng) | 操縱和管理數(shù)據(jù)庫的大型軟件 | DataBase Management System(DBMS) |
| SQL | 操縱關系型數(shù)據(jù)庫的編程語言,定義了一套操縱關系型數(shù)據(jù)庫統(tǒng)一標準 | Structured Query Language(SQL) |
1.2 關系和非關系庫?
常見的數(shù)據(jù)庫:
- 關系型數(shù)據(jù)庫, Oracle、MySQL、SQLServer、Access
- 非關系型數(shù)據(jù)庫, MongoDB、Redis、Solr、ElasticSearch、Hive、HBase
1.3 MySQL的數(shù)據(jù)模型?
2. MySQL基礎??
2.1 MySQL安裝?
官網(wǎng)下載,全點next就好
設置個簡單一點的密碼,比如:123456
2.1.1 連接🔥
2.1.2 啟動、停止🔥
- mysql -u root -p
- mysql [-h 127.0.0.1] [-p 3306] -u root -p
注:這種方式需要配置PATH環(huán)境,IP和端口可以省略
win10配置PATH環(huán)境方法
控制面板->系統(tǒng)->左側【高級系統(tǒng)設置】->環(huán)境變量->path
或此臺電腦->右鍵【屬性】->下滑倒數(shù)第二個【高級系統(tǒng)設置】->環(huán)境變量->path
2.2 MySQL可視化開發(fā)工具?
Navicat
以直覺化的圖形用戶界面而建的,可以兼容多種數(shù)據(jù)庫,支持多種操作系統(tǒng)。
SQLyog
是一個快速而簡潔的圖形化管理MySQL數(shù)據(jù)庫的工具,它能夠在任何地點有效地管理你的數(shù)據(jù)庫,由業(yè)界著名的Webyog公司出品
MySQL Workbench
社區(qū)版完全免費,而商業(yè)版則是按年收費。支持數(shù)據(jù)庫的創(chuàng)建、設計、遷移、備份、導出和導入等功能,并且支持 Windows、Linux 和 mac 等主流操作系統(tǒng)。
DataGrip
是一款數(shù)據(jù)庫管理客戶端工具,方便連接到數(shù)據(jù)庫服務器,執(zhí)行sql、創(chuàng)建表、創(chuàng)建索引以及導出數(shù)據(jù)等
2.3 MySQL分類?
注意:SQL不區(qū)分大小寫
2.4 SQL通用語法?
1.SQL語句可以單行或多行書寫,以分號結尾。
2.SQL語句可以使用空格/縮進來增強語句的可讀性。
3.MySQL數(shù)據(jù)庫的SQL語句不區(qū)分大小寫,關鍵字建議使用大寫。
4.注釋:
- 單行注釋:--注釋內(nèi)容或 # 注釋內(nèi)容(MySQL特有)
- 多行注釋:/*注釋內(nèi)容*/
2.5 MySQL數(shù)據(jù)庫操作-DDL?
DDL分類:
- 對數(shù)據(jù)庫的常用操作
- 對表結構的常用操作
- 修改表結構
2.5.1 對數(shù)據(jù)庫的常用操作🔥
| 常見數(shù)據(jù)庫 | create database if not exists 庫名 default charset=utf8mb4; 或 create database 庫名; |
| 查看所有數(shù)據(jù)庫 | show databases; |
| 選擇要操作的數(shù)據(jù)庫 | use 庫名; |
| 刪除數(shù)據(jù)庫 | drop database if exists 庫名; |
| 修改數(shù)據(jù)庫編碼 | alter database 庫名 character set utf8; |
| 注意: |
- utf8mb4可以存儲4個字節(jié),utf8存儲3個字節(jié),推薦使用utf8mb4
- 輸入 if not exists 會在創(chuàng)建數(shù)據(jù)庫的時候先判斷是否已經(jīng)存在,如果已經(jīng)存在就不創(chuàng)建,也不會報錯。
2.5.2 對表結構的常用操作🔥
2.5.2.1 數(shù)據(jù)類型
- 數(shù)值類型
- 日期和時間類型
- 字符串類型
數(shù)值類型
日期和時間類型
字符串類型
2.5.2.2 創(chuàng)建表
create table [if not exists]表名(字段名1 類型[(寬度)] [約束條件] [comment '字段說明'],字段名2 類型[(寬度)] [約束條件] [comment '字段說明'],字段名3 類型[(寬度)] [約束條件] [comment '字段說明'] )[表的一些設置];2.5.2.3 對表結構的其他操作
2.5.3 修改表結構 🔥
| 修改表添加列 | alter table 表名 add 列名 類型(長度) [約束]; |
| 修改列名和類型 | alter table 表名 change 舊列名 新列名 類型(長度) 約束; |
| 修改表刪除列 | alter table 表名 drop 列名; |
| 修改表名 | rename table 表名 to 新表名; |
2.6 MySQL數(shù)據(jù)庫操作-DML?
DML分類:
- 插入insert
- 刪除delete
- 修改update
2.6.1 插入🔥
語法格式:
insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...); // 不指定列,向表中插入所有列 insert into 表 values (值1,值2,值3...); // 一次插入多行數(shù)據(jù) insert into 表 (列名1,列名2,列名3...) values (值1,值2,值3...),(值1,值2,值3...),(值1,值2,值3...);例子:
-- 指定列插入單行數(shù)據(jù),數(shù)據(jù)類型、順序、個數(shù)需匹配 insert into student(sid,name,gender,age,birth,address,score) values (1001,'男',18,'1996-12-23','北京',83.5); -- 不指定列插入單行數(shù)據(jù) insert into student values(1001,'男',18,'1996-12-23','北京',83.5); -- 插入多行數(shù)據(jù) insert into student(sid,name,gender,age,birth,address,score) values(1002,'男',18,'1996-12-23','北京',83.5),(1003,'女',18,'1997-12-23','北京',53.5);2.6.2 刪除🔥
delete from 表名 [where 條件]; truncate table 表名; truncate 表名;注意:沒有where 條件會刪除整張表的數(shù)據(jù)。
2.6.3 修改🔥
update 表名 set 字段名=值,字段名=值...; update 表名 set 字段名=值,字段名=值... where 條件; -- 將所有學生的地址修改為重慶 update student set address = '重慶'; -- 講id為1004的學生的地址修改為北京 update student set address = '北京' where id = 1004 -- 講id為1005的學生的地址修改為北京,成績修成績修改為100 update student set address = '廣州',score=100 where id = 1005注意:沒有where 條件,則修改整張表
2.7 MySQL約束?
2.7.1 概念(constraint)🔥
約束實際上就是表中數(shù)據(jù)的限制條件
2.7.2 作用🔥
表在設計的時候加入約束的目的就是為了保證表中的記錄完整性和有效性,比如用戶表有些列的值(手機號)不能為空,有些列的值(身份證號)不能重復。
2.7.3 分類🔥
- 主鍵約束(primary key) PK
- 自增長約束(auto_increment)
- 非空約束(not null)
- 唯一性約束(unique)
- 默認約束(default)
- 零填充約束(zerofill)
- 外鍵約束(foreign key) FK
2.7.4 主鍵約束🔥
2.7.4.1 概念
- MySQL主鍵約束是一個列或者多個列的組合,其值能唯一地標識表中的每一行,方便在RDBMS中盡快的找到某一行。
- 主鍵約束相當于 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復,也不允許出現(xiàn)空值。
- 每個表最多只允許一個主鍵
- 主鍵約束的關鍵字是:primary key
- 當創(chuàng)建主鍵的約束時,系統(tǒng)默認會在所在的列和列組合上建立對應的唯一索引。
2.7.4.2 添加單列主鍵
創(chuàng)建單列主鍵有兩種方式,一種是在定義字段的同時指定主鍵,一種是定義完字段之后指定主鍵。
方法一:
方法二:
-- 在定義字段之后再指定主鍵,語法格式如下: create table 表名(...[constraint <約束名>] primary key [字段名]);2.7.4.3 添加多列聯(lián)合主鍵
所謂的聯(lián)合主鍵,就是這個主鍵是由一張表中多個字段組成的。
注意:
2.7.4.4 修改表結構添加主鍵
主鍵約束不僅可以在創(chuàng)建表的同時創(chuàng)建,也可以在修改表時添加。
create table 表名(... ); alter table <表名> add primary key(字段列表);2.7.4.5 刪除主鍵
主鍵約束不僅可以在創(chuàng)建表的同時創(chuàng)建,也可以在修改表時添加。
alter table <數(shù)據(jù)表名> drop primary key;2.7.5 自增長約束🔥
2.7.5.1 概念
在 MySQL 中,當主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進行增長。
通過給字段添加 auto_increment 屬性來實現(xiàn)主鍵自增長
2.7.5.2 語法
字段名 數(shù)據(jù)類型 auto_increment2.7.5.3 特點
- 默認情況下,auto_increment的初始值是 1,每新增一條記錄,字段值自動加 1。
- 一個表中只能有一個字段使用 auto_increment約束,且該字段必須有唯一索引,以避免序號重復(即為主鍵或主鍵的一部分)。
- auto_increment約束的字段必須具備 NOT NULL 屬性。
- auto_increment約束的字段只能是整數(shù)類型(TINYINT、SMALLINT、INT、BIGINT 等。
- auto_increment約束字段的最大值受該字段的數(shù)據(jù)類型約束,如果達到上限,auto_increment就會失效。
2.7.5.4 指定自增字段初始值
如果第一條記錄設置了該字段的初始值,那么新增加的記錄就從這個初始值開始自增。例如,如果表中插入的第一條記錄的 id 值設置為 5,那么再插入記錄時,id 值就會從 5 開始往上增加
1、方式1:創(chuàng)建表時指定
create table t_user2 (id int primary key auto_increment,name varchar(20) )auto_increment=100;2、方式2:創(chuàng)建表之后指定
create table t_user3 (id int primary key auto_increment,name varchar(20) ); alter table t_user2 auto_increment=100;2.7.5.5 delete和truncate在刪除后自增列的變化
delete數(shù)據(jù)之后自動增長從斷點開始,會保留自增長從斷點開始+1。
truncate數(shù)據(jù)之后自動增長從默認起始值1開始。
2.7.6 非空約束🔥
2.7.6.1 概念
MySQL 非空約束(not null)指字段的值不能為空。對于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時沒有指定值,數(shù)據(jù)庫系統(tǒng)就會報錯。
2.7.6.2 語法
1.方式一:
<字段名><數(shù)據(jù)類型> not null;2.方式二:
alter table 表名 modify 字段 類型 not null;2.7.6.3 刪除非空約束
語法:alter table 表名 modify 字段 類型2.7.7 唯一約束🔥
2.7.7.1 概念
唯一約束(Unique Key)是指所有記錄中字段的值不能重復出現(xiàn)。例如,為 id 字段加上唯一性約束后,每條記錄的 id 值都是唯一的,不能出現(xiàn)重復的情況。
2.7.7.2 語法
1.方法一:
<字段名> <數(shù)據(jù)類型> unique2.方法二:
alter table 表名 add constraint 約束名 unique(列);2.7.7.3 刪除唯一約束
語法:alter table <表名> drop index <唯一約束名/列名>;2.7.8 默認約束🔥
2.7.8.1 概念
MySQL 默認值約束用來指定某列的默認值。
2.7.8.2 語法
1、方法一:
<字段名> <數(shù)據(jù)類型> default <默認值>;2.方法二:
alter table 表名 modify 列名 類型 default 默認值;2.7.8.3 刪除默認約束
語法:alter table <表名> modify column <字段名> <類型> default null;2.7.9 零填充約束🔥
2.7.9.1 概念
1、插入數(shù)據(jù)時,當該字段的值的長度小于定義的長度時,會在該值的前面補上相應的0
2、zerofill默認為int(10)
3、當使用zerofill 時,默認會自動加unsigned(無符號)屬性,使用unsigned屬性后,數(shù)值范圍是原值的2倍,例如,有符號為-128+127,無符號為0256。
2.7.9.2 語法
create table t_user12 (id int zerofill , -- 零填充約束name varchar(20) );2.7.9.3 刪除零填充約束
alter table t_user12 modify id int;2.7.10 思維導圖🔥
2.8 MySQL數(shù)據(jù)庫操作-DQL?
2.8.1 概念🔥
- 數(shù)據(jù)查詢功能,返回數(shù)據(jù)庫中存儲的數(shù)據(jù)應該根據(jù)需要對數(shù)據(jù)進行篩選以及確定數(shù)據(jù)以什么樣的格式顯示。
- MySQL數(shù)據(jù)庫使用select語句來查詢數(shù)據(jù)。
2.8.2 應用🔥
2.8.3 語法🔥
select[all|distinct]<目標列的表達式1> [別名],<目標列的表達式2> [別名]... from <表名或視圖名> [別名],<表名或視圖名> [別名]... [where<條件表達式>] [group by <列名> [having <條件表達式>]] [order by <列名> [asc|desc]] [limit <數(shù)字或者列表>];關鍵詞 distinct 去重,用于返回唯一不同的值。
2.8.4 簡化語法🔥
select *| 列名 from 表 where 條件2.8.5 運算符🔥
**MySQL支持4種運算符:**算術運算符、比較運算符、邏輯運算符、位運算符
運算符優(yōu)先級:
括號:();
乘、除、求模運算符:*、/、%;
加減運算符:+、- ;
比較運算符:=、>、<、>=、<=、<>、!=、!>、!<;
位運算符:^、&、|;
邏輯運算符:NOT;
邏輯運算符:AND;
邏輯運算符:OR。
2.8.5.1 算術運算符
| + | 加 |
| - | 減 |
| * | 乘 |
| / 或 DIV | 除,返回商 |
| % 或 MOD | 取余 |
2.8.5.2 比較(關系)運算符
比較運算符是兩個數(shù)據(jù)進行比較時所使用的運算符,比較運算后,會返回一個布爾值(true / false)作為比較運算的結果。
| = | 等于 |
| < | 小于號 |
| > | 大于號 |
| >= | 大于等于號(大于或者等于) |
| <= | 小于等于號(小于或者等于) |
| <=> | 安全的等于,兩個操作碼均為NULL時,其所得值為1;而當一個操作碼為NULL時,其所得值為0 |
| != 或 <> | 不等號 |
| IS NULL 或 ISNULL | 判斷一個值是否為 NULL |
| IS NOT NULL | 判斷一個值是否不為 NULL |
| LEAST | 當有兩個或多個參數(shù)時,返回最小值 |
| GREATEST | 當有兩個或多個參數(shù)時,返回最大值 |
| BETWEEN AND | 判斷一個值是否落在兩個值之間 |
| (NOT) IN | 判斷一個值(不)是IN列表中的任意一個值 |
| LIKE | 通配符匹配 |
| REGEXP | 正則表達式匹配 |
2.8.5.3 邏輯運算符
| AND 或 && | 邏輯與 |
| `OR 或 | |
| NOT 或 ! | 邏輯非 |
| XOR | 邏輯異或 |
2.8.5.4 位運算符
| & | 按位與 |
| ` | ` |
| ~ | 按位取反,反轉所有比特 |
| ^ | 按位異或 |
| << | 按位左移 |
| >> | 按位右移 |
2.8.6 排序查詢(order by)🔥
2.8.6.1 語法
按字段的先后順序來分主次,先排字段名1,再排字段名2。
select 字段名1,字段名2,…… from 表名 order by 字段名1 [asc|desc],字段名2[asc|desc]……2.8.6.2 說明
1.asc代表升序,desc代表降序,如果不寫默認升序
2.order by用于子句中可以支持單個字段,多個字段,表達式,函數(shù),別名
3.order by子句,放在查詢語句的最后面。LIMIT子句除外
2.8.7 聚合查詢🔥
之前我們做的查詢都是橫向查詢,它們都是根據(jù)條件一行一行的進行判斷,而使用聚合函數(shù)查詢是縱向查詢,它是對一列的值進行計算,然后返回一個單一的值;另外聚合函數(shù)會忽略空值。
2.8.7.1 語法
-- 1 查詢商品的總條數(shù) select count(*) from product; -- 2 查詢價格大于200商品的總條數(shù) select count(*) from product where price > 200; -- 3 查詢分類為'c001'的所有商品的總和 select sum(price) from product where category_id = 'c001'; -- 4 查詢商品的最大價格 select max(price) from product; -- 5 查詢商品的最小價格 select min(price) from product; -- 6 查詢分類為'c002'所有商品的平均價格 select avg(price) from product where category_id = 'c002';2.8.7.2 說明
| count() | 統(tǒng)計指定列不為NULL的記錄行數(shù) |
| sum() | 計算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計算結果為0 |
| max() | 計算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運算 |
| min() | 計算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運算 |
| avg() | 計算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計算結果為0 |
2.8.7.3 函數(shù)對null值處理
| count( ) | 如果count函數(shù)的參數(shù)為星號(*),則統(tǒng)計所有記錄的個數(shù)。而如果參數(shù)為某字段,不統(tǒng)計含null值的記錄個數(shù) |
| sum( ) 和 avg( ) 、max( ) 和 min( ) | 忽略null值 |
2.8.8 分組查詢(group by)🔥
2.8.8.1 語法
select 字段1,字段2… from 表名 group by 分組字段 having 分組條件;2.8.8.2 實現(xiàn)過程
- 先執(zhí)行分組、然后將分組以后的id提取出來,再執(zhí)行統(tǒng)計每組的個數(shù),最后進行查詢操作。
- group by后面可用逗號隔開加多個參數(shù),只有都相同,才會分往同一個組。
- 如果要進行分組的話,則SELECT子句之后,只能出現(xiàn)分組的字段和統(tǒng)計函數(shù),其他的字段不能出現(xiàn):因為會導致列不匹配,例如:當按省分組學生后,只能出現(xiàn)省和該省統(tǒng)計的人數(shù),如果出現(xiàn)其他列,如學生名,就會報錯。
2.8.8.3 分組之后的條件篩選-having
- 分組之后對統(tǒng)計結果進行篩選的話必須使用having,不能使用where
- where子句用來篩選 FROM 子句中指定的操作所產(chǎn)生的行
- group by 子句用來分組 WHERE 子句的輸出。
- having 子句用來從分組的結果中篩選行
2.8.9 分頁查詢(limit)🔥
2.8.9.1 語法
-- 方式1-顯示前n條 select 字段1,字段2... from 表明 limit n -- 方式2-分頁顯示 select 字段1,字段2... from 表明 limit m,n- m: 整數(shù),表示從第幾條索引開始,計算方式 (當前頁-1)*每頁顯示條數(shù)
- n: 整數(shù),表示查詢多少條數(shù)據(jù)
2.8.10 Insert_into_select語句🔥
- 將一張表的數(shù)據(jù)導入到另一張表中,可以使用INSERT INTO SELECT語句
- 將一張表的數(shù)據(jù)導入到另一張表中,有兩種選擇 SELECT INTO 和 INSERT INTO SELECT
2.8.10.1 語法
方法一:
insert into Table2(field1,field2,…) select value1,value2,… from Table1;insert into Table2 select * from Table1;要求目標表Table2必須存在
方法二:
SELECT vale1, value2 into Table2 from Table1要求目標表Table2不存在,因為在插入時會自動創(chuàng)建表Table2,并將Table1中指定字段數(shù)據(jù)復制到Table2中。
2.8.11 思維導圖🔥
2.8.12 正則表達式查詢🔥
2.8.12.1 概念
正則表達式(regular expression)描述了一種字符串匹配的規(guī)則,正則表達式本身就是一個字符串,使用這個字符串來描述、用來定義匹配規(guī)則,匹配一系列符合某個句法規(guī)則的字符串。在開發(fā)中,正則表達式通常被用來檢索、替換那些符合某個規(guī)則的文本。
MySQL通過REGEXP關鍵字支持正則表達式進行字符串匹配。
2.8.12.2 格式
| ^ | 匹配輸入字符串的開始位置 |
| $ | 匹配輸入字符串的結束位置 |
| . | 匹配除 “\n” 之外的任何單個字符 |
| […] | 字符集合。匹配所包含的任意一個字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a(chǎn)’ |
| [^…] | 負值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’ |
| `p1 | p2 |
| * | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等價于{0,} |
| + | 匹配前面的子表達式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等價于 {1,} |
| {n} | n 是一個非負整數(shù)。匹配確定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的兩個 o |
| {n,m} | m 和 n 均為非負整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次 |
3. MySQL多表操作??
3.1 多表關系?
一對一關系
一對一關系
多對多關系
3.2 外鍵約束
3.2.1 定義外鍵規(guī)則
- 主表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當前正在創(chuàng)建的表。
必須為主表定義主鍵。 - 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個非空值出現(xiàn)在指定的主鍵中,這 個外鍵的內(nèi)容就是正確的。
- 在主表的表名后面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。
- 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。(簡單來說,如果主表是組合主鍵,從表也必須是組合主鍵)
- 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對應列的數(shù)據(jù)類型相同。
3.2.2 創(chuàng)建外鍵約束(一對多)
方式1:在創(chuàng)建表時設置外鍵約束
語法:
在 create table 語句中,通過 foreign key 關鍵字來指定外鍵,具體的語法格式如下:
實現(xiàn):為"emp"表中的"dept_id"字段創(chuàng)建為外鍵,并命名為"emp_fk",然后關聯(lián)"dept"表中的"deptno"主鍵字段。
方式2:在創(chuàng)建表時設置外鍵約束
添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒有數(shù)據(jù)
語法:
實現(xiàn):
-- 創(chuàng)建部門表(主表) create table if not exists dept2( deptno varchar(20) primary key , -- 部門號 name varchar(20) -- 部門名字 );-- 創(chuàng)建部門表(從表) create table if not exists emp2( eid varchar(20) primary key , -- 員工編號 ename varchar(20), -- 員工名字 age int, -- 員工年齡 dept_id varchar(20) -- 員工所屬部門 );-- 創(chuàng)建外鍵約束 alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);3.2.3 驗證外鍵約束的作用
數(shù)據(jù)插入
-- 1、添加主表數(shù)據(jù) -- 注意必須先給主表添加數(shù)據(jù) insert into dept values('1001','研發(fā)部'); insert into dept values('1002','銷售部'); insert into dept values('1003','財務部'); insert into dept values('1004','人事部’); -- 2、添加從表數(shù)據(jù) -- 注意給從表添加數(shù)據(jù)時,外鍵列的值不能隨便寫,必須依賴主表的主鍵列 insert into emp values('1','喬峰',20, '1001'); insert into emp values('2','段譽',21, '1001'); insert into emp values('3','虛竹',23, '1001'); insert into emp values('4','阿紫',18, '1002'); insert into emp values('5','掃地僧',35, '1002'); insert into emp values('6','李秋水',33, '1003'); insert into emp values('7','鳩摩智',50, '1003'); insert into emp values('8','天山童姥',60, '1005'); -- 1005,主表不存在該列,不可以添加刪除數(shù)據(jù)
-- 3、刪除數(shù)據(jù)/*注意:1:主表的數(shù)據(jù)被從表依賴時,不能刪除,否則可以刪除2: 從表的數(shù)據(jù)可以隨便刪除*/ delete from dept where deptno = '1001'; -- 從表中有引用,不可以刪除 delete from dept where deptno = '1004'; -- 從表中沒有引用,可以刪除 delete from emp where eid = '7'; -- 可以刪除3.2.4 刪除外鍵約束
當一個表中不需要外鍵約束時,就需要從表中將其刪除。外鍵一旦刪除,就會解除主表和從表間的關聯(lián)關系
語法:
實現(xiàn):
alter table emp drop foreign key emp_fk;3.2.5 創(chuàng)建外鍵約束(多對多)
在多對多關系中,A表的一行對應B的多行,B表的一行對應A表的多行,我們要新增加一個中間表,來建立多對多關系。
- 中間表含有兩個外鍵,屬于從表
- 成績表和學生表各有一個主鍵,屬于主表。
實現(xiàn):
-- 學生表和課程表(多對多)-- 1 創(chuàng)建學生表student(左側主表)create table if not exists student(sid int primary key auto_increment,name varchar(20),age int,gender varchar(20) ); -- 2 創(chuàng)建課程表course(右側主表) create table course(cid int primary key auto_increment,cidname varchar(20) ); -- 3創(chuàng)建中間表student_course/score(從表) create table score(sid int,cid int,score double ); -- 4建立外鍵約束(2次) alter table score add foreign key(sid) references student(sid); alter table score add foreign key(cid) references course(cid); -- 5給學生表添加數(shù)據(jù) insert into student values(1,'小龍女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男'); -- 6給課程表添加數(shù)據(jù) insert into course values(1,'語文'),(2,'數(shù)學'),(3,'英語'); -- 7給中間表添加數(shù)據(jù) insert into score values(1,1,75),(1,2,83),(2,1,67),(2,3,80),(3,2,90),(3,3,88); -- 注意:在刪除表時,需要先刪除從表再刪除主表。因為先刪除主表會導致從表引用錯誤。中間表是從表,可以隨便刪除。3.3 多表聯(lián)合查詢
3.3.1 概念
多表查詢就是同時查詢兩個或兩個以上的表,顯示來自多張表的數(shù)據(jù)。
分類:
- 交叉連接查詢
- 內(nèi)連接查詢
- 外連接查詢
- 子查詢
- 表自關聯(lián)
join實現(xiàn)的功能:通過兩張表關聯(lián)的列(比如商品id),將兩張表的列進行合并。
3.3.3 交叉連接查詢
交叉連接查詢返回被連接的兩個表所有數(shù)據(jù)行的笛卡爾積。笛卡爾積可以理解為一張表的每一行去和另外一張表的任意一行進行匹配,假如A表有m行數(shù)據(jù),B表有n行數(shù)據(jù),則返回 m*n 行數(shù)據(jù)。笛卡爾積會產(chǎn)生很多冗余的數(shù)據(jù),后期的其他查詢可以在該集合的基礎上進行條件篩選。
語法:
3.3.4 內(nèi)連接查詢
語法:
inner可以省略
常用實現(xiàn):
給 ods_itcast_order_goods 表起名為a,ods_itcast_goods 表起名為b,使用 goodsId 這一列進行關聯(lián)。后面可以直接用b.goodsName調(diào)用 ods_itcast_goods 表中數(shù)據(jù)。
3.3.5 外連接查詢
| 左外連接 | select * from A left outer join B on 條件; | |
| 右外連接 | select * from A right outer join B on 條件; | |
| 滿外連接 | select * from A full outer join B on 條件; |
3.3.6 基本子查詢
3.3.6.1 概述
3.3.6.2 子查詢關鍵字(all)
3.3.6.3 子查詢關鍵字(any和some)
3.3.6.4 子查詢關鍵字(in)
3.3.6.5 子查詢關鍵字(exists)
3.3.7 自關聯(lián)查詢
MySQL有時在信息查詢時需要進行對表自身進行關聯(lián)查詢,即一張表自己和自己關聯(lián),一張表當成多張表來用。注意自關聯(lián)時表必須給表起別名。
語法:
3.4思維導圖
總結
以上是生活随笔為你收集整理的【黑马程序员数据库】数据库基础大总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] 举例说明图片懒加载的方案有
- 下一篇: PLSQL 11破解码