一、1.MySQL的存儲引擎
儲存引擎的類型:MyISAM、InnoDB、 Memory、CSV等九種
MyiSAM和InnoDB類型主要區別
名稱 | InnoDB | MyISAM |
事務處理 | 支持 | 不支持 |
數據行鎖定 | 支持 | 不支持 |
外鍵約束 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
表空間大小 | 較大,約2倍 | 較小 |
適用場合
<1>使用MyISAM:不需事務,空間小,以查詢訪問爲主
<2>使用InnoDB:多刪除,更新操作, 安全性高,事務處理及併發控制
2.查看當前默認儲存引擎
語法:SHOW VARIABLES LIKE'storage_engine%':
執行命令得
修改存儲引擎
修改my.ini配置文件
語法:default-storage-engine=InnoDB(改爲其他存儲存儲)
設置表的存儲引擎
語法:CREATE TABLE 表名(#省略代碼)ENGINE=存儲引擎;
CREATE TABLE test_mysam(
tit INT
)ENGINE=MYISAM;
執行命令得
默認爲InnoDB存儲引擎 兩個引擎的不同 會使表中存儲數據時的格式不同
3.數據表的存儲位置
<1>MyISAM類型表文件
*.frm:表結構定義文件
*.MYD:數據文件
*.MYI:索引文件
<2>InnoDB類型表文件
*.frm:表結構定義文件
ibdata1文件
注意!!!
存儲位置 (因操作系統而異,可查my.ini)
二、DML語句
Data Manipulation Language,數據操縱語言,命令使用戶能夠查詢數據庫以及操作已有數據庫中的數據的計算機語言。具體是指是SELECT查詢、UPDATE更新、INSERT插入、DELETE刪除。
1.插入單條數據紀錄
語法:INSERT IN TO 表名 (字段名列表) VALUES (值列表);
注意!!!
<1>字段名是可選的,如省略則依次插入所有字段
<2>多個列表和多個值之間是用逗號隔開
<3>值列表和字段名列表一一對應
<4>如果插入的是表中部分數據,字段名列表必填
例:
USE python7;
INSERT INTO `student`(`studentNo`,`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES(30013,'123','黃小平',1,'13956799999','1996-5-8');
執行命令得
2.插入多調數據記錄
語法:INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),......,(值列表n);
(爲避免表結構發生變化引發的錯誤,建議插入數據時寫明具體字段名)
例:
CREATE TABLE SUBJECT(
subjectNo INT(4) PRIMARY KEY AUTO_INCREMENT,
subjectName VARCHAR(50),
classHour INT(4),
gradeID INT(4)
)
INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
執行命令得
3.將查詢結果插入新表
語法:CREATE TABLE 新表( SELECT (值列表1),值列表2)...(值列表n) FROM 舊錶);
例:編寫SQL語句實現從學生表提取姓名、手機號兩列數據存儲到通訊錄表中
方法一:如果新列表已經存在將會報錯
CREATE TABLE phoneList(
SELECT studentName,phone FROM student
);
方法二:phoneList必須存在 其中列的數據類型和原表的數據類型一致
給表添加新增列:先給表添加主鍵然後屬性爲新增
CREATE TABLE phoneList(
studentName VARCHAR(50) NOT NULL,
phone VARCHAR(50) DEFAULT NULL)
INSERT INTO phoneList()
SELECT
studentName,phone
FROM student
執行命令得
4.數據更新
語法:UPDATE 表名
SET 字段1=值1 , 字段2=值2,...,字段n=值n
[WHERE 條件]
例:
UPDATE student SET sex='男';
#不添加條件則全部變爲男性
UPDATE student SET gradeID=3,loginPwd=123456#年級編號 密碼改變
WHERE studentNo>20010#條件爲學號>20010的學生
執行命令得
5.數據刪除
語法:DELETE FROM 表名 [WHERE 條件];
TRUNCATE TABLE 表名;
(TRUNCATE語句刪除後將重置自增列,表結構及其字段、約束、索引保持不變,執行速度比DELETE語句塊)
例:
DELETE FROM phoneList
WHERE studentName='郭靖'#刪除名爲郭靖的行
執行命令得
三、查詢
查詢產生一個虛擬表
看到的是表形式顯示的結果,但結果並不真正存儲
每次執行查詢只是從數據表中提取數據,並按照表的形式顯示出來
1.查詢全部的行和列
語法:SELECT * FROM student
2.查詢部分列
語法:SELECT `studentNo`,`studentName`,`address`
FROM `student`
WHERE `address='天津市河西區'`
3.使用AS命名列
SELECT `studentNo` AS' 學生編號',`studentName` AS '學生姓名',
`address `AS 學生地址
FROM `student`
WHERE `address` ='天津市河西區';
代碼:
SELECT studentNo AS '學號',studentName AS '姓名',phone AS '手機',address AS '地址',bornDate AS '出生日期'
FROM `student`
WHERE gradeID=1#條件爲班級編號1的學生
執行命令得
4.查詢空行
語法:SELECT `studentName` FROM `student` WHERE `email` IS NULL;
代碼
UPDATE student SET email=666
WHERE loginPwd=123
SELECT `studentName` FROM `student` WHERE `email` IS NULL;
執行代碼得
使用常量列
爲每條數據添加一個常量列
SELECT *,'北京信息中心' AS '學校名稱' FROM `student`
WHERE gradeID>1
執行命令得
四、常用函數
1.聚合函數
函數名 | 作用 |
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行數 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
例
:
SELECT AVG(`studentResult`) AS '平均成績',
COUNT(*) AS '參加人數',
MAX(studentResult) AS '最高',
MIN(studentResult) AS '最低',
SUM(studentResult) AS '總和'
FROM result
執行命令得
2.字符串函數
函數名 | 作用 | 舉例 |
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 |
例:
#字符串連接
SELECT CONCAT('北','京','海','澱');
#字符串替換 (原,開始,長度,新)
SELECT INSERT('北京市',1,2,'運城');
#替換大小寫
SELECT LOWER('Hello');
SELECT UPPER('Hello');
#字符串截取
SELECT SUBSTRING('hello mysql',7,5)
分別執行命令的
3.時間日期函數
函數名 | 作用 | 舉例(結果與當前時間有關) |
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()); 返回:26 |
YEAR(date) | 返回日期date的年份 | SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) | 返回時間time的小時值 | SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) | 返回時間time的分鐘值 | SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) | 返回日期參數date1和date2之間相隔的天數 | SELECT DATEDIFF(NOW(), '2008-8-8'); 返回:2881 |
ADDDATE(date,n) | 計算日期參數date加上n天后的日期 | SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |
例:
SELECT CURDATE()#獲取當前日期
SELECT CURTIME()#獲取當前時間
SELECT NOW()#獲取當前日期和時間
SELECT WEEK(NOW())#返回日期爲一年中的第幾周
SELECT YEAR(NOW())#返回日期的年份
SELECT HOUR(NOW())#返回時間的小時數
SELECT MINUTE(NOW())#返回時間的分鐘數
SELECT DATEDIFF(NOW(),'2020-8-8')#返回兩個日期之間的相隔的天數
SELECT ADDDATE(NOW(),100)#計算日期參數now加上100天后的日期
4.數學函數
函數名 | 作用 | 舉例 |
CEIL(x) | 返回大於或等於數值x的最小整數 | SELECT CEIL(2.3) 返回:3 |
FLOOR(x) | 返回小於或等於數值x的最大整數 | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0-1的隨機數 | SELECT RAND() 返回:0.5525468583708134 |
例:
SELECT CEIL(2.3)#返回大於或等於數值爲2.3的最小整數
SELECT FLOOR(2.3)#返回小於或等於數值爲2.3的最大整數
SELECT RAND()#返回0-1之間的隨機數
五、1.ORDER BY子句
ORDER BY 子句實現按一定順序顯示查詢結果(ASC:升序 DESC:降序)
例:把成績都降低10%後加5分,再查詢及格成績,並按照成績從高到低排序
SELECT studentNo AS '學生編號',`studentResult`*(1-0.1)+5 AS '綜合成績'
FROM `result`
WHERE `studentResult`*(1-0.1)+5>=60
ORDER BY `studentResult` DESC
執行命令得
2.LIMIT子句
MySQL查詢語句中使用LIMIT子句限制結果集 (做分頁)
語法:SELECT <字段名列表>
FROM <表名或視圖>
[WHERE <查詢條件>]
[GROUP BY <分組的字段名>]
[ORDER BY <排序的列名>[ASC 或 DESC]]
[LIMIT [位置偏移量,]行數]; / LIMIT ((頁數-1)*條數),條數;
例如:
SELECT studentNo AS '學生編號',`studentResult`*(1-0.1)+5 AS '綜合成績'
FROM `result`
WHERE `studentResult`*(1-0.1)+5>=60
ORDER BY `studentResult` DESC
LIMIT 2,3#從數據的第二行開始讀取三行
執行命令得
練習:
查詢所有年級密碼爲123的學員信息,按學號升序排序
顯示每頁2條
顯示第2頁,即從第3條數據開始顯示2條數據
SELECT studentNo AS '學生編號',`studentName` AS '姓名',`phone` AS '電話'
FROM `student`
WHERE `loginPwd`=123
ORDER BY `studentNo`
LIMIT 2,2
執行命令得
不加LIMIT句子
加上LIMIT句子
3.子查詢
子查詢是一個潛逃在SELECT 、INSERT、UPDATE、或DELETE語句或其他子查詢中的查詢
子查詢在WHERE語句中的一般用法
語法:SELECT...FROM 表名 WHERE 字段 比較運算符 (子查詢)
注意:
將子查詢和比較運算符聯合使用,必須保證子查詢返回的值不能多於一個
例:編寫SQL語句,查看年齡比'黃小平'曉得學生,要求顯示這些學生的信息
分析:
第一步:查詢得到'黃小勇'的出生日期
第二步:利用where語句,篩選出生日期比'黃小平'大的學生
(此方法爲父查詢)
通過子查詢實現
SELECT *
FROM `student`
WHERE `bornDate`>(
SELECT `bornDate` FROM `student` WHERE `studentName`='黃小平'
)
執行命令得
練習1
需求說明
1.查詢2016年2月17日考試前5名的學員的學號和分數
2.將所有女學生按年齡從大到小排序,從第2條記錄開始顯示6名女學生的姓名、年齡、出生日期、手機號信息
3.按出生年份分組統計學生人數,將各組中人數達到2人的年份和人數顯示出來
4.查詢參加2016年2月17日考試的所有學員的最高分、最低分、平均分
1.
SELECT `studentNo`,`studentResult`
FROM `result`
WHERE `examDate`='2016-02-17 00:00:00'
2.
SELECT `studentName` AS '姓名',`bornDate` AS '年齡',`phone` AS '手機'
FROM `student`
ORDER BY `bornDate`
LIMIT 1,6
3.
SELECT YEAR(bornDate)AS 年份, COUNT(studentNo) AS 人數
FROM student
GROUP BY 年份
HAVING 人數>2
4.
SELECT MAX(`studentResult`),MIN(`studentResult`),AVG(`studentResult`)
FROM `result`
WHERE `examDate`='2016-02-17 00:00:00'
練習2
<1>查詢參加最近一次Logic Java考試成績的學生的最高分和最低分
#查詢參加最近一次Logic Java考試成績的學生的最高分和最低分
SELECT MAX(studentResult),MIN(studentResult)
FROM result
WHERE examDate=(SELECT MAX(examDate)
FROM result
WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'))
AND `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')
執行命令得
IN子查詢
常用IN替換等於(=)的子查詢
IN後面的子查詢可以返回多條記錄 (IN 相當於 or的操作)
<2>查詢“Logic Java”課程考試成績爲60分的學生名單
#查詢“Logic Java”課程考試成績爲60分的學生名單
SELECT *
FROM student
WHERE studentNo IN (SELECT studentNo
FROM result
WHERE studentResult=60
AND subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')
)
執行命令得
<3>查詢參加“Logic Java”課程最近一次考試的在讀學生名單
實現步驟:
1.獲得“Logic Java”課程的課程編號
2.根據課程編號查詢得到“Logic Java”課程最近一次的考試日期
3.根據課程編號和最近一次的考試日期查詢出學生編號
4.獲得“Logic Java”課程的在讀年級編號
SELECT *
FROM student
WHERE gradeID=(SELECT gradeID FROM `subject` WHERE subjectName='Logic Java' )#Logic Java的在讀年級編號
AND studentNo IN (
SELECT studentNo
FROM result
WHERE subjectNo=(#最近一次Logic Java考試的學生編號
SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')#Logic Java的課程編號
AND examDate=(SELECT MAX(examDate)
FROM result
WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'))#最近一次考試時間
)
執行命令得
NOT IN 子查詢
<4>查詢未參加“Logic Java”課程最近一次考試的在讀學生名單
SELECT *
FROM student
WHERE gradeID=(SELECT gradeID FROM `subject` WHERE subjectName='Logic Java' )#Logic Java的在讀年級編號
AND studentNo NOT IN (
SELECT studentNo
FROM result
WHERE subjectNo=(#最近一次Logic Java考試的學生編號
SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java')#Logic Java的課程編號
AND examDate=(SELECT MAX(examDate)
FROM result
WHERE `subjectNO`=(SELECT subjectNo FROM `subject` WHERE subjectName='Logic Java'))#最近一次考試時間
)
<5>查詢獲得年級名稱是S1的所有課程的課程編號根據課程編號查詢課程表得到課程名稱
SELECT `subjectName` FROM `subject` WHERE `gradeId` IN (
SELECT `gradeId` FROM `grade` WHERE `gradeName`='S1'
)