Mysql 01 使用CMD連接資料庫 -- 在控制台連接資料庫(需將位置切換到mysql所在地址) mysql -u root -p password:12345 -- 修改mysql賬戶密碼及許可權,安裝配置完後慎用 update mysql.user set authentication_str ...
Mysql
01 使用CMD連接資料庫
-- 在控制台連接資料庫(需將位置切換到mysql所在地址)
mysql -u root -p
password:12345
-- 修改mysql賬戶密碼及許可權,安裝配置完後慎用
update mysql.user set authentication_string = password('12345') where user = 'root' and Host = 'localhost';-- 修改用戶密碼
flush privileges; -- 刷新許可權
--------------------------------------------------
-- 所有語句需要使用;作為結尾
show databases; -- 查看所有資料庫
use test01; -- 切換資料庫 use+資料庫名
show tables; --查看資料庫中所有的表
describe `user`; --顯示某張表的信息
create database test01; -- 創建一個資料庫
exit; -- 退出連接
-- 單行註釋
-- 下麵是多行註釋
/*
hello
*/
- 資料庫xxx語言 CRUD 增刪改查
- DDL 定義
- DML 操作
- DQL 查詢
- DCL 控制
02 操作資料庫
操作資料庫>操作資料庫中的表>操作資料庫中表的數據
mysql關鍵字不區分大小寫!!
2.1 操作資料庫
- 創建資料庫
CREATE DATABASE test01; -- 創建資料庫01
-- 但問題是如果test01存在,系統會報錯
-- 所以一般會加入一個判斷條件
CREATE DATABASE IF NOT EXISTS test01;
- 刪除資料庫
DROP DATABASE IF EXISTS test01;
- 使用資料庫
-- tab鍵上方有一個``,如果資料庫的表名或者欄位名是一個特殊字元,就需要添加
USE `test01`;
- 查詢資料庫
SHOW DATABASES; -- 查看所有資料庫
2.2 資料庫列數據類型
數字
2.3 資料庫欄位屬性(重要)
-
unsigned:
- 無符號的整數
- 聲明瞭該列不能填充負數
-
zerofill:
- 0填充的
- 不足位數在前面用0來填充,例如int(3),5-->005
-
自增
- 通常理解為自增,自動在上一條記錄的基礎上+1(預設)
- 通常用來設計唯一的主鍵~index,必須是整數類型
- 可以自定義自增步長
- Navicat中Mysql自增設置在選項中
- 非空 NULL not NULL
- 假如設置為not null ,如果不給他賦值就會報錯!
- NULL,如果不填寫值,預設就是NULL!
- 預設:
- 設置預設的值
- 例如 sex,預設值為男性,如果沒有特別指定該列的值,則會有預設的值!
- 需要註意,在Navicat中,預設值設置,自增,無符號以及填充零都在下方
- 拓展
/*每一個表都必須存在以下五個欄位,未來做項目都有用,表示一個記錄存在的意義
id 主鍵
is_delete 偽刪除
gmt_create 創建時間
gmt_update 更新時間
*/
2.4 創建資料庫表(重點)
-- 目標:創建一個school資料庫
-- 創建學生表(列,欄位) 使用SQL語句創建
-- 學號int 登陸密碼varchar(20) 姓名 性別varchar(2) 出生日期(datetime) 家庭住址 email
-- 註意點,使用英文(),表的名稱和欄位儘可能使用``括起來
-- AUTO_INCREMENT 自增
-- 字元串使用單引號括起來;
-- 所有的語句後面加,(英文的),最後一個不用加
-- PRIMARY KEY 主鍵,一般一個表只有一個唯一的主鍵
CREATE TABLE IF NOT EXISTS `studentinformation`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '12345' COMMENT'密碼',
`sex` VARCHAR(2) NOT NULL DEFAULT'男' COMMENT'性別',
`birthday` DATETIME DEFAULT NULL COMMENT'出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT'家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT'電子郵箱',
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
格式
CREATE TABLE [IF NOT EXISTS] `表名`(
`欄位名` 列類型 [屬性] [索引][註釋],
`欄位名` 列類型 [屬性] [索引][註釋],
·······
`欄位名` 列類型 [屬性] [索引][註釋]
)[表類型][字元集設置][註釋]
2.5 數據表的類型
-- 關於資料庫引擎
/*
INNODB 預設使用~
MYISAM 早些年使用
*/
MYISAM | INNODB | |
---|---|---|
事務支持 | 不支持 | 支持 |
數據行鎖定(同步) | 不支持 | 支持 |
外鍵約束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空間大小 | 較小 | 較大,約為前者2倍 |
常規使用操作:
- MYISAM 節約空間,速度較快
- INNODB 安全性高,事務的處理,多表多用戶操作
在物理空間的位置
所有的資料庫文件都存在data目錄下
所以資料庫的本質還是文件的存儲
Mysql引擎在物理文件上的區別
- InnoDB在資料庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件
- MYISAM對應文件
- *.frm 表結構的定義文件
- *.MYD 數據文件(data)
- *.MYI 索引文件(index)
- 這裡有必要提到的是,MySQL8開始刪除了原來的frm文件,並採用 Serialized Dictionary Information (SDI), 是MySQL8.0重新設計數據詞典後引入的新產物,並開始已經統一使用InnoDB存儲引擎來存儲表的元數據信息。SDI信息源記錄保存在ibd文件中。
如何可以查看表結構信息,官方提供了一個工具叫做ibd2sdi,在安裝目錄下可以找到,可以離線的將ibd文件中的冗餘存儲的sdi信息提取出來,並以json的格式輸出到終端。可參考一篇CSDN博客。https://blog.csdn.net/philipslu/article/details/102499234
設置資料庫表的字元集編碼
CHARSET = utf8
也可以採取在資料庫安裝目錄下新建一個ini文件的方式進行預設設置。不如不單獨設置,系統會預設為一個latin字元集,我的ini文件格式如下:
#設置3306埠
port=3306
#設置mysql的安裝目錄 ----------是你的文件路徑-------------
basedir=E:\WorkappPackage\Mysql\mysql-8.0.32-winx64
#設置mysql資料庫的數據的存放目錄 ---------是你的文件路徑data文件夾自行創建
#datadir=E:\WorkappPackage\Mysql\mysql-8.0.32-winx64\data
#允許最大連接數
max_connections=200
#允許連接失敗的次數。
max_connect_errors=10
#服務端使用的字元集預設為utf8mb4
character-set-server=utf8mb4
#創建新表時將使用的預設存儲引擎
default-storage-engine=INNODB
#預設使用“mysql_native_password”插件認證
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
#設置mysql客戶端預設字元集
default-character-set=utf8mb4
[client]
#設置mysql客戶端連接服務端時預設使用的埠
port=3306
default-character-set=utf8mb4
- 前面有關於文件路徑以及data保存路徑的設置需要根據實際情況進行調整。後面的埠設置為系統預設的3306。其他相關內容可參考文章:https://blog.csdn.net/weixin_42820850/article/details/129108669
2.6 修改刪除表
修改
-- 修改表名:ALTER TABLE 舊表名 RENAME AS 新表名
ALTER TABLE test01 Rename AS test02
-- 增加表的欄位:ALTER TABLE 表名 ADD 欄位名 列屬性
ALTER TABLE test02 ADD age INT(10)
-- 修改表的欄位(重命名,修改約束)
-- ALTER TABLE 表名 MODIFY 欄位名 列屬性[]
ALTER TABLE test02 MODIFY age VARCHAR(10)
-- ALTER TABLE 表名 CHANGE 舊名字 新名字 列屬性[]
ALTER TABLE test01 CHANGE age age1 INT(1) -- 欄位重命名
-- 刪除表的欄位
ALTER TABLE test01 DROP age1
- 可以觀察到,所有對於表的修改都是以ALTER開頭的
刪除
-- 刪除表(加入判斷條件,如果存在再刪除)
DROP TABLE IF EXISTS test01
- 需要註意,所有的創建和刪除儘量加上判斷,以免出現報錯
03 MySQL數據管理
3.1 資料庫級別外鍵(瞭解)
方式一:在創建表的時候,增加外鍵語句和關聯語句等約束(比較複雜)
CREATE TABLE IF NOT EXISTS `studentinformation`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '12345' COMMENT'密碼',
`sex` VARCHAR(2) NOT NULL DEFAULT'男' COMMENT'性別',
`birthday` DATETIME DEFAULT NULL COMMENT'出生日期',
`gradeid` INT(3) NOT NULL COMMENT'年級id',
`address` VARCHAR(100) DEFAULT NULL COMMENT'家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT'電子郵箱',
PRIMARY KEY(`id`),
KEY `FK_gradeid`(`gradeid`), -- 外鍵名稱設置
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`) -- 關聯約束設置
)ENGINE = INNODB DEFAULT CHARSET=utf8
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(3) NOT NULL COMMENT'年級id',
`gradename` VARCHAR(10) NOT NULL COMMENT'年級名稱',
PRIMARY KEY(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
- 運行結果如下
- 可以看到此時由於外鍵關聯關係的存在,原表在刪除以及對某些欄位內容進行修改時都收到了約束
- 刪除時需要先刪除引用的表,然後再回來刪除被引用的表
方法二:正如上面所示,可以在外鍵部分手動添加,這裡不做展開,與上面運行結果類似即可
方法三:
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(3) NOT NULL COMMENT'年級id',
`gradename` VARCHAR(10) NOT NULL COMMENT'年級名稱',
PRIMARY KEY(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
-- 外部創建外鍵約束
CREATE TABLE IF NOT EXISTS `studentinformation`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT'姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '12345' COMMENT'密碼',
`sex` VARCHAR(2) NOT NULL DEFAULT'男' COMMENT'性別',
`birthday` DATETIME DEFAULT NULL COMMENT'出生日期',
`gradeid` INT(3) NOT NULL COMMENT'年級id',
`address` VARCHAR(100) DEFAULT NULL COMMENT'家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT'電子郵箱',
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
-- 創建表的時候沒有外鍵關係
-- 外部添加外鍵約束
ALTER TABLE `studentinformation`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
-- 結構
ALTER TABLE 表
ADD CONSTRAINT 約束名 FOREIGN KEY(`作為外鍵的列`)
- 但需要註意的是,以上的操作均為物理外鍵,是在資料庫級別進行操作的外鍵,一般不推薦使用。(避免資料庫過多造成困擾)
最佳實踐
- 資料庫就是單純的表,只用來存數據,只有行(數據)和列(欄位)
- 如果想使用多張表的關聯操作,即使用外鍵(在程式中實現)
參考文章:https://www.cnblogs.com/rjzheng/p/9907304.html
3.2 DML語言(需要全部記住)
資料庫意義:數據存儲、數據管理
DML語言:數據操作語言
- INSERT
- UPDATE
- DELETE
3.3 添加INSERT
格式
-- 插入語句(添加)
-- INSERT INTO 表名 (`欄位名1`,`欄位名2`,`欄位名3`) VALUES('第一條數據欄位1數據','第一條數據欄位2數據','第一條數據欄位3數據'),('第二條數據欄位1數據','第二條數據欄位2數據','第二條數據欄位3數據')····
-- 例:
INSERT INTO `grade`(`gradename`)VALUES('大一')
-- 需註意的是,跟在表名後面的括弧內容可以選擇表中的部分欄位,但是需要觀察表結構,那些非空且沒有預設值的或者沒設置自增的欄位必須包括在內,否則會報錯。還需註意,選定了括弧內容後,VALUES後面的括弧內的結構需與前面保持一致。如果想一次性添加多條數據,需要在括弧中間用“,”隔開。
-- 錯誤示例:
INSERT INTO `grade` VALUES('大二')
-- 此處在表名`grade`後面沒有括弧,因此Mysql就會預設格式為全部欄位。依照上面所述,資料庫會對VALUES後面數據進行匹配。因此會報錯。
-- 正確示例:
INSERT INTO `grade` VALUES(2,'大二')
-- 插入多條數據
INSERT INTO `grade`(`gradename`)
VALUES ('大三'),('大四')
- 再次強調,必須註意標點符號的中英文格式!
註意事項:
- 欄位和欄位之間用英文逗號隔開
- 欄位是可以省略的,但是後面括弧內的值需要一一對應,不能少
- 可以同時插入多條數據,VALUES後面的值,需要使用隔開即可