基本概念: 資料庫DB(database): + 數據的倉庫,數據的集合,是數據的一種結構化的存儲 資料庫管理系統DBMS(database management system): + 管理資料庫的一套軟體 + 比如Oracle、MySQL、SQL server、DB2 + 介於應用程式和操作系統之 ...
基本概念:
- 資料庫DB(database):
- 數據的倉庫,數據的集合,是數據的一種結構化的存儲
- 資料庫管理系統DBMS(database management system):
- 管理資料庫的一套軟體
- 比如Oracle、MySQL、SQL server、DB2
- 介於應用程式和操作系統之間
- 資料庫應用程式:
- 使用資料庫應用程式與DBMS進行通信,訪問和管理資料庫中的數據
- 資料庫伺服器:
- 電腦+資料庫管理系統
- 一個資料庫伺服器可以管理多個資料庫,一個資料庫下包含多個表
- SQL語言
- 全稱:Structured Query Language,結構化查詢語言
- 由IBM在70年代開發出來,80年代被確定為關係型資料庫語言的標準
- 主要包含,對數據的定義、操作、查詢、控制,四大類操作
- 常見的資料庫產品
- Oracle公司的Oracle
- 微軟公司的SQL Server
- IBM公司的DB2
- 10gen公司的MongoDB:
- Oracle公司的MySQL,早期為瑞典的MySQL AB公司開發
- 資料庫引擎:
- 用於存儲、處理、保護數據的核心服務
- 參見:mysql 資料庫引擎
- MySQL主要有MyISAM和InnoDB兩種:參見:MySQL存儲引擎MyISAM與InnoDB的主要區別對比
SQL語言
- 數據定義語言:DDL(Data Definition Language)
- 主要進行對資料庫、表的定義,比如CREATE、ALTE、RDROP等操作
- 數據操作語言:DML(Data Manipulation Language)
- 向資料庫中添加、刪除、修改數據,比如INSERT、UPDATE、DELETE等操作
- 數據查詢語言:DQL(Data Query Language)
- 從資料庫中查詢數據,主要是SELECT操作
- 用得最多的操作
- 數據控制語言:DCL(Data Control Language)
- 用於控制用戶對資料庫的訪問許可權,比如GRANT、REVOKE、COMMIT、ROLLBACK等操作
- 有一個標準的SQL語言(當前最新版本是SQL:2016),在各家DBMS上通用,但各個DBMS又對標準的SQL進行了擴展,學習的時候要註意
MySQL安裝、初步使用的註意事項
- 版本的下載:
- 下載地址:Download MySQL Community Server:http://dev.mysql.com/downloads/mysql/
- 有msi(只有個32位的,64位的機子也裝這個)和Zip(32位和64位)兩種,都是可以的
- 下載的時候,註意左下角『No thanks, just start my download.』不用註冊登錄也能下載
- 安裝方式:
- 典型安裝Typical:只包含伺服器、命令行客戶端、命令行使用程式
- 定製安裝Custom:
- 完全安裝Complete:各種組件全部安裝
- 配置:
- 包括詳細配置和標準配置
- 詳細配置:
- 伺服器類型:會影響到對記憶體、磁碟、過程等的決策
- 開發者類型:適用於開發者,記憶體占用少
- 伺服器類型:專門用提供服務
- 專用MySQL伺服器:該機器專門用來作為MySQL的伺服器,資源開銷最大
- 資料庫用途:
- 多功能資料庫:同時使用InnoDB和MyISAM引擎
- 事務處理資料庫:同時使用InnoDB和MyISAM引擎,但InnoDB能分配到更多的資源
- 非事務處理資料庫:只是用MyISAM引擎
- 最大併發連接數
- 決策支持(Decision Support):不需要大量的併發連接
- 聯機事務處理(Online Transaction Processing):需要大量的併發連接,最大500
- 人工設置(Manual Setting):預設連接數15
- 預設埠3306
- 字元集:
- 標準字元集(Standard Character Set):支持西歐語言
- 支持多語言(Best Support For Multilingualism):UTF-8字元集
- 人工選擇(Manual Selected Default Character Set/Collection):自己選擇,GBK;GB2312;UTF-8
- 配置文件:
- my.ini:正在使用的配置文件,一定會被讀取
- 其他:my-huge/large/medium/small/template/innodb-heavy-4G.ini等可能會被讀取到
- 缺少根元素
- 刪除:C:\Users\用戶名\AppData\Roaming\Oracle\MySQL Notifier下的配置文件
資料庫的基本操作
# 命令行下登錄到資料庫:開始菜單中找到“MySQL 5.7 Command Line Client” 打開
# 輸入root用戶的密碼,即可登錄
# 在MySQL workbench中操作更加方便
# MySQL Workbench中建立連接,輸入connection name; connection method; hostname port; username password等,下次直接點擊這個連接就能連上資料庫
# 在建立好的連接上面點擊右鍵,“Copy JDBC Connection String to Clipboard”,可以用在將來的jdbc編程中
# 點擊該連接,連接上資料庫
SHOW DATABSASES; # 查看有哪些資料庫。系統預設有information_scheme;mysql;performance_scheme;sys四個;另有sakila和world兩個示例庫
CREATE DATABASE newDB; # 創建一個資料庫,名叫newDB
SHOW CREATE DATABASE newDB; # 查看資料庫newDB的信息,可以看到是Character Set UTF-8
ALTER DATABASE newDB DEFAULT CHARACTER SET gbk COLLATE gbk_bin; # 將newDB的預設字元集改為gbk
DROP DATABASE newDB; # 刪除newDB這個資料庫
MySQL的數據類型
- 整數類型:
- TINYINT:1個位元組;0~28-1;-27~27-1;
- SMALLINT:2個位元組;0~216-1;-215~215-1;
- MEDIUMINT:3個位元組;0~224-1;-223~223-1;
- INT:4個位元組;0~232-1;-231~231-1;
- BIGINT:8個位元組;0~264-1;-263~263-1;
- 浮點數與定點數
- FLOAT:4個位元組;
- DOUBLE:8個子ie;
- DECIMAL(M,D);M+2個位元組;M表示總長度,D表示小數點後的長度
- 日期與時間
- YEAR:
- 1個位元組;1901~2155;YYYY;0000
- 四位字元串或數字:'2016'和2016皆可;
- 兩位字元串:'16'表示2016;'69'表示2069;'70'表示1970;'99'表示1999;'00'表示2000
- 兩位數字:1表示2001;69表示2069;70表示1970;99表示1999;0表示0000
- DATE:
- 4個位元組;1000-01-01~9999-12-03;YYYY-MM-DD;0000-00-00
- 完整字元串'2016-12-16'和'20161216'都表示2016年12月16日
- 年簡寫字元串:'16-12-16'和'161216'都表示2016年12月16日
- 年簡寫數字:161216和12-12-16,都表示2016年12月16日
- 函數與常量:NOW()和CURRENT_DATE都表示當前系統日期
- TIME:
- 3個位元組;-838:59:59~838:59:59;HH:MM:SS;00-00-00
- 'D HH:MM:SS':D表示天數,可以是[0,34];比如'3 12:24:36'表示84:24:36
- 'HHMMSS'或者HHMMSS:295416表示29:54:16
- 常量與函數:CURRENT_TIME和NOW()表示當前系統時間
- DATETIME:8個位元組;1000-01-01 00:00:00~9999-12-31 23:59:59;YYYY-MM-DD HH:MM:SS;0~0
- TIMESTAMP:
- 4個位元組;1970-01-01 00:00:01~2038-01-19 03:14:07;YYYY-MM-DD HH:MM:SS;0~0
- 與DATETIME相同,只是取值範圍更小
- CURRENT_TIMESTAMP和NULL和無輸入,都表示當前系統時間
- 如果插入的數據非法,那麼會把零值插入
- YEAR:
- 字元串與二進位
- CHAR:
- 固定長度字元串:CHAR(4)表示最大可存儲4個位元組,並且始終占用4個位元組
- VARCHAR
- 可變長度字元串:VARCHAR(4)表示最大可存儲4個位元組,實際占用實際的位元組數+1,實際最大可占用5個位元組
- BINARY
- 固定長度二進位數據;實際長度不足時,用\0補齊
- VARBINARY
- 可變長度二進位數據;
- BLOB
- 數據量很大的二進位數據,大小與下麵的TEXT相同
- 按照二進位編碼進行比較和排序;
- TINYBLOB:
- BLOB:
- MEDIUMBLOB:
- LONGBLOB:
- TEXT
- 表示大文本數據,如文章評論和內容等
- 按照文本模式進行比較和排序
- TINYTEXT:[0,255]個位元組;0.25K
- TEXT:[0,65535]個位元組;64K
- MEDIUMTEXT:[0,16777215]個位元組;16M
- LONGTEXT:[0,4294967295]個位元組;4096M
- ENUM
- 枚舉類型;定義一個枚舉類型:ENUM('枚舉值1','枚舉值2','枚舉值3','枚舉值4','枚舉值5')
- 存入資料庫的實際是這個枚舉值的編號,而不是值本身
- SET
- 與ENUM類似,表示的是字元串對象;SET('值1','值2','值3','值4','值5')
- 存入資料庫的也是其編號,而不是字元串本身
- BIT
- 表示二進位數據;定義BIT(M),M表示值的位數,[1,64]
- 如果長度小於M,那麼左邊用0補齊
- CHAR:
約束
- 約束:約束就是一個條件,表示被約束的數據應當滿足約束條件
- 為什麼有約束:因為為了後續的各種計算和操作,資料庫中的數據不能是雜亂無章的,要符合一定的規則
- 常見約束:
- 主鍵約束:PRIMARY KEY
- 外鍵約束:FOREIGN KEY
- 非空約束:NOT NULL
- 唯一性約束:UNIQUE
- 預設值約束:DEFAULT
- 主鍵約束PRIMARY KEY
- 用主鍵約束的列的數據可以唯一的表示這一條記錄(這一行數據)
- 主鍵約束的數據不能重覆,不能為空,每張表只能有一個主鍵約束
- 是否可重用,得看具體的資料庫
- 單欄位主鍵:
- 主鍵約束在一個欄位上,這個欄位的值唯一標識一條記錄
- 多欄位主鍵:
- 主鍵約束在多個欄位上,這幾個字的的值拼接起來唯一標識一條記錄
- 外鍵約束FOREIGN KEY
- 非空約束
- 非空約束的欄位的值不能為空,必須填寫
- 唯一約束UNIQUE
- 唯一約束的字讀的值不能重覆
- 預設約束DEFAULT
- 預設約束的欄位,如果沒有插入數據,那麼會自動插入預設值
表的基本操作
USE newDB; # 進入newDB資料庫,後續的操作都在這個資料庫中
CREATE TABLE teacher( # 創建一個名為teacher的表
tea_id TINYINT PRIMARY KEY, # 教師編碼,主鍵約束,唯一且非空
tea_ID_num CHAR(18), # 身份證號
tea_name VARCHAR(10), # 姓名
tea_gender ENUM('男','女'), # 性別
tea_birth DATE # 出生日期
);
SHOW TABLES; # 查看這個資料庫下的表
SHOW CREATE TABLE teacher; # 查看teacher這個表
DESCRIBE teacher; # 查看teacher這個表的欄位信息
DESC teacher; # DESCRIBE的簡寫
ALTER TABLE teacher RENAME TO tea; # 修改表名:teacher--->tea
DESC tea;
ALTER TABLE tea CHANGE tea_gender tea_sex ENUM('男','女'); # 修改欄位名:tea_gender--->tea_sex,數據類型為ENUM('男','女'),註意數據類型不可省略,即使一樣也不可省略
ALTER TABLE tea MODIFY tea_sex ENUM('男','女','其他'); # 修改數據類型:tea_sex的新數據類型為ENUM('男','女','其他')
ALTER TABLE tea DROP tea_birth; # 刪除欄位:刪除tea_birth欄位
ALTER TABLE tea ADD tea_birth DATE NOT NULL FIRST; # 添加欄位:添加tea_birth欄位,非空,位置為first,就是第一個欄位,(也可以是是AFTER 欄位名),
ALTER TABLE tea MODIFY tea_birth DATE AFTER tea_sex; # 修改欄位位置:修改tea表下的tea_birth欄位的位置為tea_sex之後
DROP TABLE tea; # 刪除數據表。特別小心,表跟表之間往往存在關聯
CREATE TABLE teacher( # 新建一張表
tea_id TINYINT PRIMARY KEY AUTO_INCREMENT, # tea_id欄位為主鍵,且自增(AUTO_INCREMENT,適合於任何整數類型),即每添加一條記錄,這個欄位的值就增加1
tea_ID_num CHAR(18),
tea_name VARCHAR(10),
tea_gender ENUM('男','女','其他'),
tea_birth DATE
);
CREATE TABLE teacher(
tea_id TINYINT,
tea_ID_num CHAR(18),
tea_name VARCHAR(10),
tea_gender ENUM('男','女','其他'),
tea_birth DATE,
PRIMARY KEY(tea_id,tea_ID_num) # 設置多欄位主鍵
);
添加、更新、刪除數據
CREATE TABLE teacher( # 創建個teacher表
tea_id TINYINT,
tea_ID_num CHAR(18),
tea_name VARCHAR(10),
tea_gender ENUM('男','女','其他'),
tea_birth DATE,
PRIMARY KEY(tea_id) # tea_id為主鍵
);
INSERT INTO teacher(tea_id,tea_ID_num,tea_birth,tea_name,tea_gender)
values(1,'102315198102215425','1981-02-21','王洪','女'); # 添加一條記錄,值的順序跟欄位名的順序匹配,欄位名的順序跟表裡面的欄位順序無關
INSERT INTO teacher VALUES(2,'102315198503136216','李剛','男','1985-03-13'); # 添加一條記錄:省略欄位名,值的順序跟表中欄位的順序一致
INSERT INTO teacher(tea_id,tea_name,tea_gender)
VALUES (3,'張華','男'); # 添加一條記錄,只給部分欄位添加,被忽略的欄位,不能有非空約束或者得有預設值
INSERT INTO teacher VALUES(4,'102315197601213162','王和','女','1976-01-21'),
(5,'102315198205168435','阿Q','男','1982-05-16');
# 一次添加兩條記錄,省略了欄位名
INSERT INTO teacher
SET tea_id=6, # 欄位=值的形式
tea_name='李飛',
tea_gender='男';
SELECT * FROM teacher; # 查詢teacher中的所有的記錄
UPDATE teacher # 更新一條信息
SET tea_ID_num='102315197001207511',tea_birth='19700120'
WHERE tea_id=3; # 特別註意,不能少了WHREE字句
UPDATE teacher
SET tea_gender=null # 刪除一條記錄某個欄位的值,可將其UPDATE為null
WHERE tea_id=1;
DELETE FROM teacher WHERE tea_id=1; # 刪除符合特定條件的記錄:使用DELETE的時候,對條件的限定千萬不能少,否則可能會刪除整張表的記錄
UPDATE teacher
SET tea_gender='其他'; # 沒有限定條件,會導致tea_teacher的值全部改為'其他'
DELETE FROM teacher; # 刪除teacher表的所有記錄
TRUNCATE TABLE teacher; # 清空teacher表
DELETE與TRUNCATE的區別
- 二者都能將整個表的數據全部刪除
- DELETE是DML語句;TRUNCATE是DDL語句
- DELETE後面一般要跟WHERE字句來限定要刪除的記錄,TRUNCATE則不能跟WHERE字句,而是刪除整張表的記錄
- 對於有AUTO_INCREMENT約束的欄位,DELETE後,從原來的記錄的值開始自增;TRUNCATE則重新從1開始
簡易的單表查詢
SELECT tea_name,tea_gender FROM teacher; # 查詢2個欄位
SELECT tea_id,
tea_ID_num,
tea_birth,
tea_name,
tea_gender FROM teacher; # 查詢5個欄位,結果按照這個順序排列
SELECT * FROM teacher; # 用通配符查詢所有欄位。註意效率較低
SELECT * FROM teacher WHERE tea_id>3; # 單條件查詢所有欄位
SELECT * FROM teacher WHERE tea_id BETWEEN 2 AND 6; # BETWEEN X AND Y。[X,Y]且X<Y
SELECT * FROM teacher WHERE tea_id NOT BETWEEN 2 AND 5; # 對BETWEEN AND 取反
SELECT * FROM teacher WHERE tea_id IN (1,3,4); # IN查詢,相等匹配多個值
SELECT * FROM teacher WHERE tea_id_num IS NULL; # 匹配NULL
SELECT * FROM teacher WHERE tea_id_num IS NOT NULL; # 匹配NOT NULL
SELECT DISTINCT tea_gender FROM teacher; # 查詢結果去重
SELECT DISTINCT tea_name,tea_gender FROM teacher; # DISTINCT可用於多個欄位
SELECT * FROM teacher WHERE tea_name LIKE '王_'; # LIKE模煳匹配,下劃線匹配單個字元,不包括空字元串,用\轉義
SELECT * FROM teacher WHERE tea_ID_num LIKE '102315197%'; # %匹配若幹個字元,包括空字元串,用\轉義
SELECT * FROM teacher WHERE tea_id>2 AND tea_id<6; # AND連接多個條件,交集
SELECT * FROM teacher WHERE tea_id>3 OR tea_birth>'1982-01-01'; # OR連接兩個條件,並集
SELECT * FROM teacher WHERE tea_name LIKE '李_' AND tea_gender='男';
SELECT * FROM teacher WHERE
tea_id<5 AND
tea_name LIKE '王_' AND
tea_birth>'1980-01-01'; # AND連接3個條件
SELECT * FROM teacher WHERE
tea_name LIKE '李_' AND tea_birth>'1980-01-01' # AND 與 OR聯用,AND優先順序高於OR
OR
tea_name LIKE '王_' AND tea_birth<'1980-01-01';