MySQL基礎合集
- 2022 年 4 月 21 日
- 筆記
1、MySQL的優勢
- 運行速度快
- 使用成本低
- 可移植性強
- 適用用戶廣
2、MySQL的運行機制
一個SQL語句,如select * from tablename ,從支援介面進來後,進入連接池後做許可權、驗證等環節,然後判斷是否有快取,有則直接放回結果,否則進入SQL介面,在查詢之前查詢優化器進行優化,最後進行解析,查詢。並通過存儲引擎與文件交互。
3、MySQL的配置
**埠號:**3306 **默認字符集:**utf8 將bin目錄寫入 環境變數 root密碼設置
**註:**utf8:一種Unicode編碼,解決國際上字元不統一的多位元組編碼,通用性強 my.ini:記錄MySQL配置資訊,可修改配置內容,如埠號,字符集等
4、命令行連接MySQL
首先檢查是否啟動服務 屬性窗口 DOS命令:
啟動:net start mysql57
停止:net stop mysql57
57代表是5.7的版本,以下的不需接57
註:如果修改了配置文件,必須重啟MySQL服務才能生效 命令行連接MySQL語法:mysql –h伺服器主機地址 –u 用戶名 –p密碼
l –h伺服器主機地址(如果是本機可以省略這名句) 密碼可省略,按回車再輸入
5、系統資料庫和用戶資料庫
系統資料庫: **information_schema:**主要存儲系統中的一些資料庫對象資訊,如用戶表資訊、欄位資訊、許可權資訊、字符集資訊和分區資訊等。 **performance_schema:**主要存儲資料庫伺服器性能參數
**mysql:**主要存儲系統的用戶許可權資訊 **test:**MySQL資料庫管理系統自動創建的測試資料庫,任何用戶都可以使用 用戶資料庫: 用戶資料庫是用戶根據實際需求創建的資料庫。本章後面的講解主要針對用戶資料庫。
6、創建資料庫
set names utf8; 語法: create database 資料庫名 **示例:**create database myschool;
7、查看資料庫列表
語法:show databases;
8、選擇資料庫
語法:use 資料庫名; 註:使用數據前必須先選擇該資料庫!
9、刪除資料庫
語法:drop database 資料庫名;
10、MySQL數據類型
11、創建表
語法:CREATE TABLE [IF NOT EXISTS] 表名 ( 欄位1 數據類型 [欄位屬性|約束][索引][注釋], …… 欄位n 數據類型 [欄位屬性|約束][索引][注釋]
)[表類型][表字符集][注釋];
例:
CREATE TABLE `student`
(
`studentNo` INT(4) PRIMARY KEY auto_increment not null,
` name` CHAR(10),
……
);
12、欄位的約束及屬性
名稱 關鍵字 說明
非空約束 NOT NULL 欄位不允許為空 默認約束 DEFAULT 賦予某欄位默認值 唯一約束 UNIQUE KEY(UK) 設置欄位的值是唯一的 允許為空,但只能有一個空值 主鍵約束 PRIMARY KEY(PK) 設置該欄位為表的主鍵 可唯一標識該表記錄 外鍵約束 FOREIGN KEY(FK) 用於在兩表之間建立關係 自動增長 AUTO_INCREMENT 設置該列為自增欄位,默認每條自增1,通常用於設置主鍵
主鍵:
CREATE TABLE student(
`studentNo` INT(4) PRIMARY KEY,
……);
注釋:
CREATE TABLE test (
`id` int(11) UNSIGNED COMMENT 『編號』
)COMMENT='測試表』 ;
設置字符集編碼
CREATE TABLE [IF NOT EXISTS] 表名(
#省略程式碼
)CHARSET = 字符集名;
創建學生表示例:
CREATE TABLE `student`(
`studentNo` INT(4) NOT NULL COMMENT '學號' PRIMARY KEY,
`loginPwd` VARCHAR(20) NOT NULL COMMENT '密碼',
`studentName` VARCHAR(50) NOT NULL COMMENT '學生姓名',
`sex` CHAR(2) DEFAULT '男' NOT NULL COMMENT '性別',
`gradeId` INT(4) UNSIGNED COMMENT '年級編號',
`phone` VARCHAR(50) COMMENT '聯繫電話',
`address` VARCHAR(255) DEFAULT '地址不詳'COMMENT '地址',
`bornDate` DATETIME COMMENT '出生時間',
`email` VARCHAR(50) COMMENT'郵件帳號',
`identityCard` VARCHAR(18) UNIQUE KEY COMMENT '身份證號'
) COMMENT='學生表';
13、查看錶
查看錶是否存在
查看錶定義
註:避免DOS窗口亂碼,可執行SET NAMES gbk;
14、刪除表
**語法:**DROP TABLE [IF EXISTS] 表名; 示例:
註:在刪除表之前,先使用IF EXISTS語句驗證表是否存在
15、MySQL的存儲引擎
1)存儲引擎的類型 MyISAM、InnoDB 、Memory、CSV等9種 2)MyISAM與InnoDB類型主要區別
經驗: 適用場合 使用MyISAM: 不需事務,空間小,以查詢訪問為主 使用InnoDB: 多刪除、更新操作,安全性高,事務處理及並發控制 3)查看當前默認存儲引擎 SHOW VARIABLES LIKE 『storage_engine%』; 4)修改存儲引擎
修改my.ini配置文件 default-storage-engine= InnoDB
5)設置表的存儲引擎 語法:CREATE TABLE 表名( #省略程式碼 )ENGINE=存儲引擎;
16、數據表的存儲位置
1)MyISAM類型表文件 *.frm:表結構定義文件 *.MYD:數據文件 *.MYI:索引文件 2)InnoDB類型表文件 *.frm:表結構定義文件 ibdata1文件 注意:存儲位置 因作業系統而異,可查my.ini
datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/” innodb_data_home_dir=”D:/MySQL Datafiles/”
17、MySQL系統幫助
HELP 查詢內容; HELP contents; HELP Data Types; HELP INT;
補充:mysql 數值類型 中帶符號的/無帶符號的 區別
帶符號和無符號,顧名思義,就是是否有正負之分: 比如8為二進位,如果帶符號,需要用1位表示符號(1表示負數,0表示正),剩下7位表示數據. 那麼表示範圍是-127—127(包括-0和+0). 如果不帶符號,8位全部表示數據, 那麼表示範圍是 0–256
補充: mysql 有沒有nvarchar nchar
有,但是,mysql採用utf-8編碼,而傳統的資料庫採用unicode,一個漢字要用兩個unicode的char,而在mysql中由於使用了utf-8,所以無論漢字還是字母,都是一個長度的char,所以就不用分nvarhcar和varchar了,一律作varchar
SQL高級(一)
1、修改表
1)#修改表名 ALTER TABLE 舊錶名 RENAME 新表名; 2)#添加欄位 ALTER TABLE 表名 ADD 欄位名 數據類型 [屬性]; 3)#修改欄位 ALTER TABLE 表名 CHANGE 原欄位名 新欄位名 數據類型 [屬性]; 4)#刪除欄位 ALTER TABLE 表名 DROP 欄位名;
2、添加主鍵
語法: ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY 表名(主鍵欄位);
**例:**設置grade表中gradeId欄位為主鍵
alter table `grade` add constraint `pk_grade` primary key `grade`(`gradeId`);
3、添加外鍵
語法: ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY(外鍵欄位) REFERENCES 關聯表名(關聯欄位);
**例:**將student表的gradeId欄位和grade表的gradeId欄位建立外鍵關聯
alter table `student` add constraint fk_student_grade foreign key(`gradeId`)
references `grade` (`gradeId`);
4、DML語句–插入單條數據記錄
**語法:**INSERT INTO 表名 [(欄位名列表)] VALUES (值列表);
注意: 欄位名是可選的,如省略則依次插入所有欄位 多個列表和多個值之間使用逗號分隔 值列表和欄位名列表一一對應 如插入的是表中部分數據,欄位名列表必填 示例:
INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES('123','黃小平',1,'13956799999','1996-5-8');
5、DML語句–插入多條數據記錄
**語法:**INSERT INTO 新表(欄位名列表)VALUES(值列表1),(值列表2),……,(值列表n); 示例:
INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
經驗: 為避免表結構發生變化引發的錯誤,建議插入數據時寫明具體欄位名!
6、DML語句——將查詢結果插入新表
CREATE TABLE `phoneList`(
SELECT `studentName`,`phone`
FROM `student`);
註:如新表已存在,將會報錯!
7、DML語句——數據更新、刪除
1)更新數據記錄 update 表名 set 欄位1=值1,欄位2=值2,…,欄位n=值n [where 條件]; 2)刪除數據記錄
DELETE FROM 表名 [WHERE條件];
TRUNCATE TABLE 表名;
TRUNCATE語句刪除後將重置自增列,表結構及其欄位、約束、索引保持不變,執行速度比DELETE語句快
8、DQL語句
語法:
SELECT <欄位名列表> FROM <表名或視圖> [WHERE <查詢條件>] [GROUP BY <分組的欄位名>] [HAVING <條件>] [ORDER BY <排序的欄位名> [ASC 或 DESC]] 示例:
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY studentNo;
9、LIMIT子句
MySQL查詢語句中使用LIMIT子句限制結果集 語法: SELECT <欄位名列表> FROM <表名或視圖> [WHERE <查詢條件>] [GROUP BY <分組的欄位名>] [ORDER BY <排序的列名> [ASC 或 DESC]] [LIMIT [位置偏移量, ]行數];
示例:
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY studentNo
LIMIT 4,4; #(從第5條開始顯示4條)
註:使用LIMIT子句時,注意第1條記錄的位置是0!
10、常用函數——聚合函數
**AVG()**返回某欄位的平均值
COUNT() 返回某欄位的行數
**MAX()**返回某欄位的最大值
MIN() 返回某欄位的最小值
SUM() 返回某欄位的和
11、常用函數——字元串函數
CONCAT(str1,str1…strn) 字元串連接 SELECT CONCAT(‘My’,’S’,’QL’); 返回:MySQL INSERT(str,pos,len,newstr) 字元串替換 SELECT INSERT( ‘這是SQL Server資料庫’,3,10,’MySQL’); 返回:這是MySQL資料庫 LOWER(str) 將字元串轉為小寫 SELECT LOWER(‘MySQL’); 返回:mysql UPPER(str) 將字元串轉為大寫 SELECT UPPER(‘MySQL’); 返回:MYSQL SUBSTRING(str,num,len) 字元串截取 SELECT SUBSTRING( ‘JavaMySQLOracle’,5,5); 返回:MySQL
12、常用函數——時間日期函數
CURDATE() 獲取當前日期 SELECT CURDATE();返回:2016-08-08 CURTIME() 獲取當前時間 SELECT CURTIME(); 返回:19:19:26 NOW() 獲取當前日期和時間 SELECT NOW();返回:2016-08-08 19:19:26 WEEK(date) 返回日期date為一年中的第幾周 SELECT WEEK(NOW()); YEAR(date) 返回日期date的年份 SELECT YEAR(NOW()); HOUR(time) 返回時間time的小時值 SELECT HOUR(NOW()); DATEDIFF(date1,date2) 返回日期參數date1和date2之間相隔的天數 SELECT DATEDIFF(NOW(),’2008-8-8′); 返回:2881
13、常用函數——數學函數
CEIL(x)返回大於或等於數值x的最小整數 SELECT CEIL(2.3) 返回:3 FLOOR(x) 返回小於或等於數值x的最大整數 SELECT FLOOR(2.3) 返回:2 RAND() 返回0~1間的隨機數 SELECT RAND() 返回:0.5525468583708134
14、子查詢
1)子查詢是一個嵌套在 SELECT、INSERT、UPDATE 或 DELETE 語句或其他子查詢中的查詢 2)子查詢在WHERE語句中的一般用法 **語法:**SELECT … FROM 表1 WHERE 欄位1 比較運算符(子查詢) **註:**將子查詢和比較運算符聯合使用,必須保證子查詢返回的值不能多於一個 示例:
SELECT `studentNo`,`studentName`,`sex`,`bornDate`,`address`
FROM `student`
WHERE `bornDate` > (SELECT `bornDate` FROM `student` WHERE `studentName`='李斯文');
15、使用子查詢替換表連接
1)實現方法一:採用表連接
SELECT `studentName` FROM `student` stu
INNER JOIN `result` r ON stu.studentNO = r.studentNo
INNER JOIN `subject` sub ON r.subjectNo = sub.subjectNo
WHERE `studentResult` = 60 AND `subjectName` = 'Logic Java';
2)實現方法二:採用子查詢
SELECT `studentName` FROM `student` WHERE `studentNo` = (
SELECT `studentNo` FROM `result`
INNER JOIN `Subject` ON result.subjectNo= subject.subjectNo
WHERE `studentResult`=60 AND `subjectName`='Logic Java'
);
子查詢比較靈活、方便,常作為增刪改查的篩選條件,適合於操縱一個表的數據 表連接更適合於查看多表的數據
16、IN子查詢
SELECT `studentName` FROM `student`
WHERE `studentNo` IN(
SELECT `studentNo` FROM `result`
WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='Logic Java'
)AND `studentResult` = 60
);
常用IN替換等於(=)的子查詢 IN後面的子查詢可以返回多條記錄
註:非原創!