MYSQL知識點總結分享

本文主要和大家分享mysql知識點總結,希望能幫助大家更好的掌握和使用mysql數據庫

數據庫概述

database:數據庫,用于永久的存儲數據的軟件,海量存儲、高效存取。
?數據庫軟件的種類:

<span style="font-size: 14px;">(1)網狀數據庫<br/>(2)樹形/層次型數據庫<br/>(3)關系型數據庫(Relational DB)<br/> (4)非關系型數據庫(NoSQL)<br/></span>

RDBMS(RDB Management System)部署結構:
?(1)服務器端:負責存儲/管理數據,其中的數據都是二進制格式存儲,人無法直接查看——如工商銀行總行中的數據庫服務器
?(2)客戶端:負責連接到服務器,向服務器發送增刪改查指令——如ATM機

RDBMS服務器端數據的邏輯結構:
?Server=>Database=>table=>Row=>column

mysqld、httpd、ftpd、sshd、smbd….
Demon:精靈、守護者、守護程序、精靈程序、服務器程序

MySQL系統的使用

(1)服務器端:下載并安裝MySQL服務器軟件

<span style="font-size: 14px;">mysql.com<br/>mariadb.org<br/>xampp.org = Apache+MySQL+php<br/></span>

(2)服務器端:啟動MySQL服務器軟件

<span style="font-size: 14px;">c:/xampp/mysql/bin/mysqld.exe<br/>保證3306端口被打開<br/></span>

===========================
?(3)客戶端:下載并安裝一款MySQL客戶端軟件

<span style="font-size: 14px;">c:/xampp/mysql/bin/mysql.exe<br/>作用相當于銀行的ATM終端客戶機<br/></span>

(4)客戶端:提供用戶名和密碼,登錄到數據庫服務器上

<span style="font-size: 14px;">mysql.exe   -uroot   -p       不能加分號!<br/>mysql   -uroot              不能加分號!<br/></span>

MySQL服務器常用的管理命令

提示:所有的管理命令都必須以;分號結尾!僅use和quit除外!
?(1)quit; ? ? ? ?退出到服務器的連接
?(2)show databases; ? ?顯示當前服務器上所有的數據庫
?(3)use 庫名; ? ? ? ?進入/開始使用指定的數據庫
?(4)show tables; ? 顯示當前數據庫中有哪些表
?(5)desc 表名; ? ? ?描述一下指定表的列(描述表頭)

常用的SQL命令

SQL:Structured Query Language,結構化查詢語言,是一門編程語言。最早由IBM公司提出的,后來由ISO采納為關系型數據庫行業國際標準,先后推出了多個版本,如SQL87、SQL92、SQL99;目前各大數據庫廠家所支持。

SQL語句的執行方式:
?(1)交互模式:輸入一行執行一行,….,適合于臨時的查看數據。 ? mysql ?-uroot ?回車
?(2)腳本模式:把要執行的多條命令編寫在一個文本文件中,一次性的提交給服務器執行,適合于批量反復執行的多條語句。 ? mysql ?-uroot ?

SQL語言的語法: ? ? ? ?
(1)所有的SQL語句必須以;分號結尾。
(2)SQL語句不區分大小寫。習慣上,系統預定義的關鍵字都大寫,非關鍵字都小寫。
(3)SQL語句中可以使用 單行注釋(#…) 和 多行注釋(//)

DROP DATABASE if EXISTS 庫名;
CREATE DATABASE 庫名 CHARSET=UTF8;
USE 庫名;
CREATE TABLE 表名(列名 類型, ?列名 類型, ….);
INSERT intO 表名 VALUES(值, ?值, ….);
select ?* ?FROM ?表名;

數據庫中的亂碼問題

產生的原因:計算機把每個字符都分配唯一個數字。若存字符時與取字符時所用的編碼方案不同,就會產生亂碼。

<span style="font-size: 14px;">a <=> 97<br/>   b <=> 98<br/>....<br/></span>

字符編碼方案/字符集:把每個需要呈現的字符都分配一個唯一的數字編碼。世界上有幾套常用的字符集:
?(1)ASCII字符集:只對所有的英文字符進行了編碼(128個)
?(2)GB2312/GBK:對常用的英文字符、中文簡體字符都進行了編碼(40000多個)
?(3)BIG5:對常用的英文字符、中文繁體字符都進行了編碼
?(4)Unicode字符集:對常用的英文字符、簡體漢字、繁體漢字、日文、韓文…主流語言的常用符號都進行了編碼,具體存儲時又分為UTF-8/UTF-16/UTF-32三種存儲方案

解決亂碼問題的方法——保證“三處統一”:
(1).sql文件的存儲編碼
(2)mysql.exe連接mysqld.exe所用的編碼
(3)mysqld.exe中存儲數據所用的編碼

MySQL服務器端數據的邏輯結構:

SERVER=>DATABASE=>TABLE=>ROW=>COLUMN
如何連接到數據庫服務器:
?交互模式:mysql.exe ?-uroot ?-p
?腳本模式:mysql.exe ?-uroot ?-p ?

常用的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)數值類型 ? —— 可用引號括起來也可以不用

<span style="font-size: 14px;">整數數值類型:   student(  age TINYINT  )<br/>  TINYINT:微整數,占1字節,-128~127<br/>  SMALLINT:小整數,占2字節,-32768~32767<br/>  INT:整數,占4個字節, -2147483648~2147483647<br/>  BIGINT:大整數,占8個字節,.....<br/>小數數值類型:  product( price DECIMAL(7, 4) )<br/>  FLOAT(M,D):單精度浮點型,占4字節,3.4E38,計算時可能產生四舍五入<br/>  DOUBLE(M,D):雙精度浮點型,占8字節 1.8E30,計算時可能產生四舍五入<br/>  DECIMAL(M,D):定點小數,不會產生精度舍入<br/>布爾數值類型:   product( isOnsale BOOL)<br/>  BOOL,布爾/真假類型只能取值為TRUE/FALSE。注意:<br/>MySQL數據庫中沒有真正意義上的布爾類型,TRUE等同于1,FALSE等同于0<br/></span>

(2)日期時間類型 ?—— 必須用引號括起來

<span style="font-size: 14px;">DATE:日期類型,形如'2017-5-10'<br/>TIME:時間類型,形如'22:08:5'   <br/>DATETIME:日期/時間類型,形如'2017-10-25 22:8:5'<br/></span>

(3)字符串類型 ?—— 必須用引號括起來 ? emp(resume …)

<span style="font-size: 14px;">CHAR(M):定長字符串,比VARCHAR操作速度更快,M不能超過255<br/>VARCHAR(M):變長字符串,比CHAR更能節約空間,M不能超過65535<br/>TEXT(M):大型變長字符串,M不能超過2G<br/>ename CHAR(11)    ename VARCHAR(11)<br/></span>

a ? ?a000 ? ?a0
ab ? ?ab00 ? ?ab0
abc ? ?abc0 ? ?abc0
abcd ? ?abcd ? ?abcd
abcde ? ?abcd ? ?abcd
一二三四 ? ?一二三四 ? ?一二三四
一二三四五 ? ?一二三四 ? ?一二三四

true ?真 ? ? ? ?ture ?x
false ?假 ? ? ? ?flase ?x

MySQL中的列約束

Constraint:約束,數據庫中某列上的數據往往必須符合某種規范,如編號不能重復、年齡必須在一定范圍、密碼有長度限制、員工所在部門必須真的存在……類似的限制/規范就稱為“列約束”
?(1)主鍵約束 —— PRIMARY ?KEY

<span style="font-size: 14px;"> 聲明為主鍵的列上,不能出現重復值,也不能出現NULL值,所有的記錄會自動按照主鍵列上值由小到大排序 —— 因此一個表中至多只能有一個主鍵列。<br/></span>

(2)非空約束 —— NOT NULL

<span style="font-size: 14px;">聲明為非空的列,不能出現NULL,但可以出現重復值。<br/></span>

(3)唯一約束 —— UNIQUE

<span style="font-size: 14px;">聲明為唯一約束的列,不能出現重復的值,但可以出現NULL,且允許多個NULL出現(兩個NULL值是不等的)<br/></span>

(4)檢查約束 —— CHECK

<span style="font-size: 14px;">檢查約束可以檢查新插入的數據是否滿足指定的條件,如:<br/>student( age INT CHECK(age>=18  AND  age<=60)  )<br/>MySQL不支持此約束!<br/></span>

(5)默認值約束 —— default

<span style="font-size: 14px;">student(sid INT, sex CHAR(1) DEFAULT '男' );  <br/>使用默認值的方式<br/>1)INSERT INTO student VALUES(10, DEFAULT);<br/> 2)INSERT INTO student(sid) VALUES(20);<br/></span>

(6)外鍵約束 —— FOREIGN KEY…REFERENCES

<span style="font-size: 14px;">   外鍵列上可以出現NULL,也可以有重復值,但是必須保證“<br/>所有出現的值在另一個表的主鍵列上存在”——外鍵列上的值“參考了”另一個表上的主鍵值。<br/></span>

面試題:數據庫中主鍵約束 和 唯一且非空組合 約束有何區別?
PRIMARY KEY:是表中記錄的排序依據,故一個表至多有一個
UNIQUE NOT NULL:不會排序,故一個表可以有多個

程序中的NULL/空值的含義:表示應該有一個這樣的數據,但是暫時還沒有確定值是什么,如新員工的部門編號(尚未確定)、尚未確定的部門經理、尚未發到手的年終獎

項目中如何存儲日期時間數據

大體有三種方式
?(1)VARCHAR存儲:不足:不便于比較大小,格式不靈活
?(2)DATE/TIME/DATETIME存儲:不足:不便于實現國際化,不同的編程語言支持程度不同
?(3)BIGINT存儲:表示距離計算機元年的毫秒值,任何編程語言都可以把大數字轉換為日期時間

中國:2017-10-25
美國:10-25-2017
歐洲:25/10/2017
i18n:internationalization,國際化,實現了國際化的項目應該對中國人顯示中國人的習慣格式,對美國人顯示美國人的習慣格式…….
計算機中如何存儲日期時間:一個很大的數字,表示目標日期距離“計算機元年(1970-1-1 0:0:0 GMT)”經過了多少毫秒:
數字 ? ?代表的時間
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
?自增列:只能用于整數列,且必須是主鍵列。自增列無需手工賦值,會自動采用1/2/3….數列,在當前最大值基礎上+1。
?注意:SQL標準中沒有此關鍵字,它是MySQL所專有的!

1.簡單查詢 —— 只查詢特定的列
?示例:查詢出所有員工的姓名、工資、和編號

<span style="font-size: 14px;">SELECT ename, salary, eid  FROM emp;<br/></span>

練習:查詢出所有的員工姓名、性別、生日、姓名

<span style="font-size: 14px;">SELECT ename, sex, birthday, ename FROM emp;<br/></span>

2.簡單查詢 —— 查詢所有的列
?示例:查詢員工的所有信息
?SELECT ?* ?FROM ?emp;

3.簡單查詢 —— 給列取別名
?示例:查詢出員工姓名,所在部門編號,要求列名用中文呈現

<span style="font-size: 14px;"> SELECT  ename AS 姓名, deptId `部門 編號`  FROM emp;<br/></span>

注意:給列取別名用AS關鍵字,且可以省略;別名中若有空格,需要用括起來。

4.簡單查詢 —— 只顯示不同的記錄
?示例:顯示出哪些部門編號下有員工

<span style="font-size: 14px;">SELECT  DISTINCT deptId <br/>FROM emp;<br/></span>

說明: distinct:不同的
?練習:查詢出公司中有哪些性別的員工

<span style="font-size: 14px;">SELECT  DISTINCT  sex    FROM emp;<br/></span>

5.簡單查詢 —— 在查詢時執行計算
?示例:計算2/3的商

<span style="font-size: 14px;">SELECT  2/3;<br/></span>

示例:查詢出每個員工的姓名及其年薪

<span style="font-size: 14px;">SELECT  ename, salary,  salary*12<br/>FROM emp;<br/></span>

6.簡單查詢 —— 查詢結果集的排序
?示例:查詢出所有員工信息,按工資由小到大排列

<span style="font-size: 14px;">SELECT  * <br/>FROM emp<br/>ORDER  BY  salary ;    #ASC,ascendant 升序<br/></span>

示例:查詢出所有員工信息,按工資由大到小排列

<span style="font-size: 14px;">SELECT  * <br/>FROM emp<br/>ORDER  BY  salary  DESC;     #descendant 降序<br/></span>

7.簡單查詢 —— 條件查詢
?示例:查詢出編號為5的員工所有信息

<span style="font-size: 14px;">SELECT  *  FROM emp<br/>WHERE  eid=5 ;<br/></span>

8.簡單查詢 —— 模糊條件查詢
?示例:查詢出姓名中包含字母E的員工所有信息

<span style="font-size: 14px;">SELECT  *  FROM  emp<br/>WHERE  ename  LIKE  '%E%';<br/>#WHERE  ename='%E%'; #錯誤寫法!<br/></span>

SQL通配符: ?下面兩個通配符必須與LIKE組合應用
% ? 匹配任意多個任意字符 ? ?
_ ? ?匹配一個任意字符

9.簡單查詢 —— 分頁查詢
?分頁查詢:若數據庫中的滿足條件的記錄行數太多,一般會采取“一頁一頁”的方式逐步展示給用戶。
?不同的數據庫實現分頁查詢語法各不相同,MySQL中的分頁查詢時最簡單的!形如:

<span style="font-size: 14px;">SELECT  ...<br/>FROM ...<br/>WHERE  ...<br/>ORDER BY ...<br/>LIMIT  start, count ;<br/></span>

start:從哪一行開始讀取數據,數據庫中的第一行記錄稱為第0行
?count:一次最多可以讀取的行數
?假設:每一頁最多呈現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 ;

復雜查詢 —— 聚合/分組查詢

函數:一個可以接收若干數據,加以處理,輸出特定數據的功能體 —— 餃子機
MySQL提供的函數: COUNT()、SUM()、AVG()、MAX()、MIN() —— ?聚合函數
示例:查詢出所有員工的總數量

<span style="font-size: 14px;">SELECT  COUNT(eid) AS 編號數量  FROM emp;  #15<br/>SELECT  COUNT(deptId)  FROM emp;            #14<br/>SELECT  COUNT(*)  FROM emp;                #15<br/></span>

示例:查詢出每個部門的編號以及該部門的員工數量(先分組再聚合計算)

<span style="font-size: 14px;">SELECT  deptId, COUNT(*) FROM  emp<br/>GROUP  BY  deptId;<br/></span>

注意:分組查詢的結果集中只能包含兩種列:
(1)分組條件列
(2)其他列的聚合函數
SELECT ?deptId, COUNT(ename), ename FROM ?emp
GROUP ?BY ?deptId; ? #錯誤寫法

復雜查詢 —— 子查詢

子查詢:在一條語句(增刪改查)中又嵌入了一條SELECT語句
?示例:查詢出“研發部”所有員工的信息
?步驟1:到部門表查詢出研發部對應的部門編號,如10

<span style="font-size: 14px;">SELECT  did  FROM  dept <br/>WHERE  dname='研發部';<br/></span>

步驟2:到員工表查詢部門編號為10的員工信息

<span style="font-size: 14px;">SELECT  *   FROM  emp<br/>WHERE  deptId=10;<br/></span>

綜合兩條語句:

<span style="font-size: 14px;">SELECT  *   FROM  emp<br/>WHERE  deptId=( <br/>    SELECT  did  FROM  dept <br/>    WHERE  dname='研發部'<br/>);   #父查詢中需要的條件數據由子查詢提供<br/></span>

復雜查詢 —— 跨表/多表查詢

示例:查詢出每個員工的姓名及其所在部門的名稱

<span style="font-size: 14px;">SELECT  ename, dname<br/>FROM  emp, dept;      #錯誤!得到了“笛卡爾積”<br/> <br/>SELECT  ename, dname<br/>FROM  emp, dept<br/>WHERE  deptId=did;  #跨表查詢必須防止“笛卡爾積”<br/>注意:上述語法是SQL-92標準中的跨表查詢語法。缺陷:<br/></span>

若某個中的記錄在對方表中無對應項,則總結果無法顯示這樣的記錄。
如deptId為NULL的員工、沒有員工的部門都無法顯示。

<span style="font-size: 14px;">SQL-99中的跨表查詢語法分為四種:<br/>(1)內連接查詢  INNER JOIN  查詢結果與SQL-92標準一樣!<br/>    SELECT  ename,  dname<br/>    FROM  emp   INNER JOIN  dept<br/>    ON  deptId=did;  #兩個表的拼接條件用ON聲明<br/>  (2)左外連接查詢  LEFT [OUTER] JOIN<br/>    SELECT  ename,  dname<br/>    FROM  emp   LEFT  OUTER  JOIN  dept<br/>    ON  deptId=did;  #顯示“左側”表中的所有記錄!<br/>  (3)右外連接查詢  RIGHT OUTER JOIN<br/>    SELECT  ename,  dname<br/>    FROM  emp   RIGHT  OUTER  JOIN  dept<br/>    ON  deptId=did;  #顯示“右側”表中的所有記錄!<br/>  (4)全連接查詢 FULL JOIN<br/>    注意:MySQL不支持全連接!<br/></span>

MySQL中解決“不支持全連接”的方法 —— 結果集的合并:

<span style="font-size: 14px;">(SELECT  ename  FROM  emp_cn)<br/>UNION<br/>(SELECT  ename  FROM  emp_us);  #合并相同的記錄<br/> ------------------------------------------------<br/>(SELECT  ename  FROM  emp_cn)<br/>UNION  ALL<br/>(SELECT  ename  FROM  emp_us);  #不合并相同的記錄<br/></span>

SQL語句的分類:

DDL: Data define Language,數據定義語言——定義列

<span style="font-size: 14px;"> CREATE / DROP / ALTER / TRUNCATE<br/></span>

DML: Data Manipulate Language,數據操作語言——操作行

<span style="font-size: 14px;"> INSERT / DELETE / UPDATE<br/></span>

DQL: Data Query Language,數據查詢語言——不影響數據

<span style="font-size: 14px;"> SELECT<br/></span>

DCL: Data Control Language,數據控制語言——控制權限

<span style="font-size: 14px;"> GRANT / REVOKE<br/></span>

小知識:mysqli_query($conn, $sql)的返回值類型:
(1)DML: 增刪改,執行失敗返回false,成功返回true
(2)DQL: 查,執行失敗返回false,成功返回查詢結果集對象,可能有0/1/N行數據;
從其中獲取一行數據可以使用:
?$row=mysqli_fetch_row($result);抓取一個索引數組或null
?$row=mysqli_fetch_assoc($result);抓取一個關聯數組或null
從其中獲取所有記錄行可以使用:
?$rowList=mysqli_fetch_all($result, MYSQLI_ASSOC);抓取一個二維數組,每一行呈現為一個關聯數組

相關推薦:

mysql知識點總結_MySQL

mysql知識點總結_MySQL

mysql知識點總結_MySQL

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享