1. 數(shù)據(jù)庫概念介紹,應(yīng)用場景
引入:
淘寶網(wǎng),京東、微信,抖音等都有各自的功能,那么當(dāng)我們退出系統(tǒng)的時候,下次再訪問時,為什么信息還存在?
什么是數(shù)據(jù)庫
數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫。
每個數(shù)據(jù)庫都有一個或多個不同的 API 用于創(chuàng)建,訪問,管理,搜索和復(fù)制所保存的數(shù)據(jù)。
我們也可以將數(shù)據(jù)存儲在文件中,但是在文件中讀寫數(shù)據(jù)速度相對較慢。
所以,現(xiàn)在我們使用關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)來存儲和管理大數(shù)據(jù)量。所謂的關(guān)系型數(shù)據(jù)庫,是建立在關(guān)系模型基礎(chǔ)上的數(shù)據(jù)庫,借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。
RDBMS 即關(guān)系數(shù)據(jù)庫管理系統(tǒng)(Relational Database Management System)的特點:
- 1.數(shù)據(jù)以表格的形式出現(xiàn)
- 2.每行為各種記錄名稱
- 3.每列為記錄名稱所對應(yīng)的數(shù)據(jù)域
- 4.許多的行和列組成一張表單
- 5.若干的表單組成database
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。
術(shù)語解釋
- 數(shù)據(jù)庫: 數(shù)據(jù)庫是一些關(guān)聯(lián)表的集合。
- 數(shù)據(jù)表: 表是數(shù)據(jù)的矩陣。在一個數(shù)據(jù)庫中的表看起來像一個簡單的電子表格。
- 列: 一列(數(shù)據(jù)元素) 包含了相同類型的數(shù)據(jù)。
- 行:一行(=元組,或記錄)是一組相關(guān)的數(shù)據(jù)。
- 主鍵:主鍵是唯一的。一個數(shù)據(jù)表中只能包含一個主鍵。你可以使用主鍵來查詢數(shù)據(jù)。
- 外鍵:外鍵用于關(guān)聯(lián)兩個表。
- 復(fù)合鍵:復(fù)合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復(fù)合索引。
- 索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。類似于書籍的目錄。
- 參照完整性: 參照的完整性要求關(guān)系中不允許引用不存在的實體。與實體完整性是關(guān)系模型必須滿足的完整性約束條件,目的是保證數(shù)據(jù)的一致性。
2. 關(guān)系型數(shù)據(jù)庫Mysql
a) 數(shù)據(jù)庫的組成部分介紹(服務(wù)器、數(shù)據(jù)庫、表、行和列)
- 所謂安裝Mysql數(shù)據(jù)庫,就是在主機安裝一個數(shù)據(jù)庫管理系統(tǒng)(DBMS),這個管理程序可以管理多個數(shù)據(jù)庫。DBMS(database manage system)
- 一個數(shù)據(jù)庫中可以創(chuàng)建多個表,以保存數(shù)據(jù)(信息)。
- 數(shù)據(jù)庫管理系統(tǒng)(DBMS)、數(shù)據(jù)庫和表的關(guān)系如圖所示:示意圖
b) Mysql數(shù)據(jù)庫安裝、navicat數(shù)據(jù)庫可視化管理工具安裝與基本使用
Mysql安裝
參考鏈接:https://blog.csdn.net/GCTTTTTT/article/details/121436300?spm=1001.2014.3001.5502
驗證安裝是否成功:
命令行窗口中輸入:mysql --version
查看是否能成功顯示版本號
然后保證mysql服務(wù)開啟:
命令:net start mysql
使用命令行窗口(cmd)連接mysql數(shù)據(jù)庫:
命令:mysql -uroot -p
然后輸入自己修改后的密碼(若沒有按教程修改密碼,則需輸入安裝數(shù)據(jù)庫時給的原密碼)
若能成功進(jìn)入數(shù)據(jù)庫中,則證明MySQL安裝成功(如下圖所示):
命令解釋:
Navicat安裝
安裝教程:
http://fankey.blog365.cn/database/129.html
https://cloud.tencent.com/developer/article/1804255
注:官網(wǎng)下載navicat安裝后,不按教程方法進(jìn)行完整激活也可免費使用14天
Navicat的基本使用
培訓(xùn)時會一步步教學(xué)
- Navicat連接數(shù)據(jù)庫方法
- Navicat導(dǎo)入sql文件方法
講解完sql相關(guān)命令后講
- 使用Navicat操作數(shù)據(jù)庫
- 使用Navicat操作數(shù)據(jù)表
- 使用Navicat操作數(shù)據(jù)表數(shù)據(jù)
c) mysql數(shù)據(jù)類型
數(shù)值類型
MySQL 支持所有標(biāo)準(zhǔn) SQL 數(shù)值數(shù)據(jù)類型。
這些類型包括嚴(yán)格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REAL 和 DOUBLE PRECISION)。
常用數(shù)值類型:
TINYINT :小整數(shù)值
SMALLINT:大整數(shù)值
MEDIUMINT:大整數(shù)值
INT或INTEGER:大整數(shù)值
BIGINT:極大整數(shù)值
FLOAT:單精度 浮點數(shù)值
DOUBLE:雙精度 浮點數(shù)值
DECIMAL :小數(shù)值
日期和時間類型
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
DATETIME:YYYY-MM-DD hh:mm:ss 混合日期和時間值
DATE:YYYY-MM-DD 日期值
TIMESTAMP:YYYY-MM-DD hh:mm:ss 混合日期和時間值,時間戳
TIME:HH:MM:SS 時間值或持續(xù)時間
YEAR:YYYY 年份值
字符串類型
字符串類型指CHAR、VARCHAR、TEXT、BLOB等。
CHAR:定長字符串(char(n) 和 varchar(n) 中括號中 n 代表字符的個數(shù),比如 CHAR(30) 就可以存儲 30 個字符)
VARCHAR :變長字符串
TINYBLOB:不超過 255 個字符的二進(jìn)制字符串
TINYTEXT :短文本字符串
BLOB: 二進(jìn)制形式的長文本數(shù)據(jù)
TEXT:長文本數(shù)據(jù)
MEDIUMBLOB:二進(jìn)制形式的中等長度文本數(shù)據(jù)
MEDIUMTEXT:中等長度文本數(shù)據(jù)
LONGBLOB:二進(jìn)制形式的極大文本數(shù)據(jù)
LONGTEXT:極大文本數(shù)據(jù)
d) 數(shù)據(jù)庫級別操作(查看現(xiàn)有數(shù)據(jù)庫、建庫、刪庫、切換數(shù)據(jù)庫等)
查看現(xiàn)有數(shù)據(jù)庫
列出 MySQL 數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)庫列表
show databases;
創(chuàng)建數(shù)據(jù)庫
create database 數(shù)據(jù)庫名;
刪除數(shù)據(jù)庫
drop database <數(shù)據(jù)庫名>;
切換數(shù)據(jù)庫
選擇要操作的Mysql數(shù)據(jù)庫,使用該命令后所有Mysql命令都只針對該數(shù)據(jù)庫。
use 數(shù)據(jù)庫名;
顯示指定數(shù)據(jù)庫中的所有表
使用該命令前需要使用 use 命令來選擇要操作的數(shù)據(jù)庫。
show tables;
顯示表結(jié)構(gòu)
顯示數(shù)據(jù)表的屬性,屬性類型,主鍵信息 ,是否為 NULL,默認(rèn)值等其他信息
有三種命令都可以實現(xiàn):
show columns from 數(shù)據(jù)表名;
describe 數(shù)據(jù)表名;
desc 數(shù)據(jù)表名;
e) 表級別操作(建表、刪表、清空表格、增加刪除字段等)
創(chuàng)建數(shù)據(jù)表
CREATE TABLE table_name (column_name column_type);
實例解釋:
CREATE TABLE IF NOT EXISTS `users`(
`user_id` INT UNSIGNED AUTO_INCREMENT,
`username` VARCHAR(100) NOT NULL,
`password` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY (`user_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
刪除數(shù)據(jù)表
DROP TABLE 數(shù)據(jù)表名;
增加字段
ALTER TABLE 表名 ADD 新字段名 數(shù)據(jù)類型 [約束條件] [FIRST|AFTER 已存在字段名];
實例解釋:
alter table users add age int(10) after password;
修改字段
ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數(shù)據(jù)類型>;
- 舊字段名:指修改前的字段名;
- 新字段名:指修改后的字段名;
-
新數(shù)據(jù)類型:指修改后的數(shù)據(jù)類型,如果不需要修改字段的數(shù)據(jù)類型,可以將新數(shù)據(jù)類型設(shè)置成與原來一樣,但數(shù)據(jù)類型不能為空。
刪除字段
ALTER TABLE <表名> DROP <字段名>;
實例:
alter table users drop age_test;
其中,“字段名”指需要從表中刪除的字段的名稱。
清空數(shù)據(jù)表
TRUNCATE [TABLE] 數(shù)據(jù)表名;
其中,TABLE 關(guān)鍵字可省略。
TRUNCATE 和 DELETE 的區(qū)別
從邏輯上說,TRUNCATE 語句與 DELETE 語句作用相同,但是在某些情況下,兩者在使用上有所區(qū)別。
DELETE 是 DML 類型的語句;TRUNCATE 是 DDL 類型的語句。它們都用來清空表中的數(shù)據(jù)。
DELETE 是逐行一條一條刪除記錄的;TRUNCATE則是直接刪除原來的表,再重新創(chuàng)建一個一模一樣的新表,而不是逐行刪除表中的數(shù)據(jù),執(zhí)行數(shù)據(jù)比 DELETE快。因此需要刪除表中全部的數(shù)據(jù)行時,盡量使用 TRUNCATE 語句, 可以縮短執(zhí)行時間。
DELETE 刪除數(shù)據(jù)后,配合事件回滾可以找回數(shù)據(jù);TRUNCATE 不支持事務(wù)的回滾,數(shù)據(jù)刪除后無法找回。
DELETE 刪除數(shù)據(jù)后,系統(tǒng)不會重新設(shè)置自增字段的計數(shù)器;TRUNCATE 清空表記錄后,系統(tǒng)會重新設(shè)置自增字段的計數(shù)器。
DELETE 的使用范圍更廣,因為它可以通過 WHERE 子句指定條件來刪除部分?jǐn)?shù)據(jù);而 TRUNCATE 不支持 WHERE 子句,只能刪除整體。
DELETE 會返回刪除數(shù)據(jù)的行數(shù),但是TRUNCATE 只會返回 0,沒有任何意義。
f) 約束(非空、主鍵、外鍵、唯一鍵等約束、自增字段)
- 如果你不想字段為 NULL 可以設(shè)置字段的屬性為 NOT NULL, 在操作數(shù)據(jù)庫時如果輸入該字段的數(shù)據(jù)為NULL ,就會報錯。
- AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數(shù)值會自動加1。
- PRIMARY KEY關(guān)鍵字用于定義列為主鍵。 您可以使用多列來定義主鍵,列間以逗號分隔。
-
ENGINE 設(shè)置存儲引擎,CHARSET 設(shè)置編碼。
g) 增加數(shù)據(jù):insert 語句
INSERT INTO 數(shù)據(jù)表名(列名1, 列名2,...列名N ) VALUES (值1, 值2,...值N );
注意該SQL語句中各個列名與值為一一對應(yīng)的關(guān)系,要注意以下幾種情況:
- 關(guān)于默認(rèn)值:當(dāng)該字段為not null且insert語句中沒有對該字段賦值時,會默認(rèn)使用默認(rèn)值:
(1)整形,我們一般使用0作為默認(rèn)值。
(2)字符串,默認(rèn)空字符串(“”)
(3)時間,可以默認(rèn)1970-01-01 08:00:01 - 若主鍵設(shè)置了自動遞增,當(dāng)主鍵被賦值null時,該主鍵字段值會自動遞增
- 增加數(shù)據(jù)時,當(dāng)想要往每一列中都設(shè)置值,可省略命令中的列名,即使用如下命令格式:
INSERT INTO 數(shù)據(jù)表名 VALUES (值1, 值2,...值N );
但注意這種情況下命令中的values括號中一定要每一列都賦值且與列名一一對應(yīng),若對應(yīng)列為not null則可以為其賦默認(rèn)值,若列可以為null可以賦值為null,總之若省略列名,則值需要賦完全。
- 列名可以為數(shù)據(jù)表中一個或多個列名,同樣要與values括號中值一一對應(yīng),而沒有賦值的列若為not null則會被賦值為默認(rèn)值,若可為null則會被賦為null
h) 查找數(shù)據(jù):select語句
常用命令格式:
SELECT {* | <字段列名>} FROM <表 1>, <表 2>… [WHERE <表達(dá)式>]
比較完整的命令格式:
中括號[]中的內(nèi)容表示該內(nèi)容是可選的,即按照需求選擇是否使用
SELECT {* | <字段列名>} FROM <表 1>, <表 2>…
[WHERE <表達(dá)式>]
[GROUP BY <group by definition>]
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
注意事項:
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,并使用WHERE語句來設(shè)定查詢條件。
- SELECT 命令可以讀取一條或者多條記錄。
- 你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數(shù)據(jù)
- 你可以使用 WHERE 語句來包含任何條件。
- 你可以使用 LIMIT 屬性來設(shè)定返回的記錄數(shù)。
實例:
查詢users表中所有信息:
select * from users;
查詢users表中username列與password列信息:
select username,password from users;
i) 條件:where子句、邏輯運算符
基本命令格式:
SELECT {* | <字段列名>} FROM <表 1>, <表 2>… [WHERE <表達(dá)式>]
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,并使用WHERE語句來設(shè)定查詢條件。
- 你可以在 WHERE 子句中指定任何條件。
- 你可以使用 AND 或者 OR 指定一個或多個條件。
- WHERE 子句也可以運用于 SQL 的 DELETE 或者 UPDATE 命令。
- WHERE 子句類似于程序語言中的 if 條件,根據(jù) MySQL 表中的字段值來讀取指定的數(shù)據(jù)。
- 使用Navicat新建數(shù)據(jù)庫DB_test
- 使用Navicat導(dǎo)入DB_test.sql文件
實例:
j) 限制數(shù)目:limit子句
基本命令格式:
SELECT {* | <字段列名>} FROM <表 1>, <表 2>… [WHERE <表達(dá)式>] LIMIT {記錄數(shù)|初始位置,記錄數(shù)};
實例:
1、
select * from account limit 初始位置,記錄數(shù);
由結(jié)果可以看到,該語句返回的分別是從第1、第3條記錄開始的之后的 3 條記錄。LIMIT 關(guān)鍵字后的第一個數(shù)字0、2分別表示從第 1、3 行開始(記錄的位置從 0 開始,第 1、3 行的位置為 0、2),第二個數(shù)字 3 表示返回的行數(shù)。
2、
select * from account limit 記錄數(shù);
如果“記錄數(shù)”的值小于查詢結(jié)果的總數(shù),則會從第一條記錄開始,顯示指定條數(shù)的記錄。如果“記錄數(shù)”的值大于查詢結(jié)果的總數(shù),則會直接顯示查詢出來的所有記錄。
k) 刪除數(shù)據(jù):delete語句
DELETE FROM 數(shù)據(jù)表名 [WHERE <條件>]
- 如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。
- 你可以在 WHERE 子句中指定任何條件
- 您可以在單個表中一次性刪除記錄。
- 當(dāng)想刪除數(shù)據(jù)表中指定的記錄時需要使用WHERE 子句
實例:
delete from users where password="eee";
l) 更新數(shù)據(jù):update語句
常用命令格式:
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
較完整命令格式:
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ]
[WHERE 子句 ]
[LIMIT 子句]
- <表名>:用于指定要更新的表名稱。
- SET 子句:用于指定表中要修改的列名及其列值。其中,每個指定的列值可以是表達(dá)式,也可以是該列對應(yīng)的默認(rèn)值。如果指定的是默認(rèn)值,可用關(guān)鍵字 DEFAULT 表示列值。
- WHERE 子句:可選項。用于限定表中要修改的行。若不指定,則修改表中所有的行。
- LIMIT 子句:可選項。用于限定被修改的行數(shù)。
- 可以同時更新一個或多個字段。
- 可以在 WHERE 子句中指定任何條件。
- 可以在一個單獨表中同時更新數(shù)據(jù)。
- 當(dāng)需要更新數(shù)據(jù)表中指定行的數(shù)據(jù)時需使用WHERE 子句
實例:
update users set age=666 where username="test1";
update users set age=1;
m) 排序:order by語句
基本語法格式:
SELECT 列名1[,…] FROM 表名 ORDER BY <字段名> [ASC|DESC]
語法說明如下:
- 字段名:表示需要排序的字段名稱,多個字段時用逗號隔開。
- ASC|DESC:ASC表示字段按升序排序;DESC表示字段按降序排序。其中ASC為默認(rèn)值。
使用 ORDER BY 關(guān)鍵字應(yīng)該注意以下幾個方面:
- ORDER BY 關(guān)鍵字后可以跟子查詢
- 當(dāng)排序的字段中存在空值時,ORDER BY 會將該空值作為最小值來對待。
- ORDER BY 指定多個字段進(jìn)行排序時,MySQL 會按照字段的順序從左到右依次進(jìn)行排序。
單字段排序
下面通過一個具體的實例來說明當(dāng) ORDER BY 指定單個字段時,MySQL 如何對查詢結(jié)果進(jìn)行排序。
select * from emp order by sal;
由結(jié)果可以看到,MySQL 對查詢的 SAL 字段的數(shù)據(jù)按數(shù)值的大小進(jìn)行了升序排序。
多字段排序
下面通過一個具體的實例來說明當(dāng) ORDER BY 指定多個字段時,MySQL 如何對查詢結(jié)果進(jìn)行排序。
select * from emp order by sal,hiredate;
注意:在對多個字段進(jìn)行排序時,排序的第一個字段必須有相同的值,才會對第二個字段進(jìn)行排序。如果第一個字段數(shù)據(jù)中所有的值都是唯一的,MySQL 將不再對第二個字段進(jìn)行排序。
關(guān)于字母排序:
默認(rèn)情況下,查詢數(shù)據(jù)按字母升序進(jìn)行排序(A~Z),但數(shù)據(jù)的排序并不僅限于此,還可以使用 ORDER BY 中的 DESC 對查詢結(jié)果進(jìn)行降序排序(Z~A)。
實例:
select * from emp order by ENAME;
n) 聚集函數(shù)(count、sum、max、average等)
count:
count返回符合條件的行的總數(shù)
基本格式:
select count(*|列名) from 數(shù)據(jù)表名 [WHERE ...]
實例:
查看雇員表emp雇員數(shù)量:
select count(*) from emp;
查看雇員表emp薪資sal大于1500的雇員數(shù)量:
select count(*) from emp where sal > 1500;
sum:
sum函數(shù)返回滿足where條件的行的和,一般使用在數(shù)值列
基本格式:
select sum(列名){,sum(列名)...} from 數(shù)據(jù)表名 [WHERE ...]
實例:
select sum(sal) from emp;
select sum(sal) from emp where sal>1500;
avg:
AVG函數(shù)返回滿足where條件的一列的平均值
基本格式:
Select avg(列名){,avg(列名)..} from 數(shù)據(jù)表名 [WHERE ...]
實例:
select avg(sal) from emp;
max/min:
Max/min函數(shù)返回滿足where條件的一列的最大/最小值
基本格式:
select max(列名) from 數(shù)據(jù)表名 [WHERE ...]
select min(列名) from 數(shù)據(jù)表名 [WHERE ...]
實例:
select max(sal) from emp;
select min(sal) from emp;
o) group by 語句
在 MySQL 中,GROUP BY 關(guān)鍵字可以根據(jù)一個或多個字段對查詢結(jié)果進(jìn)行分組。=
- 單獨使用 GROUP BY 關(guān)鍵字時,查詢結(jié)果會只顯示每個分組的第一條記錄。
- GROUP BY 關(guān)鍵字可以和 GROUP_CONCAT() 函數(shù)一起使用。GROUP_CONCAT() 函數(shù)會把每個分組的字段值都顯示出來。
- 在數(shù)據(jù)統(tǒng)計時,GROUP BY 關(guān)鍵字經(jīng)常和聚合函數(shù)一起使用。
- GROUP BY 與 WITH ROLLUP:WITH ROLLUP 可以實現(xiàn)在分組統(tǒng)計數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(SUM,AVG,COUNT…)。
基本格式:
SELECT column1[,列名2..] FROM table group by 列名
實例:
顯示每個部門的平均工資和最高工資:
SELECT AVG(sal), MAX(sal),deptno FROM emp GROUP BY deptno;
使用FORMAT方法,對小數(shù)點進(jìn)行處理
保留兩位小數(shù):
SELECT FORMAT(AVG(sal),2), MAX(sal),deptno FROM emp GROUP BY deptno;
顯示每個部門(deptno)的每種崗位(job)的平均工資和最高工資
select avg(sal),max(sal),deptno,job from emp group by deptno,job;
GROUP BY 關(guān)鍵字可以和 GROUP_CONCAT() 函數(shù)一起使用:
GROUP_CONCAT() 函數(shù)會把每個分組的字段值都顯示出來
實例:
查找出各個部門(deptno)中員工名字(ename)
select deptno,group_concat(ename) from emp group by deptno;
GROUP BY 與 WITH ROLLUP:
WITH ROLLUP 可以實現(xiàn)在分組統(tǒng)計數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(SUM,AVG,COUNT…)。
實例:
統(tǒng)計各個部門(deptno)各自的薪資(sal)平均值,并統(tǒng)計各個部門薪資平均值 的平均值
select deptno,avg(sal) from emp group by deptno with rollup;
統(tǒng)計各個部門(deptno)各自的薪資(sal)最大值,并統(tǒng)計各個部門薪資最大值 的最大值
select deptno,max(sal) from emp group by deptno with rollup;
p) 分組篩選:having語句
使用 having 子句對分組后的結(jié)果進(jìn)行過濾
基本格式:
SELECT column1[,列名2..] FROM table group by 列名 having 條件
實例:
顯示平均工資低于 2000 的部門號和它的平均工資
select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;
使用別名:
select deptno,avg(sal) as avgSal from emp group by deptno having avgSal<2000;
q) 高級查詢
i. 嵌套子查詢
子查詢是指嵌入在其它 sql 語句中的 select 語句,也叫嵌套查詢
子查詢在 WHERE 中的語法格式如下:
WHERE <表達(dá)式> <操作符> (子查詢)
其中,操作符可以是比較運算符和 IN、NOT IN、EXISTS、NOT EXISTS 等關(guān)鍵字。
實例:
如何顯示與 SMITH 同一部門的所有員工?
- 先查詢得到 SMITH 的部門號
select deptno from emp where ename='SMITH';
- 把上面的 select 語句當(dāng)做一個子查詢來使用
select * from emp where deptno = (select deptno from emp where ename='SMITH');
ii. exists|not exists子句
用于判斷子查詢的結(jié)果集是否為空,若子查詢的結(jié)果集不為空,返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回的值正好相反。
EXISTS 關(guān)鍵字可以和其它查詢條件一起使用,條件表達(dá)式與 EXISTS 關(guān)鍵字之間用 AND 和 OR 連接。
實例:
查詢emp表中是否存在deptno=10的部門,如果存在,就查詢出account表中的記錄:
select * from account where exists (select deptno from emp where deptno='10');
iii. In|not in子句
in子句:當(dāng)表達(dá)式與子查詢返回的結(jié)果集中的某個值相等時,返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回值正好相反。
實例:
如何顯示與 SMITH 或ALLEN 同一部門的所有員工?
1、先查詢SMITH和ALLEN分別在哪個部門:
select deptno from emp where ename='SMITH' or ename='ALLEN';
2、將上面select語句作為子查詢
select * from emp where deptno in
(select deptno from emp where ename='SMITH' or ename='ALLEN');
iv.**連接:(交叉連接(笛卡爾積)、內(nèi)連接、外連接(左連接、右連接) ) (選講)
在 MySQL 中,多表查詢主要有交叉連接、內(nèi)連接和外連接(外連接又包括左外連接和右外連接)。
交叉連接(CROSS JOIN或,)
交叉連接(CROSS JOIN)一般用來返回連接表的笛卡爾積。
交叉連接的語法格式如下:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
或
SELECT <字段名> FROM <表1>, <表2> [WHERE子句]
語法說明如下:
- 字段名:需要查詢的字段名稱。
- <表1><表2>:需要交叉連接的表名。
- WHERE 子句:用來設(shè)置交叉連接的查詢條件。
注意:多個表交叉連接時,在 FROM 后的表名之間連續(xù)使用 CROSS JOIN 或逗號,即可。以上兩種語法的返回結(jié)果是相同的,但是第一種語法才是官方建議的標(biāo)準(zhǔn)寫法。
當(dāng)連接的表之間沒有關(guān)系時,我們會省略掉 WHERE 子句,這時返回結(jié)果就是兩個表的笛卡爾積,返回結(jié)果數(shù)量就是兩個表的數(shù)據(jù)行相乘。需要注意的是,如果每個表有 1000 行,那么返回結(jié)果的數(shù)量就有 1000×1000 = 1000000 行,數(shù)據(jù)量是非常巨大的。
實例:
笛卡爾積實例:
select ename,sal,dname,emp.deptno from emp CROSS JOIN dept;
交叉查詢也可以使用where子句進(jìn)行結(jié)果過濾:
實例:
顯示雇員名,雇員工資及所在部門的名字
分析:
- 雇員名,雇員工資 來自 emp 表
- 部門的名字 來自 dept 表
- 需要對 emp 和 dept 查詢 ename,sal,dname,deptno字段
- 當(dāng)我們指定顯示某個表的列時,需要使用:表.列名
使用CROSS JOIN連接表名寫法:
select ename,sal,dname,emp.deptno from emp CROSS JOIN dept
where emp.deptno = dept.deptno;
使用逗號,連接表名寫法:
select ename,sal,dname,emp.deptno from emp,dept where emp.deptno = dept.deptno;
兩種方法的返回結(jié)果是相同的:
內(nèi)連接(INNER JOIN)
內(nèi)連接(INNER JOIN)主要通過設(shè)置連接條件的方式,來移除查詢結(jié)果中某些數(shù)據(jù)行的交叉連接。簡單來說,就是利用條件表達(dá)式來消除交叉連接的某些數(shù)據(jù)行。
內(nèi)連接使用 INNER JOIN 關(guān)鍵字連接兩張表,并使用 ON 子句來設(shè)置連接條件。如果沒有連接條件,INNER JOIN 和 CROSS JOIN 在語法上是等同的,兩者可以互換。
內(nèi)連接的語法格式如下:
SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
語法說明如下:
- 字段名:需要查詢的字段名稱。
- <表1><表2>:需要內(nèi)連接的表名。
- INNER JOIN :內(nèi)連接中可以省略 INNER 關(guān)鍵字,只用關(guān)鍵字 JOIN。
- ON 子句:用來設(shè)置內(nèi)連接的連接條件。
INNER JOIN 也可以使用 WHERE 子句指定連接條件,但是 INNER JOIN … ON 語法是官方的標(biāo)準(zhǔn)寫法,而且 WHERE 子句在某些時候會影響查詢的性能。
多個表內(nèi)連接時,在 FROM 后連續(xù)使用 INNER JOIN 或 JOIN 即可。
內(nèi)連接可以查詢兩個或兩個以上的表。為了讓大家更好的理解,暫時只講解兩個表的連接查詢。
實例:
顯示雇員名,雇員工資及所在部門的名字
分析:
- 雇員名,雇員工資 來自 emp 表
- 部門的名字 來自 dept 表
- 需求對 emp 和 dept 查詢 ename,sal,dname,deptno字段
- 當(dāng)我們需要指定顯示某個表的列時,需要使用:表.列名
使用INNER JOIN連接表名,ON后設(shè)置連接條件:
select ename,sal,dname,emp.deptno from
emp INNER JOIN dept
ON emp.deptno = dept.deptno;
以上命令也相當(dāng)于:
select ename,sal,dname,emp.deptno from
emp, dept
where emp.deptno = dept.deptno;
注意:當(dāng)對多個表進(jìn)行查詢時,要在 SELECT 語句后面指定字段是來源于哪一張表。因此,在多表查詢時,SELECT 語句后面的寫法是表名.列名。另外,如果表名非常長的話,也可以給表設(shè)置別名,這樣就可以直接在 SELECT 語句后面寫上表的別名.列名。
外連接(左連接、右連接)
外連接可以分為左外連接和右外連接
左連接(…LEFT JOIN…ON…)
獲取左表所有記錄,即使右表沒有對應(yīng)匹配的記錄
左外連接又稱為左連接,使用 LEFT OUTER JOIN 關(guān)鍵字連接兩個表,并使用 ON 子句來設(shè)置連接條件。
左連接的語法格式如下:
SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>
語法說明如下。
- 字段名:需要查詢的字段名稱。
- <表1><表2>:需要左連接的表名。
- LEFT OUTER JOIN:左連接中可以省略 OUTER 關(guān)鍵字,只使用關(guān)鍵字 LEFT JOIN。
- ON 子句:用來設(shè)置左連接的連接條件,不能省略。
上述語法中,“表1”為基表,“表2”為參考表。左連接查詢時,可以查詢出“表1”中的所有記錄和“表2”中匹配連接條件的記錄。如果“表1”的某行在“表2”中沒有匹配行,那么在返回結(jié)果中,“表2”的字段值均為空值(NULL)。
實例解釋:
顯示所有人的成績,如果沒有成績,也要顯示該人的姓名和 id 號,成績顯示為空
select `name`,stu.id,grade from
stu LEFT JOIN exam
ON stu.id=exam.id;
右連接
與 LEFT JOIN 相反,用于獲取右表所有記錄,即使左表沒有對應(yīng)匹配的記錄。
右外連接又稱為右連接,右連接是左連接的反向連接。使用 RIGHT OUTER JOIN 關(guān)鍵字連接兩個表,并使用 ON 子句來設(shè)置連接條件。
**右連接的語法格式如下:**
SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>
語法說明如下。
- 字段名:需要查詢的字段名稱。
- <表1><表2>:需要右連接的表名。
- RIGHT OUTER JOIN:右連接中可以省略 OUTER 關(guān)鍵字,只使用關(guān)鍵字 RIGHT JOIN。
- ON 子句:用來設(shè)置右連接的連接條件,不能省略。
與左連接相反,右連接以“表2”為基表,“表1”為參考表。右連接查詢時,可以查詢出“表2”中的所有記錄和“表1”中匹配連接條件的記錄。如果“表2”的某行在“表1”中沒有匹配行,那么在返回結(jié)果中,“表1”的字段值均為空值(NULL)。
實例解釋:
顯示所有成績,如果沒有名字匹配,顯示空
即:右邊的表(exam) 和左表(stu)沒有匹配的記錄,也會把右表的記錄顯示出來
select `name`,stu.id,grade from
stu RIGHT JOIN exam
ON stu.id=exam.id;
使用外連接查詢時,一定要分清需要查詢的結(jié)果,是需要顯示左表的全部記錄還是右表的全部記錄,然后選擇相應(yīng)的左連接和右連接。
r) **字符串查找:like子句(選講)
在 MySQL 中,LIKE 關(guān)鍵字主要用于搜索匹配字段中的指定內(nèi)容。
其基本語法格式如下:
SELECT {* | <字段列名>} FROM 表名 WHERE 字段列名 [NOT] LIKE '字符串';
其中:
- NOT :可選參數(shù),字段中的內(nèi)容與指定的字符串不匹配時滿足條件。
- 字符串:指定用來匹配的字符串。“字符串”可以是一個很完整的字符串,也可以包含通配符。
- LIKE 關(guān)鍵字支持百分號“%”和下劃線“_”通配符(通配符是一種特殊語句,主要用來模糊查詢。當(dāng)不知道真正字符或者懶得輸入完整名稱時,可以使用通配符來代替一個或多個真正的字符)。
- 注意:匹配的字符串必須加單引號或雙引號。
帶有“%”通配符的查詢
“%”是 MySQL 中最常用的通配符,它能代表任何長度的字符串,字符串的長度可以為 0。例如,a%b表示以字母 a 開頭,以字母 b 結(jié)尾的任意長度的字符串。該字符串可以代表 ab、acb、accb、accrb 等字符串。
實例:
select * from users where username like "tes%";
帶有“_”通配符的查詢
“_”只能代表單個字符,字符的長度不能為 0。例如,a_b可以代表 acb、adb、aub 等字符串。
實例:
select * from users where username like "test_";
如何讓LIKE 區(qū)分大小寫:
默認(rèn)情況下,LIKE 關(guān)鍵字匹配字符的時候是不區(qū)分大小寫的。如果需要區(qū)分大小寫,可以加入 BINARY 關(guān)鍵字。
實例:
select * from users where username like binary "Test_";
使用通配符的注意事項和技巧
下面是使用通配符的一些注意事項:
- 注意大小寫。MySQL 默認(rèn)是不區(qū)分大小寫的。如果區(qū)分大小寫,像“Tom”這樣的數(shù)據(jù)就不能被“t%”所匹配到。
- 注意尾部空格,尾部空格會干擾通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
- 注意 NULL?!?mark>%”通配符可以到匹配任意字符,但是不能匹配 NULL。也就是說 “%”匹配不到 tb_students_info 數(shù)據(jù)表中值為 NULL 的記錄。
下面是一些使用通配符要記住的技巧。
- 不要過度使用通配符,如果其它操作符能達(dá)到相同的目的,應(yīng)該使用其它操作符。因為 MySQL 對通配符的處理一般會比其他操作符花費更長的時間。
- 在確定使用通配符后,除非絕對有必要,否則不要把它們用在字符串的開始處。把通配符置于搜索模式的開始處,搜索起來是最慢的。
- 仔細(xì)注意通配符的位置。如果放錯地方,可能不會返回想要的數(shù)據(jù)。
拓展
如果查詢內(nèi)容中包含通配符,可以使用“\”轉(zhuǎn)義符轉(zhuǎn)義。
3. **非關(guān)系型數(shù)據(jù)庫mongodb簡介(選講)
簡介:
MongoDB是一個基于分布式文件存儲 [1] 的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。
MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
4. **非關(guān)系型數(shù)據(jù)庫redis簡介(選講)
簡介
Redis 是完全開源免費的,遵守 BSD 協(xié)議,是一個靈活的高性能 key-value 數(shù)據(jù)結(jié)構(gòu)存儲,可以用來作為數(shù)據(jù)庫、緩存和消息隊列。
Redis 比其他 key-value 緩存產(chǎn)品有以下三個特點:
- Redis 支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載到內(nèi)存使用。
- Redis 不僅支持簡單的 key-value 類型的數(shù)據(jù),同時還提供 list,set,zset,hash 等數(shù)據(jù)結(jié)構(gòu)的存儲。
- Redis 支持主從復(fù)制,即 master-slave 模式的數(shù)據(jù)備份。
Redis 的特點
- 高性能: Redis 將所有數(shù)據(jù)集存儲在內(nèi)存中,可以在入門級 Linux 機器中每秒寫(SET)11 萬次,讀(GET)8.1 萬次。Redis 支持 Pipelining 命令,可一次發(fā)送多條命令來提高吞吐率,減少通信延遲。
- 持久化:當(dāng)所有數(shù)據(jù)都存在于內(nèi)存中時,可以根據(jù)自上次保存以來經(jīng)過的時間和/或更新次數(shù),使用靈活的策略將更改異步保存在磁盤上。Redis 支持僅附加文件(AOF)持久化模式。
- 數(shù)據(jù)結(jié)構(gòu): Redis 支持各種類型的數(shù)據(jù)結(jié)構(gòu),例如字符串、散列、集合、列表、帶有范圍查詢的有序集、位圖、超級日志和帶有半徑查詢的地理空間索引。
- 原子操作:處理不同數(shù)據(jù)類型的 Redis 操作是原子操作,因此可以安全地 SET 或 INCR 鍵,添加和刪除集合中的元素等。
- 支持的語言: Redis 支持許多語言,如 C、C++、Erlang、Go、Haskell、Java、JavaScript(Node.js)、Lua、Objective-C、Perl、PHP、Python、R、Ruby、Rust、Scala、Smalltalk 等。
- 主/從復(fù)制: Redis 遵循非常簡單快速的主/從復(fù)制。配置文件中只需要一行來設(shè)置它,而 Slave 在 Amazon EC2 實例上完成 10 MM key 集的初始同步只需要 21 秒。
- 分片: Redis 支持分片。與其他鍵值存儲一樣,跨多個 Redis 實例分發(fā)數(shù)據(jù)集非常容易。
- 可移植: Redis 是用 C 編寫的,適用于大多數(shù) POSIX 系統(tǒng),如 Linux、BSD、Mac OS X、Solaris 等。
與其他 key-value 存儲有什么不同?
Redis 有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對它們的原子性操作,這是一個不同于其他數(shù)據(jù)庫的進(jìn)化路徑。Redis 的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時對程序員透明,無需進(jìn)行額外的抽象。
Redis 運行在內(nèi)存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進(jìn)行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個優(yōu)點是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣 Redis 可以做很多內(nèi)部復(fù)雜性很強的事情。同時,因 RDB 和 AOF 兩種磁盤持久化方式是不適合隨機訪問,因為它們是順序?qū)懭氲摹?/p>
Redis 架構(gòu)
Redis 主要由有兩個程序組成:文章來源:http://www.zghlxwxcb.cn/news/detail-854311.html
- Redis 客戶端 redis-cli
- Redis 服務(wù)器 redis-server
客戶端、服務(wù)器可以位于同一臺計算機或兩臺不同的計算機中。文章來源地址http://www.zghlxwxcb.cn/news/detail-854311.html
到了這里,關(guān)于MySQL數(shù)據(jù)庫基礎(chǔ)知識,基礎(chǔ)操作詳細(xì)整理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!