- 數(shù)據(jù)庫簡介
- 關(guān)系型數(shù)據(jù)庫
- MySQL安裝和使用
- SQL語言
一、數(shù)據(jù)庫簡介
(一)數(shù)據(jù)庫的發(fā)展
- 文件系統(tǒng):磁盤文件存儲(chǔ)數(shù)據(jù)
- 第一代數(shù)據(jù)庫:網(wǎng)狀模型、層次模型
- 第二代數(shù)據(jù)庫:關(guān)系型數(shù)據(jù)庫、結(jié)構(gòu)化查詢語言
- 新一代數(shù)據(jù)庫:“對象—關(guān)系”型數(shù)據(jù)庫
(二)文件管理系統(tǒng)的缺點(diǎn)
- 編寫應(yīng)用程序不方便
- 數(shù)據(jù)冗余不可避免
- 應(yīng)用程序依賴性
- 不支持對文件的并發(fā)訪問
- 數(shù)據(jù)間聯(lián)系弱
- 難以按用戶視圖表示數(shù)據(jù)
- 無安全控制功能
(三)數(shù)據(jù)庫管理系統(tǒng)的優(yōu)點(diǎn)
- 相互關(guān)聯(lián)的數(shù)據(jù)的集合
- 較少的數(shù)據(jù)冗余
- 程序與數(shù)據(jù)相互獨(dú)立
- 保證數(shù)據(jù)的安全、可靠
- 最大限度地保證數(shù)據(jù)的正確性
- 數(shù)據(jù)可以并發(fā)使用并能同時(shí)保證一致性
(四)數(shù)據(jù)庫管理系統(tǒng)的基本概念
(一)術(shù)語定義
- 數(shù)據(jù)庫:數(shù)據(jù)的匯集,它以一定的組織形式存于存儲(chǔ)介質(zhì)上
- DBMS(數(shù)據(jù)庫管理系統(tǒng)):管理數(shù)據(jù)庫的系統(tǒng)軟件,它實(shí)現(xiàn)數(shù)據(jù)庫系統(tǒng)的各種功能,是數(shù)據(jù)庫系統(tǒng)的核心
- DBA(數(shù)據(jù)庫管理員):負(fù)責(zé)數(shù)據(jù)庫的規(guī)劃、設(shè)計(jì)、協(xié)調(diào)、維護(hù)和管理等工作
- 應(yīng)用程序:指以數(shù)據(jù)庫為基礎(chǔ)的應(yīng)用程序
(二)DBMS的基本功能
- 數(shù)據(jù)定義
- 數(shù)據(jù)處理:增、刪、改、查
- 數(shù)據(jù)安全
- 數(shù)據(jù)備份
(三)數(shù)據(jù)庫系統(tǒng)的架構(gòu)
- 單機(jī)架構(gòu)
- 大型主機(jī)/終端架構(gòu)
- 主從式架構(gòu)(C/S)
- 分布式架構(gòu)
二、關(guān)系型數(shù)據(jù)庫
(一)基本概念
- 關(guān)系:關(guān)系就是二維表,表中的行、列次序并不重要
- 行 (row):表中的每一行,又稱為一條記錄
- 列 (column):表中的每一列,又稱為屬性、字段
- 主鍵 (Primary key):用于惟一確定一個(gè)記錄的字段
- 域 (domain):屬性的取值范圍
(二)主流關(guān)系型數(shù)據(jù)庫
MySQL, MariaDB, PostgreSQL, Oracle, MSSQL, DB2
(三)事務(wù): transaction
- 定義:被視作整體對待的若干個(gè)操作
- 事務(wù)的特性:ACID
A:原子性,一個(gè)事務(wù)不可分割。
當(dāng)一個(gè)事務(wù)進(jìn)行過程中出現(xiàn)了中斷,下一次開始本事務(wù)時(shí)會(huì)執(zhí)行回滾(rollback)操作恢復(fù)至事務(wù)執(zhí)行前的狀態(tài);當(dāng)一個(gè)事務(wù)完成后,會(huì)執(zhí)行提交(commit)操作,此后無法再恢復(fù)至事務(wù)執(zhí)行前的狀態(tài)
C:一致性,數(shù)據(jù)保持一致
I:隔離性,使用鎖機(jī)制避免多用戶同時(shí)修改某數(shù)據(jù),可能出現(xiàn)死鎖
D:持久性,提交后的改變是不可撤銷的,而尚未提交的數(shù)據(jù)是臟數(shù)據(jù)
(四)實(shí)體—聯(lián)系模型(E-R模型)
-
實(shí)體(Entity):客觀存在并可以相互區(qū)分的客觀事物或抽象事件
- 在E-R圖中用矩形框表示實(shí)體,把實(shí)體名寫在框內(nèi)
- 屬性:實(shí)體所具有的特征或性質(zhì)
-
聯(lián)系(Relationship):數(shù)據(jù)之間的關(guān)聯(lián)集合,是客觀存在的應(yīng)用語義鏈
- 實(shí)體內(nèi)部的聯(lián)系:指組成實(shí)體的各屬性之間的聯(lián)系。
- 實(shí)體之間的聯(lián)系:指不同實(shí)體之間聯(lián)系。
- 實(shí)體之間的聯(lián)系用菱形框表示
-
實(shí)體之間聯(lián)系的類型:
- 一對一聯(lián)系 (1:1)
- 一對多聯(lián)系 (1:n)
- 多對多聯(lián)系 (m:n)
(五)數(shù)據(jù)的三要素
-
數(shù)據(jù)結(jié)構(gòu),包含兩類
- 與數(shù)據(jù)類型、內(nèi)容、性質(zhì)有關(guān)的對象
- 與數(shù)據(jù)之間聯(lián)系有關(guān)的對象
-
數(shù)據(jù)的操作
- 數(shù)據(jù)提取:在數(shù)據(jù)集合中提取感興趣的內(nèi)容(SELECT)
- 數(shù)據(jù)更新:變更數(shù)據(jù)庫中的數(shù)據(jù)(INSERT、DELETE、UPDATE)
-
數(shù)據(jù)的約束條件:是一組完整性規(guī)則的集合
- 實(shí)體(行)完整性 (Entity integrity)
- 域(列)完整性 (Domain Integrity)
- 參考完整性 (Referential Integrity)
(六)范式(NF)
定義:設(shè)計(jì)關(guān)系數(shù)據(jù)庫時(shí),為設(shè)計(jì)出合理的關(guān)系型數(shù)據(jù)庫而遵從的規(guī)范要求
各種范式呈遞次規(guī)范,越高的范式數(shù)據(jù)庫冗余越小目前有六種范式,設(shè)計(jì)關(guān)系型數(shù)據(jù)庫時(shí)一般需滿足至第三范式的要求
1NF:無重復(fù)的列,每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。除去同類型的字段,就是無重復(fù)的列
2NF:屬性完全依賴于主鍵,第二范式必須先滿足第一范式,要求表中的每個(gè)行必須可以被唯一地區(qū)分。通常為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)PK。非PK的字段需要與整個(gè)PK有直接相關(guān)性
3NF:屬性不依賴于其他非主屬性,滿足第三范式必須先滿足第二范式。第三范式要求一個(gè)數(shù)據(jù)庫表中不包含已在其它表中包含的非主關(guān)鍵字信息,非PK的字段間不能有從屬關(guān)系
有時(shí)出于性能或其他特殊需求的考慮,需要主動(dòng)違反范式
(七)SQL概念
(1)基本概念:
SQL(Structure Query Language):結(jié)構(gòu)化查詢語言
應(yīng)用編程接口
ODBC:Open Database Connectivity
JDBC:Java Data Base Connectivity索引:將表中的一個(gè)或多個(gè)字段中的數(shù)據(jù)復(fù)制一份另存,并且此些需要按特定次序排序存儲(chǔ)
關(guān)系運(yùn)算:
選擇:挑選出符合條件的行
投影:挑選出需要的字段
連接:表間字段的關(guān)聯(lián)
(2)約束
約束(constraint):表中的數(shù)據(jù)要遵守的限制
主鍵:一個(gè)或多個(gè)字段的組合(復(fù)合主鍵),填入的數(shù)據(jù)必須能在本表中唯一標(biāo)識(shí)本行;必須提供數(shù)據(jù),即NOT NULL,一個(gè)表只能存在一個(gè)
惟一鍵:一個(gè)或多個(gè)字段的組合,填入的數(shù)據(jù)必須能在本表中唯一標(biāo)識(shí)本行;允許為NULL,一個(gè)表可以存在多個(gè)
外鍵:一個(gè)表中的某字段可填入的數(shù)據(jù)取決于另一個(gè)表的主鍵或唯一鍵已有的數(shù)據(jù)
檢查:字段值在一定范圍內(nèi)
(3)數(shù)據(jù)模型
- 數(shù)據(jù)抽象
- 物理層:決定數(shù)據(jù)的存儲(chǔ)格式,即RDBMS在磁盤上如何組織文件
- 邏輯層:描述存儲(chǔ)什么數(shù)據(jù),以及數(shù)據(jù)間存在什么樣的關(guān)系
- 視圖層:描述DB中的部分?jǐn)?shù)據(jù),是虛擬的表
- 關(guān)系模型的分類
- 關(guān)系模型
- 基于對象的關(guān)系模型
- 半結(jié)構(gòu)化的關(guān)系模型:XML數(shù)據(jù)
三、MySQL安裝和使用
(一)MySQL和MariaDB
- MariaDB是MySQL的分支,軟件使用與MySQL相同
- yum安裝:CentOS 6 默認(rèn)安裝MySQL,CentOS 7默認(rèn)安裝MariaDB
(1)MariaDB的特性
- 單進(jìn)程,多線程
- 插件式存儲(chǔ)引擎:
- 存儲(chǔ)引擎有多種實(shí)現(xiàn)版本,功能和特性可能均略有差別,用戶可根據(jù)需要靈活選擇
- 主要存儲(chǔ)引擎:MyISAM和InnoDB,當(dāng)前絕大多數(shù)使用的是InnoDB(支持事務(wù)功能)
(2)MariaDB的程序組成:C/S架構(gòu)
Client:mysql, mysqldump, mysqladmin
Server:mysqld_safe, mysqld, mysqld_multi
(3)服務(wù)器監(jiān)聽的兩種socket地址
- ip socket:監(jiān)聽在tcp的3306端口,支持遠(yuǎn)程通信
- unix sock:監(jiān)聽在sock文件上(客戶機(jī)路徑:/tmp/mysql.sock, 服務(wù)器路徑:/var/lib/mysql/mysql.sock),僅支持本機(jī)通信
當(dāng)本機(jī)通信時(shí)(server: localhost, 127.0.0.1),自動(dòng)使用unix sock
(二)MariaDB安裝
(1)安裝方式
源代碼:編譯安裝
二進(jìn)制格式的程序包:展開至特定路徑,并經(jīng)過簡單配置后即可使用
程序包管理器管理的程序包
項(xiàng)目官方生成yum倉庫配置信息的地址:https://downloads.mariadb.org/mariadb/repositories/
(2)yum安裝和配置MariaDB
- 第1步,安裝和開啟服務(wù)
yum groupinstall mariadb mariadb-client
systemctl start mariadb
systemctl enable mariadb
-
第2步,提高安全性
- 安裝并啟動(dòng)服務(wù)后,發(fā)現(xiàn)輸入
mysql
命令后可以不需輸入密碼直接進(jìn)入系統(tǒng) - 執(zhí)行
select user();
命令,發(fā)現(xiàn)以root@localhost登錄
- 執(zhí)行
select user,host,password from mysql.user;
命令,發(fā)現(xiàn)當(dāng)前的所有用戶都沒有設(shè)置密碼,同時(shí)允許匿名登錄數(shù)據(jù)庫,存在很大安全隱患
-
執(zhí)行腳本
mysql_secure_installation
修改數(shù)據(jù)庫安全設(shè)置- 設(shè)置數(shù)據(jù)庫管理員root口令
- 禁止root遠(yuǎn)程登錄
- 刪除anonymous用戶帳號
- 刪除test數(shù)據(jù)庫
再次嘗試登錄時(shí),發(fā)現(xiàn)已經(jīng)無法匿名登錄了,執(zhí)行
mysql -u root -p
以root@localhost身份輸入爭取密碼后成功登錄
- 安裝并啟動(dòng)服務(wù)后,發(fā)現(xiàn)輸入
- 第3步,編輯配置文件
/etc/my.cnf
vim /etc/my.cnf
skip-networking=1 //[mysqld]下添加選項(xiàng),跳過反向解析過程加速啟動(dòng)
(3)通用二進(jìn)制格式安裝MariaDB
第1步,創(chuàng)建用戶并制定數(shù)據(jù)庫數(shù)據(jù)的存放目錄
useradd -r -m -d /app/dbdata -s /sbin/nologin mysql
第2步,準(zhǔn)備二進(jìn)制程序,要求必須解壓到/usr/local目錄下并命名為mysql
tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local
ln -sv mariadb-10.2.8-linux-x86_64/ mysql //創(chuàng)建軟鏈接便于切換版本
chown -R root:mysql /usr/local/mysql/
- 第3步,準(zhǔn)備配置文件
配置文件查找次序:后面覆蓋前面的配置文件
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
mkdir /etc/mysql/
cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf //復(fù)制模板文件
vim /etc/mysql/my.cnf //[mysqld]下添加三個(gè)選項(xiàng)
datadir = /app/dbdata //數(shù)據(jù)庫數(shù)據(jù)存放目錄
innodb_file_per_table= on //innodb引擎下創(chuàng)建的每個(gè)表都是一個(gè)文件
skip_name_resolve= on //禁止主機(jī)名解析
- 第4步,創(chuàng)建數(shù)據(jù)庫文件
cd /usr/local/mysql
./scripts/mysql_install_db --datadir=/app/dbdata --user=mysql
- 第5步,準(zhǔn)備日志文件
//CentOS 7下的操作
mkdir /var/log/mariadb
touch /var/log/mariadb/mariadb.log
setfacl -R -m u:mysql:rwx /var/log/mariadb/mariadb.log
//CentOS 6下的操作
touch /var/log/mysqld.log
setfacl -R -m u:mysql:rwx /var/log/mysqld.log
- 第6步,準(zhǔn)備服務(wù)腳本,并啟動(dòng)服務(wù)
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
- 第7步,創(chuàng)建環(huán)境變量
vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh
- 第8步,安全初始化
執(zhí)行腳本:mysql_secure_installation
(三)MariaDB的使用
(1)客戶端工具
mysql:命令行交互式客戶端工具
mysql選項(xiàng):
-u:用戶名,默認(rèn)為root
-h:服務(wù)器主機(jī),默認(rèn)為localhost
-p:建議使用用戶密碼,默認(rèn)為空密碼-
mysql用戶賬號由兩部分組成:
USERNAME@HOST
HOST用于限制此用戶可通過哪些遠(yuǎn)程主機(jī)連接mysql服務(wù)
支持使用通配符:- % 匹配任意長度的任意字符,如:
172.16.0.0/16
或172.16.%.%
- _ 匹配任意單個(gè)字符
- % 匹配任意長度的任意字符,如:
(2)常用命令
- 運(yùn)行
mysql
命令:默認(rèn)空密碼登錄
mysql>select user(); //查看當(dāng)前用戶
mysql>use mysql; //選擇進(jìn)入名為mysql的數(shù)據(jù)庫
mysql>SELECT user,host,password FROM user;
//從當(dāng)前數(shù)據(jù)庫名為user的表中查詢每行中user,host,password列的數(shù)據(jù)
安全初始化
/usr/local/mysql/bin/mysql_secure_installation
登錄系統(tǒng):
mysql -uroot -p
-u 指定用戶名 -p 指定輸入密碼(直接跟密碼時(shí)與p之間無空格)客戶端命令:本地執(zhí)行
mysql> help
:查詢mysql客戶端命令
每個(gè)命令都完整形式和簡寫格式
mysql> status 或\s
服務(wù)端命令:通過mysql協(xié)議發(fā)往服務(wù)器執(zhí)行并取回結(jié)果
每個(gè)命令都必須有結(jié)束符號,默認(rèn)為分號
select version();
四、SQL語言
(一)SQL語言簡介
(1)SQL語句構(gòu)成
由關(guān)鍵詞(Keyword)組成子句(Clause),多條子句組成一條語句
SELECT * //SELECT子句,SELECT為關(guān)鍵詞
FROM products //FROM子句,F(xiàn)ROM為關(guān)鍵詞
WHERE price>400 //WHERE子句,WHERE為關(guān)鍵詞
(2)SQL語句分類
- DDL: Data Defination Language 數(shù)據(jù)定義語言
CREATE, DROP, ALTER - DML: Data Manipulation Language 數(shù)據(jù)操作語言
INSERT, DELETE, UPDATE - DCL:Data Control Language 數(shù)據(jù)控制語言
GRANT, REVOKE - DQL:Data Query Language 數(shù)據(jù)查詢語言
SELECT
(3)SQL語言規(guī)范
- 大小寫:
- 關(guān)鍵詞不區(qū)分大小寫(建議用大寫)
- 但字符串常量區(qū)分大小寫
- 跨行:
- 可單行或多行書寫,每條語句以";"結(jié)尾
- 關(guān)鍵詞不能跨多行或簡寫
- 用空格和縮進(jìn)來提高語句的可讀性
- 子句通常位于獨(dú)立行,便于編輯,提高可讀性
- 注釋:
- SQL標(biāo)準(zhǔn):
/*注釋內(nèi)容*/
多行注釋
-- 注釋內(nèi)容
單行注釋,注意有空格 - MySQL注釋:
#注釋內(nèi)容
- SQL標(biāo)準(zhǔn):
(4)數(shù)據(jù)庫對象的命名規(guī)則
- 必須以字母開頭
- 可包括數(shù)字和三個(gè)特殊字符(# _ $,不建議使用)
- 不要使用MySQL的保留字
- 同一個(gè)表下的對象不能同名
(5)數(shù)據(jù)庫操作
創(chuàng)建數(shù)據(jù)庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
刪除數(shù)據(jù)庫:
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
查看支持所有字符集:
SHOW CHARACTER SET;
查看支持所有排序規(guī)則:
SHOW COLLATION;
獲取命令使用幫助:
HELP KEYWORD;
查看數(shù)據(jù)庫列表:
SHOW DATABASES;
(二)SQL語言應(yīng)用
(1)創(chuàng)建、刪除表操作
-
語法:
- 創(chuàng)建表:
CREATE TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1 修飾符, col2 type2 修飾符, ...)
- 刪除表:
DROP TABLE [IF EXISTS] tbl_name;
- 創(chuàng)建表:
-
修飾符
- NULL:數(shù)據(jù)列可包含NULL值
- NOT NULL:數(shù)據(jù)列不允許包含NULL值
- DEFAULT:默認(rèn)值
- PRIMARY KEY:主鍵
- UNIQUE KEY:唯一鍵
- CHARACTER SET name:指定一個(gè)字符集
- AUTO_INCREMENT:自動(dòng)遞增,適用于整數(shù)類型
- UNSIGNED:無符號,適用于數(shù)值類型
-
其他與表相關(guān)的操作
- 查看所有的引擎:
SHOW ENGINES;
- 查看表:
SHOW TABLES [FROM db_name];
- 查看表結(jié)構(gòu):
DESC [db_name.]tbl_name;
- 查看表創(chuàng)建命令:
SHOW CREATE TABLE tbl_name;
- 查看表狀態(tài):
SHOW TABLE STATUS LIKE 'tbl_name'\G
\G豎直顯示
- 查看所有的引擎:
(2)數(shù)據(jù)類型
-
mysql支持的數(shù)據(jù)類型:
- 數(shù)值類型
- 日期/時(shí)間類型
- 字符串(字符)類型
-
選擇正確的數(shù)據(jù)類型對于獲得高性能至關(guān)重要,三大原則:
- 更小的通常更好,盡量使用可正確存儲(chǔ)數(shù)據(jù)的最小數(shù)據(jù)類型
- 簡單就好,簡單數(shù)據(jù)類型的操作通常需要更少的CPU周期
- 盡量避免NULL,包含為NULL的列,對MySQL更難優(yōu)化
-
整型
- tinyint(m):1個(gè)字節(jié)范圍
- smallint(m):2個(gè)字節(jié)范圍
- mediumint(m):3個(gè)字節(jié)范圍
- int(m):4個(gè)字節(jié)范圍
- bigint(m):8個(gè)字節(jié)范圍
- 加unsigned后綴代表正整數(shù),取值范圍:0至原范圍最大值*2
- m指select查詢結(jié)果顯示寬度,不影響實(shí)際取值
-
浮點(diǎn)型,近似值
- float(m,d):單精度浮點(diǎn)型8位精度(4字節(jié)) m:總位數(shù),d:小數(shù)位位數(shù)
- double(m,d):雙精度浮點(diǎn)型16位精度(8字節(jié)) m:總位數(shù),d:小數(shù)位位數(shù)
-
定點(diǎn)型,精確值
- decimal(m,d):m為總位數(shù),d為小數(shù)位位數(shù)
- 占用空間大、計(jì)算消耗大,盡量只在精確計(jì)算時(shí)使用
-
字符串型
- char(n)固定長度,最多255個(gè)字符
- varchar(n)可變長度,最多65535個(gè)字符
- tinytext可變長度,最多255個(gè)字符
- text可變長度,最多65535個(gè)字符
- mediumtext 可變長度,最多2的24次方-1個(gè)字符
- longtext可變長度,最多2的32次方-1個(gè)字符
- BINARY(M) 固定長度,可存二進(jìn)制或字符,允許長度為0-M字節(jié),
- VARBINARY(M) 可變長度,可存二進(jìn)制或字符,允許長度為0-M字節(jié)
- 內(nèi)建類型:ENUM枚舉, SET集合
-
二進(jìn)制數(shù)據(jù):BLOB
- BLOB和text存儲(chǔ)方式不同,TEXT以文本方式存儲(chǔ),英文存儲(chǔ)區(qū)分大小寫,而Blob是以二進(jìn)制方式存儲(chǔ),不分大小寫
- BLOB存儲(chǔ)的數(shù)據(jù)只能整體讀出
- TEXT可以指定字符集,BLOB不用指定字符集
-
日期時(shí)間類型
- date:日期'2008-12-2'
- time:時(shí)間'12:25:36'
- datetime:日期時(shí)間'2008-12-2 22:06:44'
- timestamp:自動(dòng)存儲(chǔ)記錄修改時(shí)間
字段里的時(shí)間數(shù)據(jù)會(huì)隨其他字段修改的時(shí)候自動(dòng)刷新,這個(gè)數(shù)據(jù)類型的字段可以存放這條記錄最后被修改的時(shí)間 - YEAR(2), YEAR(4):年份
實(shí)驗(yàn)1:創(chuàng)建數(shù)據(jù)庫hellodb并按下表設(shè)置建立第一個(gè)表student
列名 | id | name | age | gender |
---|---|---|---|---|
含義 | 學(xué)號 | 姓名 | 年齡 | 性別 |
類型 | 數(shù)值 | 字符串 | 數(shù)值 | 字符串 |
范圍 | 0-200 | 不超過20個(gè)字符 | 0-100 | 1個(gè)字符 |
其他 | 主鍵 | 不允許為空 | 無 | 默認(rèn)為"m" |
create database hellodb;
use hellodb;
create table student (id tinyint unsigned primary key, name varchar(20) not null, age tinyint unsigned, gender char(1) default "m");
desc student;
- 實(shí)驗(yàn)2:在hellodb數(shù)據(jù)庫中創(chuàng)建表student1,字段設(shè)置與實(shí)驗(yàn)1基本相同,唯一的區(qū)別是:id和name構(gòu)成復(fù)合主鍵
use hellodb;
create table student1 (id tinyint unsigned, name varchar(20) not null, age tinyint unsigned, gender char(1) default "m", primary key(id, name));
desc student1;
(3)修改表操作
- 語法:
ALTER TABLE 'tbl_name'
ADD col_name data_type [FIRST|AFTER col_name] //添加字段
CHANGE COLUMN old_col_name new_col_name data_type //修改字段名
MODIFY col_name data_type //修改字段屬性
DROP COLUMN col_name //刪除字段
-
實(shí)驗(yàn)3:對數(shù)據(jù)庫hellodb的表student一次做如下操作:
- 在name字段后增加字段phone,類型為varchar(11)
alter table student add phone varchar(11) after name;
- 修改phone字段的屬性為int
alter table student modify phone int;
- 將name字段定義為唯一鍵
alter table student add unique key(name);
- 建立age字段的索引
alter table student add index(age);
show indexes from student;
查看表student建立索引的字段
主鍵和唯一鍵都會(huì)自動(dòng)建立索引,name字段的索引也可以看到
- 刪除phone字段
alter table student drop phone;
- 在name字段后增加字段phone,類型為varchar(11)
(4)索引
-
索引是特殊數(shù)據(jù)結(jié)構(gòu),定義查找時(shí)作為查找條件的字段
- 優(yōu)點(diǎn):提高查詢速度
- 缺點(diǎn):占用額外空間,影響插入速度
創(chuàng)建索引:必須要有索引名稱
CREATE INDEX index_name ON tbl_name(index_col_name,...);
刪除索引:
DROP INDEX index_name ON tbl_name;
查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
-
實(shí)驗(yàn)4:索引的添加、查看、刪除
- 添加表studen字段gender的索引
create index genderindex on student(gender);
- 查看表student的索引(豎列顯示)
show indexes from student\G;
- 刪除表student字段gender的索引
drop index genderindex on student;
- 添加表studen字段gender的索引
(5)DML語句:INSERT, UPDATE, DELETE
INSERT:插入行
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
UPDATE:更新行
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause];
DELETE:刪除行
DELETE FROM tbl_name [WHERE clause];
TRUNCATE TABLE tbl_name
:清空表-
實(shí)驗(yàn)5:SQL的DML語句應(yīng)用
- 測試1:按照下表的內(nèi)容,對表student進(jìn)行賦值
id name age gender 1 zhao 25 m 2 qian 18 f 3 sun 30 m 4 li 27 m 5 zhou 22 f insert into student (id, name, age, gender) values (1, 'zhao', 25, 'm'); //完整寫法 insert into student (name, id, gender, age) values ('qian', 2, 'f', 18); //注意順序 insert into student values (3, 'sun', 30, 'm'); //可以省略字段描述,但賦值按照字段默認(rèn)順序 insert into student values (4, 'li', 27, 'm'), (5, 'zhou', 22, 'f'); //可以一次賦多個(gè)值
-
測試2:復(fù)制student表并命名為表student2,清空表中的內(nèi)容
create table student2 select * from student
當(dāng)空表的字段設(shè)置與原表完全相同時(shí),可以使用insert語句復(fù)制表內(nèi)容:
insert into student2 select * from student;
truncate table student2
truncate語句的效率比delete高,但是由于truncate不記錄日志,刪除后的信息無法恢復(fù) 測試3:修改、刪除表記錄
將zhao的年齡改為24
update student set age=24 where id=1
將li的年齡改為29,性別改為f
update student set age=29, gender='f' where name='li'
刪除name為li的記錄
delete from student where name='li';
(6)DQL語句:SELECT
語法:
SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
Limit m,n:跳過m個(gè),要n個(gè)字段表示法:
*:所有字段
AS:字段別名,col1 AS alias1-
WHERE 子句:條件描述方式
- 操作符:
- 關(guān)系:
>, <, >=, <=, ==, !=
- 范圍:
BETWEEN ... AND ...
- 模糊匹配 LIKE
%:任意長度的任意字符
_:任意單個(gè)字符 - 正則表達(dá)式模式匹配:
RLIKE
- 空,非空判斷:
IS NULL ,IS NOT NULL
- 枚舉:
IN (val1,val2,…)
- 關(guān)系:
- 條件邏輯操作:
and,or,not
- 操作符:
-
實(shí)驗(yàn)6:SELECT語句的使用
當(dāng)前表student內(nèi)容如下:id name age gender 1 zhao 25 m 2 qian 18 f 3 sun 30 m 4 li 27 m 5 zhou 22 f 6 wu 17 m 7 zheng 29 NULL 8 wang 33 NULL 查詢本表信息,依次實(shí)現(xiàn)以下功能:
- 查詢本表中字段id, name,age的信息,顯示時(shí)id字段顯示“編號”,name字段顯示“姓名”,age字段顯示“年齡”
select id as 編號, name as 姓名, age as 年齡 from student;
- 查詢本表中年齡大于等于20并且小于等于30的記錄
select * from student where age >= 20 and age <= 30;
或者
select * from student where age between 20 and 30;
- 查詢本表中姓名以'z'開頭的記錄,輸出時(shí)以年齡升序排序
select * from student where name like 'z%' order by age;
- 查詢本表中姓名不以'w'開頭,并且不以'n'結(jié)尾的記錄
select * from student where name rlike '^[^w].*[^n]$';
- 查詢本表中性別信息為空的記錄,輸出時(shí)以編號降序排序
select * from student where gender is null order by id desc;
- 查詢本表中姓名為"qian", "li", "zhou"的記錄
select * from student where name in ('qian', 'li', 'zhou');
- 查詢本表中字段id, name,age的信息,顯示時(shí)id字段顯示“編號”,name字段顯示“姓名”,age字段顯示“年齡”
(7)用戶賬號管理
格式:
'user'@'host'
user:用戶名
host:允許用戶通過哪些主機(jī)遠(yuǎn)程連接mysqld服務(wù),包含:
IP、網(wǎng)絡(luò)地址、主機(jī)名、通配符(%和_)創(chuàng)建用戶:
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
查看當(dāng)前用戶:
SELECT user();
查看用戶:
SELECT user,host,password FROM user;
刪除用戶:
DROP USER 'username'@'host';
-
更改口令:
- 方法一:
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
- 方法二:
mysqladmin -u root -pold_password password 'new_password'’
- 方法一:
(8)授權(quán)
-
給用戶授權(quán):
GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'];
- priv_type:ALL [INSERT, UPDATE, DELETE, SELECT...]
- db_name.tb_name:
*.*
:所有庫的所有表
db_name.*
:指定庫的所有表
db_name.tb_name
:指定庫的指定表
db_name.routine_name
:指定庫的存儲(chǔ)過程和函數(shù)
查看指定用戶獲得的授權(quán):
SHOW GRANTS FOR 'user'@'host';
回收授權(quán):
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host
FLUSH PRIVILEGES
:手動(dòng)讓MariaDB的服務(wù)進(jìn)程重讀授權(quán)表-
實(shí)驗(yàn)7:用戶賬號管理、授權(quán)管理
創(chuàng)建賬號
hellopeiyang@192.168.136.130
并授權(quán)其可以查詢和添加hellodb數(shù)據(jù)庫中的所有表,密碼為'hello'
grant select, insert on hellodb.* to hellopeiyang@192.168.136.130 identified by 'hello';
查看賬號
hellopeiyang@192.168.136.130
獲得的授權(quán)
show grants for hellopeiyang@192.168.136.130
;回收賬號
hellopeiyang@192.168.136.130
在hellodb數(shù)據(jù)庫的所有表的全部授權(quán)
revoke all on hellodb.* from hellopeiyang@192.168.136.130;
刪除賬號
hellopeiyang@192.168.136.130
drop user hellopeiyang@192.168.136.130;