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後面的值,需要使用隔開即可
3.4 修改UPDATE
UPDATE 修改誰 set 原來的值 = 新值 WHERE 條件
-- 修改某條數據的某一個欄位信息的格式
UPDATE `studentinformation1` SET `pwd`= 11111 WHERE `id` = 2200935
-- 需要註意,如果不加入判斷條件,就會修改整張表的全部該欄位信息
UPDATE `studentinformation1` SET `address`='XX大學XX校區'
-- 如果想要一次修改某條數據的多個欄位信息,則需要在不同欄位之間用逗號隔開
UPDATE `studentinformation1` SET `name` = 'wutong',`pwd` = 'wt677099' WHERE `id`= 2200936
-- 語法:
-- UPDATE 表名 SET column_name1 = value1,column_name2 = value2······WHERE 條件
條件:WHERE 子句 運算符 id等於某個值,大於某個值,在某個區間內修改.....
註意,WHERE後的判斷語句會返回一個布爾值
操作符 | 含義 | 示例 | 結果 |
---|---|---|---|
= | 等於 | 5=6 | false |
<>或!= | 不等於 | 5<>6 | true |
> | 大於 | 5>6 | false |
< | 小於 | 5<6 | true |
<= | 小於等於 | 5<=6 | true |
>= | 大於等於 | 5>=6 | false |
BETWEEN...AND... | 在範圍內 | BETWEEN 2 AND 5 | [2,5] |
AND | 與 | 3>1 AND 3>5 | false |
OR | 或 | 3>1 OR 3>5 | true |
-- 多個條件查詢數據示例:
UPDATE `studentinformation1` SET `name` = 'ZhangSan' WHERE `id`<5 AND `pwd` = 12347
註意:
- column_name是資料庫的列,儘量帶上``
- 條件,篩選的條件,如果沒有指定,則會修改所有的列
- value,是一個具體的值,也可以是一個變數
- 多個設置屬性之間,使用英文逗號隔開
- 在編寫條件時一定要註意參數的屬性
3.5 刪除DELETE
DELETE命令
語法:DELETE FROM表名 [where 條件]
-- 刪除數據(避免這樣寫,會把數據全部幹掉,而且會有遺留問題)
DELETE FROM `test02`
-- 刪除指定數據
DELETE FROM `test02` WHERE `id`= 1
TRUNCATE命令
- 作用:完全清空一個資料庫表,表的結構和索引約束不會變!而且不影響事務(後面再講)
-- 清空 test02表
TRUNCATE TABLE `test02`
DELETE 和 TRUNCATE 的區別
-
相同點:都能刪除數據,都不會刪除表結構
-
不同(在InnoDB引擎下):
-
TRUNCATE 重新設置自增列計數器,即下次再插入數據時會從1開始,而DELETE會從上次的自增終點開始
- 觀察DELETE操作後使用INSERT插入數據
- 觀察TRUNCATE操作後使用INSERT插入數據
- 測試源碼如下:
CREATE TABLE IF NOT EXISTS `test02`( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '序號', `name` VARCHAR(10) NOT NULL, PRIMARY KEY(`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 INSERT INTO `test02`(`name`) VALUES('張三'),('李四'),('王五') DELETE FROM `test02` WHERE `id`= 2 DELETE FROM `test02` TRUNCATE TABLE `test02`
-
TRUNCATE 不會影響事務
-
瞭解內容:DELETE刪除的問題,重啟資料庫現象
- InnoDB 自增列會從1開始(存在記憶體當中,斷點即失)
- MyISAM 繼續從上一個自增量開始(存在文件中的,不會丟失)
04 DQL查詢數據(最重點)
4.0 預備
設計一個案例資料庫,之後操作可能都圍繞這個
CREATE DATABASE `studentmanage`;
USE `studentmanage`;
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`(
`GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT'年級編號',
`GradeName` VARCHAR(50) NOT NULL COMMENT'年級名稱',
PRIMARY KEY(`GradeID`)
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO `grade`(`GradeID`,`GradeName`) VALUES(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'預科');
drop table if exists `student`;
create table `student`(
`studentno` int(4) not null comment '學號',
`loginpwd` varchar(20) default null,
`studentname` varchar(20) default null comment '學生姓名',
`sex` tinyint(1) default null comment '性別,0或1',
`gradeid` int(11) default null comment '年級編號',
`phone` varchar(50) not null comment '聯繫電話,允許為空',
`address` varchar(255) not null comment '地址,允許為空',
`borndate` datetime default null comment '出生時間',
`email` varchar (50) not null comment '郵箱賬號允許為空',
`identitycard` varchar(18) default null comment '身份證號',
primary key (`studentno`),
unique key `identitycard`(`identitycard`),
key `email` (`email`)
)engine=myisam default charset=utf8;
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`(
`subjectno`INT(11) NOT NULL auto_increment COMMENT '課程編號',
`subjectname` VARCHAR(50) DEFAULT NOT NULL COMMENT '課程名稱',
`classhour` INT(4) DEFAULT NOT NULL COMMENT '學時',
`gradeid` INT(4) DEFAULT NOT NULL COMMENT '年級編號',
PRIMARY KEY (`subjectno`)
)ENGINE = InnoDB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;
DROP TABLE IF EXISTS `result`;
CREATE TABLE `result`(
`studentno` INT(4) NOT NULL COMMENT '學號',
`subjectno` INT(4) NOT NULL COMMENT '課程編號',
`examdate` DATETIME NOT NULL COMMENT '考試日期',
`studentresult` INT(4) NOT NULL COMMENT '考試成績',
KEY `subjectno` (`subjectno`)
)ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)VALUES
(1,'高等數學-1',110,1),
(2,'高等數學-2',110,2),
(3,'高等數學-3',100,3),
(4,'高等數學-4',130,4),
(5,'C語言-1',110,1),
(6,'C語言-2',110,2),
(7,'C語言-3',100,3),
(8,'C語言-4',130,4),
(9,'Java程式設計-1',110,1),
(10,'Java程式設計-2',110,2),
(11,'Java程式設計-3',100,3),
(12,'Java程式設計-4',130,4),
(13,'資料庫結構-1',110,1),
(14,'資料庫結構-2',110,2),
(15,'資料庫結構-3',100,3),
(16,'資料庫結構-4',130,4),
(17,'C#基礎',130,1);
INSERT INTO `student`
VALUES(1000,'zhangsan123','張三',1,1,13800004196,'十舍111','1999-01-01','[email protected]','123456198001011234'),
(1001,'lisi123','李四',1,2,13700002826,'十舍115','1999-03-12','[email protected]','879997879979979'),
(1002,'wangwu123','王五',1,3,15500003231,'十舍223','1999-05-04','[email protected]','29565236989454'),
(1003,'laoliu123','老六',1,5,13300009825,'十舍342','1999-06-11','[email protected]','98898216546546'),
(1004,'xiaomei123','小美',0,2,13200006032,'八舍102','1999-08-15','[email protected]','32165468979797'),
(1005,'xiaonuan123','小暖',0,4,13500007472,'八舍238','1999-10-21','[email protected]','87651351654998'),
(1006,'xiaoqian123','小倩',0,1,15100004312,'八舍313','1999-11-09','[email protected]','32165489756544'),
(1007,'xiaohanhan123','小憨憨',1,3,17100005169,'十舍250','1999-02-28','[email protected]','87979789987781');
-- 學生成績這部分數據根據功能需要自行繼續添加
INSERT INTO `result`
VALUES(1000,1,'2017-12-26',91),
(1000,3,'2018-12-17',86),
(1000,5,'2017-12-15',93),
(1000,7,'2018-12-22',91),
(1000,9,'2017-12-19',82),
(1000,10,'2017-06-08',72),
(1000,15,'2018-12-11',83),
(1000,16,'2019-06-25',77),
(1000,17,'2017-12-23',64),
(1001,1,'2017-12-26',93),
(1002,3,'2018-12-17',79),
(1003,5,'2017-12-15',80),
(1004,7,'2018-12-22',73),
(1005,9,'2017-12-19',69),
(1006,10,'2017-06-08',81),
(1002,15,'2018-12-11',61),
(1004,16,'2019-06-25',86),
(1006,17,'2017-12-23',91);
4.1 DQL簡介
- Data Query Language,縮寫DQL,直翻就是數據查詢語言
- 資料庫中所有的查詢語句都用 SELECT
- 這是資料庫操作中最核心最重要的部分
- SELECT語句眾多,簡單複雜查詢都可以實現
- 是資料庫操作中使用頻率最高的語句
4.2 SELECT初識
-- 查詢某張表中的全部信息
SELECT * FROM student
-- 查詢某張表中指定欄位的信息 SELECT 欄位名1,欄位2...FROM 表名
SELECT `studentno`,`studentname` FROM student
-- 查詢某張表中指定欄位的信息,並將部分欄位名替換掉,使用AS語句
SELECT `studentno` AS 學號,`studentname` AS 學生姓名 FROM student
-- 利用CONCAT(A,B)函數合併兩個欄位的信息並展示
SELECT CONCAT(`studentno`,`studentname`) AS 姓名 FROM student
有時候,列名字不是那麼的易於理解,可以使用AS取別名幫助理解
去重 DISTINCT
作用:去除SELECT查詢出來的結果中重覆的數據,重覆的數據只顯示一條。
-- 查詢有哪些同學參加了考試
SELECT * FROM student
SELECT `studentno` FROM student
SELECT DISTINCT `studentno` AS 學號 FROM student
資料庫的列(表達式)
-- 查詢資料庫版本(函數)
SELECT VERSION();
-- 計算結果(表達式)
SELECT 100*3-1 AS 計算結果
-- 查詢某個變數的大小
SELECT @@AUTO_INCREMENT_INCREMENT
-- 對資料庫原數據進行操作
SELECT `studentno` AS 學號,`studentResult`+1 AS 修正成績 FROM result
資料庫中的表達式:文本值,列,NULL,函數,計算表達式,系統變數......
SELECT 表達式 FROM 表