溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MYSQL中基礎(chǔ)知識點有哪些

發(fā)布時間:2021-06-07 13:59:12 來源:億速云 閱讀:135 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章給大家分享的是有關(guān)MYSQL中基礎(chǔ)知識點有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

數(shù)據(jù)庫概述

Database:數(shù)據(jù)庫,用于永久的存儲數(shù)據(jù)的軟件,海量存儲、高效存取。
 數(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ù)器端:負責存儲/管理數(shù)據(jù),其中的數(shù)據(jù)都是二進制格式存儲,人無法直接查看——如工商銀行總行中的數(shù)據(jù)庫服務(wù)器
 (2)客戶端:負責連接到服務(wù)器,向服務(wù)器發(fā)送增刪改查指令——如ATM機

RDBMS服務(wù)器端數(shù)據(jù)的邏輯結(jié)構(gòu):
 Server=>Database=>Table=>Row=>Column

mysqld、httpd、ftpd、sshd、smbd....
Demon:精靈、守護者、守護程序、精靈程序、服務(wù)器程序

MySQL系統(tǒng)的使用

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

mysql.com
mariadb.org
xampp.org = Apache+MySQL+PHP

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

c:/xampp/mysql/bin/mysqld.exe
保證3306端口被打開

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

c:/xampp/mysql/bin/mysql.exe
作用相當于銀行的ATM終端客戶機

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

mysql.exe   -uroot   -p       不能加分號!
mysql   -uroot              不能加分號!

MySQL服務(wù)器常用的管理命令

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

常用的SQL命令

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

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

SQL語言的語法:        
(1)所有的SQL語句必須以;分號結(jié)尾。
(2)SQL語句不區(qū)分大小寫。習慣上,系統(tǒng)預定義的關(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)生的原因:計算機把每個字符都分配唯一個數(shù)字。若存字符時與取字符時所用的編碼方案不同,就會產(chǎn)生亂碼。

a <=> 97
   b <=> 98
....

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

解決亂碼問題的方法——保證“三處統(tǒng)一”:
(1).sql文件的存儲編碼
(2)mysql.exe連接mysqld.exe所用的編碼
(3)mysqld.exe中存儲數(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ù)值類型   —— 可用引號括起來也可以不用

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

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

DATE:日期類型,形如'2017-5-10'
TIME:時間類型,形如'22:08:5'   
DATETIME:日期/時間類型,形如'2017-10-25 22:8:5'

(3)字符串類型  —— 必須用引號括起來   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ī)范,如編號不能重復、年齡必須在一定范圍、密碼有長度限制、員工所在部門必須真的存在......類似的限制/規(guī)范就稱為“列約束”
 (1)主鍵約束 —— PRIMARY  KEY

 聲明為主鍵的列上,不能出現(xiàn)重復值,也不能出現(xiàn)NULL值,所有的記錄會自動按照主鍵列上值由小到大排序 —— 因此一個表中至多只能有一個主鍵列。

(2)非空約束 —— NOT NULL

聲明為非空的列,不能出現(xiàn)NULL,但可以出現(xiàn)重復值。

(3)唯一約束 —— UNIQUE

聲明為唯一約束的列,不能出現(xiàn)重復的值,但可以出現(xiàn)NULL,且允許多個NULL出現(xiàn)(兩個NULL值是不等的)

(4)檢查約束 —— CHECK

檢查約束可以檢查新插入的數(shù)據(jù)是否滿足指定的條件,如:
student( age INT CHECK(age>=18  AND  age<=60)  )
MySQL不支持此約束!

(5)默認值約束 —— DEFAULT

student(sid INT, sex CHAR(1) DEFAULT '男' );  
使用默認值的方式
1)INSERT INTO student VALUES(10, DEFAULT);
 2)INSERT INTO student(sid) VALUES(20);

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

   外鍵列上可以出現(xiàn)NULL,也可以有重復值,但是必須保證“
所有出現(xiàn)的值在另一個表的主鍵列上存在”——外鍵列上的值“參考了”另一個表上的主鍵值。

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

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

項目中如何存儲日期時間數(shù)據(jù)

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

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

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

SELECT ename, salary, eid  FROM emp;

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

SELECT ename, sex, birthday, ename FROM emp;

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

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

 SELECT  ename AS 姓名, deptId `部門 編號`  FROM emp;

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

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

SELECT  DISTINCT deptId 
FROM emp;

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

SELECT  DISTINCT  sex    FROM emp;

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

SELECT  2/3;

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

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.簡單查詢 —— 條件查詢
 示例:查詢出編號為5的員工所有信息

SELECT  *  FROM emp
WHERE  eid=5 ;

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

SELECT  *  FROM  emp
WHERE  ename  LIKE  '%E%';
#WHERE  ename='%E%'; #錯誤寫法!

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

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

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 ;

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

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

SELECT  COUNT(eid) AS 編號數(shù)量  FROM emp;  #15
SELECT  COUNT(deptId)  FROM emp;            #14
SELECT  COUNT(*)  FROM emp;                #15

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

SELECT  deptId, COUNT(*) FROM  emp
GROUP  BY  deptId;

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

復雜查詢 —— 子查詢

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

SELECT  did  FROM  dept 
WHERE  dname='研發(fā)部';

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

SELECT  *   FROM  emp
WHERE  deptId=10;

綜合兩條語句:

SELECT  *   FROM  emp
WHERE  deptId=( 
    SELECT  did  FROM  dept 
    WHERE  dname='研發(fā)部'
);   #父查詢中需要的條件數(shù)據(jù)由子查詢提供

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

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

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

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

SQL-99中的跨表查詢語法分為四種:
(1)內(nèi)連接查詢  INNER JOIN  查詢結(jié)果與SQL-92標準一樣!
    SELECT  ename,  dname
    FROM  emp   INNER JOIN  dept
    ON  deptId=did;  #兩個表的拼接條件用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

小知識: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);抓取一個索引數(shù)組或null
 $row=mysqli_fetch_assoc($result);抓取一個關(guān)聯(lián)數(shù)組或null
從其中獲取所有記錄行可以使用:
 $rowList=mysqli_fetch_all($result, MYSQLI_ASSOC);抓取一個二維數(shù)組,每一行呈現(xiàn)為一個關(guān)聯(lián)數(shù)組

感謝各位的閱讀!關(guān)于“MYSQL中基礎(chǔ)知識點有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI