MYSQL知識(shí)點(diǎn)總結(jié)分享
發(fā)表時(shí)間:2023-07-14 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文主要和大家分享MYSQL知識(shí)點(diǎn)總結(jié),希望能幫助大家更好的掌握和使用mysql數(shù)據(jù)庫。數(shù)據(jù)庫概述Database:數(shù)據(jù)庫,用于永久的存儲(chǔ)數(shù)據(jù)的軟件,海量存儲(chǔ)、高效存取。 數(shù)據(jù)庫軟件的種類:(1)...
本文主要和大家分享MYSQL知識(shí)點(diǎn)總結(jié),希望能幫助大家更好的掌握和使用mysql數(shù)據(jù)庫。
數(shù)據(jù)庫概述
Database:數(shù)據(jù)庫,用于永久的存儲(chǔ)數(shù)據(jù)的軟件,海量存儲(chǔ)、高效存取。
數(shù)據(jù)庫軟件的種類:
(1)網(wǎng)狀數(shù)據(jù)庫
(2)樹形/層次型數(shù)據(jù)庫
(3)關(guān)系型數(shù)據(jù)庫(Relational DB)
(4)非關(guān)系型數(shù)據(jù)庫(NoSQL)
RDBMS(RDB Management System)部署結(jié)構(gòu):
(1)服務(wù)器端:負(fù)責(zé)存儲(chǔ)/管理數(shù)據(jù),其中的數(shù)據(jù)都是二進(jìn)制格式存儲(chǔ),人無法直接查看——如工商銀行總行中的數(shù)據(jù)庫服務(wù)器
(2)客戶端:負(fù)責(zé)連接到服務(wù)器,向服務(wù)器發(fā)送增刪改查指令——如ATM機(jī)
RDBMS服務(wù)器端數(shù)據(jù)的邏輯結(jié)構(gòu):
Server=>Database=>Table=>Row=>Column
mysqld、httpd、ftpd、sshd、smbd....
Demon:精靈、守護(hù)者、守護(hù)程序、精靈程序、服務(wù)器程序
MySQL系統(tǒng)的使用
(1)服務(wù)器端:下載并安裝MySQL服務(wù)器軟件
mysql.com
mariadb.org
xampp.org = Apache+MySQL+PHP
(2)服務(wù)器端:啟動(dòng)MySQL服務(wù)器軟件
c:/xampp/mysql/bin/mysqld.exe
保證3306端口被打開
===========================
(3)客戶端:下載并安裝一款MySQL客戶端軟件
c:/xampp/mysql/bin/mysql.exe
作用相當(dāng)于銀行的ATM終端客戶機(jī)
(4)客戶端:提供用戶名和密碼,登錄到數(shù)據(jù)庫服務(wù)器上
mysql.exe -uroot -p 不能加分號(hào)!
mysql -uroot 不能加分號(hào)!
MySQL服務(wù)器常用的管理命令
提示:所有的管理命令都必須以;分號(hào)結(jié)尾!僅use和quit除外!
(1)quit; 退出到服務(wù)器的連接
(2)show databases; 顯示當(dāng)前服務(wù)器上所有的數(shù)據(jù)庫
(3)use 庫名; 進(jìn)入/開始使用指定的數(shù)據(jù)庫
(4)show tables; 顯示當(dāng)前數(shù)據(jù)庫中有哪些表
(5)desc 表名; 描述一下指定表的列(描述表頭)
常用的SQL命令
SQL:Structured Query Language,結(jié)構(gòu)化查詢語言,是一門編程語言。最早由IBM公司提出的,后來由ISO采納為關(guān)系型數(shù)據(jù)庫行業(yè)國際標(biāo)準(zhǔn),先后推出了多個(gè)版本,如SQL87、SQL92、SQL99;目前各大數(shù)據(jù)庫廠家所支持。
SQL語句的執(zhí)行方式:
(1)交互模式:輸入一行執(zhí)行一行,....,適合于臨時(shí)的查看數(shù)據(jù)。 mysql -uroot 回車
(2)腳本模式:把要執(zhí)行的多條命令編寫在一個(gè)文本文件中,一次性的提交給服務(wù)器執(zhí)行,適合于批量反復(fù)執(zhí)行的多條語句。 mysql -uroot < d:/xx.sql 回車
SQL語言的語法:
(1)所有的SQL語句必須以;分號(hào)結(jié)尾。
(2)SQL語句不區(qū)分大小寫。習(xí)慣上,系統(tǒng)預(yù)定義的關(guān)鍵字都大寫,非關(guān)鍵字都小寫。
(3)SQL語句中可以使用 單行注釋(#...) 和 多行注釋(/.../)
DROP DATABASE IF EXISTS 庫名;
CREATE DATABASE 庫名 CHARSET=UTF8;
USE 庫名;
CREATE TABLE 表名(列名 類型, 列名 類型, ....);
INSERT INTO 表名 VALUES(值, 值, ....);
SELECT * FROM 表名;
數(shù)據(jù)庫中的亂碼問題
產(chǎn)生的原因:計(jì)算機(jī)把每個(gè)字符都分配唯一個(gè)數(shù)字。若存字符時(shí)與取字符時(shí)所用的編碼方案不同,就會(huì)產(chǎn)生亂碼。
a <=> 97
b <=> 98
....
字符編碼方案/字符集:把每個(gè)需要呈現(xiàn)的字符都分配一個(gè)唯一的數(shù)字編碼。世界上有幾套常用的字符集:
(1)ASCII字符集:只對所有的英文字符進(jìn)行了編碼(128個(gè))
(2)GB2312/GBK:對常用的英文字符、中文簡體字符都進(jìn)行了編碼(40000多個(gè))
(3)BIG5:對常用的英文字符、中文繁體字符都進(jìn)行了編碼
(4)Unicode字符集:對常用的英文字符、簡體漢字、繁體漢字、日文、韓文...主流語言的常用符號(hào)都進(jìn)行了編碼,具體存儲(chǔ)時(shí)又分為UTF-8/UTF-16/UTF-32三種存儲(chǔ)方案
解決亂碼問題的方法——保證“三處統(tǒng)一”:
(1).sql文件的存儲(chǔ)編碼
(2)mysql.exe連接mysqld.exe所用的編碼
(3)mysqld.exe中存儲(chǔ)數(shù)據(jù)所用的編碼
MySQL服務(wù)器端數(shù)據(jù)的邏輯結(jié)構(gòu):
SERVER=>DATABASE=>TABLE=>ROW=>COLUMN
如何連接到數(shù)據(jù)庫服務(wù)器:
交互模式:mysql.exe -uroot -p
腳本模式:mysql.exe -uroot -p < d:/2.sql
常用的SQL語句:
(1)增:INSERT INTO 表 VALUES(值, 值, ...);
(2)刪:DELETE FROM 表;
(3)改:UPDATE 表 SET 列=值, ...,列=值 ;
(4)查:SELECT * FROM 表;
DELETE FROM laptop; #刪除所有的記錄行
DELETE FROM laptop WHERE lid=10; #刪除滿足條件的記錄行
UPDATE laptop
SET price='3000',pic='img/50.jpg',isOnsale='否'; #更新所有的記錄行
UPDATE laptop
SET price='3000',pic='img/50.jpg',isOnsale='否'
WHERE lid=31; #更新滿足條件的行
MySQL中的列類型
(1)數(shù)值類型 —— 可用引號(hào)括起來也可以不用
整數(shù)數(shù)值類型: student( age TINYINT )
TINYINT:微整數(shù),占1字節(jié),-128~127
SMALLINT:小整數(shù),占2字節(jié),-32768~32767
INT:整數(shù),占4個(gè)字節(jié), -2147483648~2147483647
BIGINT:大整數(shù),占8個(gè)字節(jié),.....
小數(shù)數(shù)值類型: product( price DECIMAL(7, 4) )
FLOAT(M,D):單精度浮點(diǎn)型,占4字節(jié),3.4E38,計(jì)算時(shí)可能產(chǎn)生四舍五入
DOUBLE(M,D):雙精度浮點(diǎn)型,占8字節(jié) 1.8E30,計(jì)算時(shí)可能產(chǎn)生四舍五入
DECIMAL(M,D):定點(diǎn)小數(shù),不會(huì)產(chǎn)生精度舍入
布爾數(shù)值類型: product( isOnsale BOOL)
BOOL,布爾/真假類型只能取值為TRUE/FALSE。注意:
MySQL數(shù)據(jù)庫中沒有真正意義上的布爾類型,TRUE等同于1,F(xiàn)ALSE等同于0
(2)日期時(shí)間類型 —— 必須用引號(hào)括起來
DATE:日期類型,形如'2017-5-10'
TIME:時(shí)間類型,形如'22:08:5'
DATETIME:日期/時(shí)間類型,形如'2017-10-25 22:8:5'
(3)字符串類型 —— 必須用引號(hào)括起來 emp(resume ...)
CHAR(M):定長字符串,比VARCHAR操作速度更快,M不能超過255
VARCHAR(M):變長字符串,比CHAR更能節(jié)約空間,M不能超過65535
TEXT(M):大型變長字符串,M不能超過2G
ename CHAR(11) ename VARCHAR(11)
a a000 a0
ab ab00 ab0
abc abc0 abc0
abcd abcd abcd
abcde abcd abcd
一二三四 一二三四 一二三四
一二三四五 一二三四 一二三四
true 真 ture x
false 假 flase x
MySQL中的列約束
Constraint:約束,數(shù)據(jù)庫中某列上的數(shù)據(jù)往往必須符合某種規(guī)范,如編號(hào)不能重復(fù)、年齡必須在一定范圍、密碼有長度限制、員工所在部門必須真的存在......類似的限制/規(guī)范就稱為“列約束”
(1)主鍵約束 —— PRIMARY KEY
聲明為主鍵的列上,不能出現(xiàn)重復(fù)值,也不能出現(xiàn)NULL值,所有的記錄會(huì)自動(dòng)按照主鍵列上值由小到大排序 —— 因此一個(gè)表中至多只能有一個(gè)主鍵列。
(2)非空約束 —— NOT NULL
聲明為非空的列,不能出現(xiàn)NULL,但可以出現(xiàn)重復(fù)值。
(3)唯一約束 —— UNIQUE
聲明為唯一約束的列,不能出現(xiàn)重復(fù)的值,但可以出現(xiàn)NULL,且允許多個(gè)NULL出現(xiàn)(兩個(gè)NULL值是不等的)
(4)檢查約束 —— CHECK
檢查約束可以檢查新插入的數(shù)據(jù)是否滿足指定的條件,如:
student( age INT CHECK(age>=18 AND age<=60) )
MySQL不支持此約束!
(5)默認(rèn)值約束 —— DEFAULT
student(sid INT, sex CHAR(1) DEFAULT '男' );
使用默認(rèn)值的方式
1)INSERT INTO student VALUES(10, DEFAULT);
2)INSERT INTO student(sid) VALUES(20);
(6)外鍵約束 —— FOREIGN KEY...REFERENCES
外鍵列上可以出現(xiàn)NULL,也可以有重復(fù)值,但是必須保證“
所有出現(xiàn)的值在另一個(gè)表的主鍵列上存在”——外鍵列上的值“參考了”另一個(gè)表上的主鍵值。
面試題:數(shù)據(jù)庫中主鍵約束 和 唯一且非空組合 約束有何區(qū)別?
PRIMARY KEY:是表中記錄的排序依據(jù),故一個(gè)表至多有一個(gè)
UNIQUE NOT NULL:不會(huì)排序,故一個(gè)表可以有多個(gè)
程序中的NULL/空值的含義:表示應(yīng)該有一個(gè)這樣的數(shù)據(jù),但是暫時(shí)還沒有確定值是什么,如新員工的部門編號(hào)(尚未確定)、尚未確定的部門經(jīng)理、尚未發(fā)到手的年終獎(jiǎng)
項(xiàng)目中如何存儲(chǔ)日期時(shí)間數(shù)據(jù)
大體有三種方式
(1)VARCHAR存儲(chǔ):不足:不便于比較大小,格式不靈活
(2)DATE/TIME/DATETIME存儲(chǔ):不足:不便于實(shí)現(xiàn)國際化,不同的編程語言支持程度不同
(3)BIGINT存儲(chǔ):表示距離計(jì)算機(jī)元年的毫秒值,任何編程語言都可以把大數(shù)字轉(zhuǎn)換為日期時(shí)間
中國:2017-10-25
美國:10-25-2017
歐洲:25/10/2017
i18n:internationalization,國際化,實(shí)現(xiàn)了國際化的項(xiàng)目應(yīng)該對中國人顯示中國人的習(xí)慣格式,對美國人顯示美國人的習(xí)慣格式.......
計(jì)算機(jī)中如何存儲(chǔ)日期時(shí)間:一個(gè)很大的數(shù)字,表示目標(biāo)日期距離“計(jì)算機(jī)元年(1970-1-1 0:0:0 GMT)”經(jīng)過了多少毫秒:
數(shù)字 代表的時(shí)間
0 1970-1-1 0:0:0
1000 1970-1-1 0:0:1
-1000 1969-12-31 23:59:59
1000*60 1970-1-1 0:1:0
10006060 1970-1-1 1:0:0
10006060*24 1970-1-2 0:0:0
1000606024365 1971-1-1 0:0:0
MySQL中使用自增列
id INT PRIMARY KEY AUTO_INCREMENT
自增列:只能用于整數(shù)列,且必須是主鍵列。自增列無需手工賦值,會(huì)自動(dòng)采用1/2/3....數(shù)列,在當(dāng)前最大值基礎(chǔ)上+1。
注意:SQL標(biāo)準(zhǔn)中沒有此關(guān)鍵字,它是MySQL所專有的!
1.簡單查詢 —— 只查詢特定的列
示例:查詢出所有員工的姓名、工資、和編號(hào)
SELECT ename, salary, eid FROM emp;
練習(xí):查詢出所有的員工姓名、性別、生日、姓名
SELECT ename, sex, birthday, ename FROM emp;
2.簡單查詢 —— 查詢所有的列
示例:查詢員工的所有信息
SELECT * FROM emp;
3.簡單查詢 —— 給列取別名
示例:查詢出員工姓名,所在部門編號(hào),要求列名用中文呈現(xiàn)
SELECT ename AS 姓名, deptId `部門 編號(hào)` FROM emp;
注意:給列取別名用AS關(guān)鍵字,且可以省略;別名中若有空格,需要用括起來。
4.簡單查詢 —— 只顯示不同的記錄
示例:顯示出哪些部門編號(hào)下有員工
SELECT DISTINCT deptId
FROM emp;
說明: distinct:不同的
練習(xí):查詢出公司中有哪些性別的員工
SELECT DISTINCT sex FROM emp;
5.簡單查詢 —— 在查詢時(shí)執(zhí)行計(jì)算
示例:計(jì)算2/3的商
SELECT 2/3;
示例:查詢出每個(gè)員工的姓名及其年薪
SELECT ename, salary, salary*12
FROM emp;
6.簡單查詢 —— 查詢結(jié)果集的排序
示例:查詢出所有員工信息,按工資由小到大排列
SELECT *
FROM emp
ORDER BY salary ; #ASC,ascendant 升序
示例:查詢出所有員工信息,按工資由大到小排列
SELECT *
FROM emp
ORDER BY salary DESC; #descendant 降序
7.簡單查詢 —— 條件查詢
示例:查詢出編號(hào)為5的員工所有信息
SELECT * FROM emp
WHERE eid=5 ;
8.簡單查詢 —— 模糊條件查詢
示例:查詢出姓名中包含字母E的員工所有信息
SELECT * FROM emp
WHERE ename LIKE '%E%';
#WHERE ename='%E%'; #錯(cuò)誤寫法!
SQL通配符: 下面兩個(gè)通配符必須與LIKE組合應(yīng)用
% 匹配任意多個(gè)任意字符
_ 匹配一個(gè)任意字符
9.簡單查詢 —— 分頁查詢
分頁查詢:若數(shù)據(jù)庫中的滿足條件的記錄行數(shù)太多,一般會(huì)采取“一頁一頁”的方式逐步展示給用戶。
不同的數(shù)據(jù)庫實(shí)現(xiàn)分頁查詢語法各不相同,MySQL中的分頁查詢時(shí)最簡單的!形如:
SELECT ...
FROM ...
WHERE ...
ORDER BY ...
LIMIT start, count ;
start:從哪一行開始讀取數(shù)據(jù),數(shù)據(jù)庫中的第一行記錄稱為第0行
count:一次最多可以讀取的行數(shù)
假設(shè):每一頁最多呈現(xiàn)6條記錄(稱為“頁面大小”pageSize)
第1頁: SELECT .... LIMIT 0, 6 ;
第2頁: SELECT .... LIMIT 6, 6 ;
第3頁: SELECT .... LIMIT 12, 6 ;
第4頁: SELECT .... LIMIT 18, 6 ;
....
第n頁: SELECT .... LIMIT (n-1)*pageSize, pageSize ;
復(fù)雜查詢 —— 聚合/分組查詢
函數(shù):一個(gè)可以接收若干數(shù)據(jù),加以處理,輸出特定數(shù)據(jù)的功能體 —— 餃子機(jī)
MySQL提供的函數(shù): COUNT()、SUM()、AVG()、MAX()、MIN() —— 聚合函數(shù)
示例:查詢出所有員工的總數(shù)量
SELECT COUNT(eid) AS 編號(hào)數(shù)量 FROM emp; #15
SELECT COUNT(deptId) FROM emp; #14
SELECT COUNT(*) FROM emp; #15
示例:查詢出每個(gè)部門的編號(hào)以及該部門的員工數(shù)量(先分組再聚合計(jì)算)
SELECT deptId, COUNT(*) FROM emp
GROUP BY deptId;
注意:分組查詢的結(jié)果集中只能包含兩種列:
(1)分組條件列
(2)其他列的聚合函數(shù)
SELECT deptId, COUNT(ename), ename FROM emp
GROUP BY deptId; #錯(cuò)誤寫法
復(fù)雜查詢 —— 子查詢
子查詢:在一條語句(增刪改查)中又嵌入了一條SELECT語句
示例:查詢出“研發(fā)部”所有員工的信息
步驟1:到部門表查詢出研發(fā)部對應(yīng)的部門編號(hào),如10
SELECT did FROM dept
WHERE dname='研發(fā)部';
步驟2:到員工表查詢部門編號(hào)為10的員工信息
SELECT * FROM emp
WHERE deptId=10;
綜合兩條語句:
SELECT * FROM emp
WHERE deptId=(
SELECT did FROM dept
WHERE dname='研發(fā)部'
); #父查詢中需要的條件數(shù)據(jù)由子查詢提供
復(fù)雜查詢 —— 跨表/多表查詢
示例:查詢出每個(gè)員工的姓名及其所在部門的名稱
SELECT ename, dname
FROM emp, dept; #錯(cuò)誤!得到了“笛卡爾積”
SELECT ename, dname
FROM emp, dept
WHERE deptId=did; #跨表查詢必須防止“笛卡爾積”
注意:上述語法是SQL-92標(biāo)準(zhǔn)中的跨表查詢語法。缺陷:
若某個(gè)中的記錄在對方表中無對應(yīng)項(xiàng),則總結(jié)果無法顯示這樣的記錄。
如deptId為NULL的員工、沒有員工的部門都無法顯示。
SQL-99中的跨表查詢語法分為四種:
(1)內(nèi)連接查詢 INNER JOIN 查詢結(jié)果與SQL-92標(biāo)準(zhǔn)一樣!
SELECT ename, dname
FROM emp INNER JOIN dept
ON deptId=did; #兩個(gè)表的拼接條件用ON聲明
(2)左外連接查詢 LEFT [OUTER] JOIN
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON deptId=did; #顯示“左側(cè)”表中的所有記錄!
(3)右外連接查詢 RIGHT OUTER JOIN
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON deptId=did; #顯示“右側(cè)”表中的所有記錄!
(4)全連接查詢 FULL JOIN
注意:MySQL不支持全連接!
MySQL中解決“不支持全連接”的方法 —— 結(jié)果集的合并:
(SELECT ename FROM emp_cn)
UNION
(SELECT ename FROM emp_us); #合并相同的記錄
------------------------------------------------
(SELECT ename FROM emp_cn)
UNION ALL
(SELECT ename FROM emp_us); #不合并相同的記錄
SQL語句的分類:
DDL: Data Define Language,數(shù)據(jù)定義語言——定義列
CREATE / DROP / ALTER / TRUNCATE
DML: Data Manipulate Language,數(shù)據(jù)操作語言——操作行
INSERT / DELETE / UPDATE
DQL: Data Query Language,數(shù)據(jù)查詢語言——不影響數(shù)據(jù)
SELECT
DCL: Data Control Language,數(shù)據(jù)控制語言——控制權(quán)限
GRANT / REVOKE
小知識(shí):mysqli_query($conn, $sql)的返回值類型:
(1)DML: 增刪改,執(zhí)行失敗返回false,成功返回true
(2)DQL: 查,執(zhí)行失敗返回false,成功返回查詢結(jié)果集對象,可能有0/1/N行數(shù)據(jù);
從其中獲取一行數(shù)據(jù)可以使用:
$row=mysqli_fetch_row($result);抓取一個(gè)索引數(shù)組或null
$row=mysqli_fetch_assoc($result);抓取一個(gè)關(guān)聯(lián)數(shù)組或null
從其中獲取所有記錄行可以使用:
$rowList=mysqli_fetch_all($result, MYSQLI_ASSOC);抓取一個(gè)二維數(shù)組,每一行呈現(xiàn)為一個(gè)關(guān)聯(lián)數(shù)組
相關(guān)推薦:
mysql知識(shí)點(diǎn)總結(jié)_MySQL
mysql建議連接及查詢數(shù)據(jù)表PHP代碼
mysql連接數(shù)據(jù)庫并測試實(shí)例分享
以上就是MYSQL知識(shí)點(diǎn)總結(jié)分享的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。