MySQl的基本命令


第1次課
-- 01.啟動mysql服務 使用管理員身份啟動cmd
net start mysql
-- 02.關閉服務
net stop mysql
-- 03.連接mysql數據庫 如果是本機 可以省略 -h ip地址 -p和密碼不能有空格
mysql -h ip地址 -u用戶名 -p密碼
-- 04.退出數據庫
exit


-- 05.查詢當前所有的數據庫
show databases;
系統默認的四個數據庫
information_schema:存放的是一些數據庫對象信息,包含:用戶表信息,字段信息,字符集信息等!
performance_schema:存放的是數據庫的性能參數信息!
mysql:存放的系統用戶權限信息!
test:數據庫管理系統默認創建的測試數據庫!任何用戶都可以使用!


-- 06.sql(結構化查詢語言)
01.DDL(數據定義語言) create drop alter
02.DQL(數據查詢語言) select
03.DML(數據操作) insert delete update
04.DCL(數據控制語言) commit rollback grant revoke

-- 07.邏輯運算符
and or not

-- 08.創建數據庫
CREATE DATABASE t12;
SHOW DATABASES;
-- 09.切換數據庫
USE t12;
-- 10.刪除數據庫
DROP DATABASE t12;


-- 11.創建表 反引號` 是用來區分mysql中的關鍵字
-- ZEROFILL:不足位數使用0代替!超過位數,實際顯示!
CREATE TABLE `test_01`(
tid INT(4) ZEROFILL
);

-- 新增數據
INSERT INTO test_01(tid) VALUES(20);
INSERT INTO test_01 VALUES(2000);
INSERT INTO test_01 VALUES(20000);

-- 12.默認int是有符號的 可以取負數
CREATE TABLE `test_02`(
tid INT(4)
);

-- 同時插入多條記錄 負數可以插入
INSERT INTO test_02 VALUES(20),(1234),(-123456)

-- UNSIGNED 無符號的 只能是整數 包含0
CREATE TABLE `test_03`(
tid INT(4) UNSIGNED
);

-- 同時插入多條記錄 負數不可以插入
INSERT INTO test_03 VALUES(20),(1234),(-123456)


-- 刪除測試的三個表
DROP TABLE test_01;
-- 13. 字符串類型
-- 01.char 固定長度的字符串
CREATE TABLE test_01(
NAME CHAR(20)
);
INSERT INTO test_01 VALUES('哈哈')
-- 最后一個 啊 會被自動截斷! 因為字符串超出了規定長度
INSERT INTO test_01 VALUES('哈哈啊')

-- 02.varchar 可變長度的字符串
CREATE TABLE test_02(
NAME VARCHAR(2)
);
-- 最后一個 啊 會被自動截斷! 因為字符串超出了規定長度
INSERT INTO test_02 VALUES('哈哈啊')

-- 看不出區別
-- char(20)默認就已經開辟了20個空間
-- varchar(20)開辟了實際使用的空間

-- 14.日期格式
-- DATE : YYYY-MM-DD
-- DATETIME: YYYY-MM-DD HH:MM:SS
-- TIMESTAMP: YYYY-MM-DD HH:MM:SS 1970年1月1日開始的 !首選!
-- TIME : HH:MM:SS
-- YEAR : YYYY

-- 15.創建表
-- creat table [if not exists] 表名(
-- 字段1 數據類型 [字段屬性][約束][索引][注釋],
-- 字段2 數據類型 [字段屬性][約束][索引][注釋]
-- )[表類型][表字符集][注釋];

-- 16.字段的約束和屬性
-- 01.非空約束 not null 字段不允許為空
-- 02.默認約束 default 字段的默認值
-- 03.唯一約束 unique key(字段名稱) uk
-- 設置字段是唯一的不允許重復,可以為空,但是只能有一個空值
-- 04.主鍵約束 primary key(字段名稱) pk
-- 設置表中的主鍵,唯一標識該行!
-- 05.外鍵約束 foreign key(字段名稱) fk
-- 建立在從表中,用於關聯兩個表之間的關系
-- 需要指定引用了主表中的哪個字段
-- 06.自動增長 auto_increment
-- 設置字段自動增長,默認從1開始!通常設置在主鍵上!
-- 07.注釋 COMMENT 給字段增加解釋
CREATE TABLE IF NOT EXISTS student(
sid INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT COMMENT '學生編號',
sname VARCHAR(20) NOT NULL COMMENT '學生姓名',
sage INT(3) NOT NULL DEFAULT 20 COMMENT '學生年齡'
);


-- 新增數據
INSERT INTO student(sname,sage) VALUES('小黑',DEFAULT);
INSERT INTO student(sid,sname,sage) VALUES(2,'小黑2',DEFAULT);
-- 如果指定了主鍵的值,就是指定的! 下次的自增沖動指定的值開始!
INSERT INTO student(sid,sname,sage) VALUES(789,'小黑3',DEFAULT);


-- 查詢剛剛插入數據的主鍵
INSERT INTO student(sname,sage) VALUES('小黑4',DEFAULT);
SELECT @@identity;


第2次課
-- 切換到指定的數據庫
USE t12
-- 創建Student表
CREATE TABLE IF NOT EXISTS student(
studentNo INT(4) PRIMARY KEY COMMENT '學號',
loginPwd VARCHAR(20) NOT NULL COMMENT '密碼',
studentName VARCHAR(50) NOT NULL COMMENT '姓名',
sex CHAR(2) NOT NULL DEFAULT '男' 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='學生表';


兩種方式備份和導入數據
01.使用dbms
02.cmd命令行工具 前提 必須配置了mysql環境變量
備份: mysqldump -u用戶名 -p 數據庫名稱 >路徑
備份指定的表:mysqldump -u用戶名 -p 數據庫名稱 表名1 表名2 >路徑
恢復: mysql -u用戶名 -p 數據庫名稱< 路徑 --必須存在數據庫

 

-- 創建年級表
CREATE TABLE IF NOT EXISTS grade(
gradeId INT(4) PRIMARY KEY COMMENT '年級編號',
gradeName VARCHAR(20) NOT NULL COMMENT '年級名稱'
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='年級表';


-- 查詢本數據庫中下所有的表
SHOW TABLES;

-- 查看表的結構
DESC student;

-- 刪除表
DROP TABLE IF EXISTS 表名

-- 修改表名 alter table 舊表名 rename [to] 新表名
ALTER TABLE student RENAME [TO] stu;
-- 添加字段
-- alter table 表名 add 字段名稱 屬性
ALTER TABLE student ADD age INT(3) NOT NULL COMMENT '年齡';
-- 修改字段 alter table 表名 change 舊字段 新字段 屬性
ALTER TABLE student CHANGE age ages INT(4) NOT NULL;
-- 刪除字段 alter table 表名 drop 字段名稱
ALTER TABLE student DROP ages;

-- mysql系統幫助文檔
help 查詢內容(命令);

-- 添加主鍵
ALTER TABLE 表名 ADD CONSTRAINT pk_studentNo主鍵名稱
PRIMARY KEY 表名(主鍵字段)

-- 創建外鍵約束 必須在從表中創建
ALTER TABLE 從表名稱 ADD CONSTRAINT
fk_student_grade外鍵約束名稱 FOREIGN KEY(從表的外鍵字段)
REFERENCES 主表名稱(主鍵)

-- 給student表中增加外鍵
並且設置 刪除是為 cascade
-- 新增grade表中3條信息
INSERT INTO grade VALUES(1,'1年級'),(2,'2年級'),(3,'3年級');
-- 查詢表中所有的記錄
SELECT * FROM grade;
-- 刪除年級編號為1的記錄 的時候,對應的所有學生 也被刪除了
DELETE FROM grade WHERE gradeid=1;
並且設置 刪除是為 set null!

-- 查詢所有的存儲引擎
SHOW ENGINES
-- 查看當前默認的存儲引擎
SHOW VARIABLES LIKE 'storage_engine%';
-- 修改存儲引擎
-- 修改my.ini配置文件 default- storage-engine=InnoDB
-- 重啟服務

--修改指定表中的存儲引擎
alter table 表名 engine=引擎

-- MyISAM類型的標文件
01.*.frm 表結構的定義文件
02.*.MYD 數據文件
03.*.MYI 索引文件
-- InnoDB類型的標文件
01.*.frm 表結構的定義文件
02.*.ibd 數據文件
-- datadir地址下會有一個ibdata1:存儲了所有InnoDB類型表中的數據!

 


-- 查詢student表中所有的數據
SELECT * FROM student;

-- update 表名 set 字段1=值1,字段2=值2 [where 條件]

-- 修改所有學生的密碼 為 admin
UPDATE student SET loginPwd='admin'
-- 修改學生編號為2的密碼 為 admins
UPDATE student SET loginPwd='admins'
WHERE studentNo=2

-- 刪除數據 delete from 表名 [where 條件]
DELETE FROM student;

-- 刪除學生編號為2的數據
DELETE FROM student
WHERE studentNo=2;

-- truncate table 表名!

-- delete 和truncate的區別
01.delete可以加條件
02.truncate只能刪除表中所有的數據
03.delete刪除之后可以恢復數據
04.truncate不能恢復數據!慎用!
05.truncate指定速度比delete快!
06.truncate語句刪除后將重置自增列!其他結構不變!

-- 創建學生課程表 subject
CREATE TABLE IF NOT EXISTS `subject`(
subjectNo INT(4) PRIMARY KEY AUTO_INCREMENT COMMENT '課程編號',
subjectName VARCHAR(50) NOT NULL COMMENT '課程名稱',
classHour INT(4) COMMENT '學時',
gradeId INT(4) COMMENT '年級編號'
)COMMENT='課程表';

 

-- 查詢student表中所有的數據
SELECT studentName,address FROM student;

-- 按照課時的大小 進行降序排列
-- asc:默認值!升序 desc:降序
SELECT * FROM `subject`
ORDER BY classHour DESC
-- 查詢年級編號為1的課程,並且按照課時升序排列
SELECT * FROM `subject`
WHERE gradeId=1
ORDER BY classHour ASC
-- 查詢年級編號為1的課程,並且按照課時升序排列的同時
-- 按照課程編號在降序排列
SELECT * FROM `subject`
WHERE gradeId=1
ORDER BY classHour ASC,subjectNo DESC

-- 使用別名 as
-- select 字段[as] 別名 from 表名
-- 查詢課程名稱 和 課時
SELECT subjectName AS '課程名稱',classHour AS '課時'
FROM `subject`


-- 合並列
01. +的數據類型 必須一致
02. +的如果是字符類型,拼接字符串
03. +的是數值類型,就是求和!
SELECT * FROM student
-- 學生姓名和地址 進行合並
SELECT (studentNo+','+gradeId ) AS '整合體'
FROM student


-- 查詢電話號碼為空的行 is null
SELECT * FROM student
WHERE phone IS NULL
-- 查詢電話號碼不為空的行 is not null
SELECT * FROM student
WHERE phone IS NOT NULL

第3次課
-- 聚合函數
-- 查詢表中一共有多少條記錄
SELECT COUNT(*) FROM student
-- 查看表中指定字段不為空的記錄
SELECT COUNT(phone) FROM student
-- 查詢年齡最大的數據
SELECT MAX(age) FROM student
-- 查詢年齡最小的數據
SELECT MIN(age) FROM student
-- 求所有年齡的平均值
SELECT AVG(age) FROM student
-- 求所有年齡之和
SELECT SUM(age) FROM student


-- 字符串函數
-- 字符串的連接
SELECT CONCAT('My','S','ql');
-- 字符串替換 下標從1開始
SELECT INSERT('大家辛苦了!',1,3,'哈哈');
-- 字符串的截取 下標從1開始
SELECT SUBSTRING('大家辛苦了!',1,3);
-- 字符串變大 小 寫
SELECT LOWER('AAA');
SELECT UPPER('aaa');

-- 常用的時間和日期函數
-- 01.獲取當前的日期
SELECT CURDATE();
-- 02.獲取當前的時間
SELECT CURTIME();
-- 03.獲取當前的日期和時間
SELECT NOW();
-- 04.返回日期是一年中的第幾周
SELECT WEEK(NOW());
-- 05.只獲取年
SELECT YEAR(NOW());
-- 06.只獲取小時
SELECT HOUR(NOW());
-- 07.獲取兩個日期差
SELECT DATEDIFF(NOW(),'2017-03-07');
-- 08.返回現在的時間加上某個時間之后的日期
SELECT ADDDATE(NOW(),24);


-- 數學函數
SELECT CEIL(3.1); -- 天花板函數
SELECT FLOOR(3.9);
SELECT RAND(); -- 0-1之間的隨機數


-- 把所有的成績降低10%后加5分,再查詢及格成績
-- 並且按照成績 降序排列
SELECT studentNo AS '學號',(studentResult*0.9+5) AS '成績'
FROM result
WHERE (studentResult*0.9+5)>=60
ORDER BY '成績' DESC


-- 查詢所有年級編號為1 的學生信息,並且按照 學號升序排列
-- 01. 顯示前4條記錄
SELECT * FROM student
WHERE gradeid=1
ORDER BY studentno
LIMIT 4
-- 02. 每頁顯示4條 顯示第2頁的內容
SELECT * FROM student
WHERE gradeid=1
ORDER BY studentno
LIMIT 4,4
-- 需要注意的是:第一條記錄的是 0!
-- limit a,b
-- a:從那一條記錄開始
-- b:每頁顯示多少條數據


-- 將學生表中學號為20000的學生郵箱改成stu@20000.163.com
-- 密碼改成000
UPDATE student SET email='stu@20000.163.com',loginpwd='000'
WHERE studentNo=20000

-- 將科目表中課時數大於200的並且年級編號是1的課時減少10!
UPDATE `subject` SET classHour=classHour-10
WHERE classHour>=200 AND gradeid=1

-- 將所有年級編號是1的學生姓名,性別,出生日期,手機號碼
-- 都保存到一個新的表中 student_new
CREATE TABLE IF NOT EXISTS student_new(
SELECT studentName,sex,bornDate,phone FROM student
WHERE gradeid=1
)


-- 01.查詢2016年2月17日考試 前5名的學員的學號和分數
SELECT studentNo 學號,studentResult 分數 FROM result
WHERE examDate='2016-02-17'
ORDER BY 分數 DESC
LIMIT 5

-- 02. 將所有女學生按年齡從大到小排序
-- 從第2條記錄開始顯示6名女學生的姓名、年齡、出生日期、手機號信息
SELECT studentName 姓名,(YEAR(NOW())-YEAR(bornDate)) 年齡,
bornDate 出生日期,phone 手機號碼 FROM student
WHERE sex='女'
ORDER BY 年齡 DESC
LIMIT 1,6

-- 03.按出生年份分組統計學生人數
-- 將各組中人數達到2人的年份和人數顯示出來

SELECT YEAR(bornDate) 出生年份, COUNT(studentNo) 人數
FROM student
GROUP BY 出生年份
HAVING 人數>=2

-- 04.查詢參加2016年2月17日考試的所有學員的最高分、最低分、平均分。
SELECT MAX(studentResult) 最高分,MIN(studentResult) 最低分,
AVG(studentResult) 平均分 FROM result
WHERE examDate='2016-02-17'


5. select 字段1,字段2....
1. from 表名
2. where 條件1 and 條件2
3. group by 分組依據
4. having 分組條件
6. order by 排序字段
7. limit 分頁


-- 查詢grade和student所有的數據
SELECT * FROM student,grade
13+4
13*4
-- 笛卡爾積
-- 怎么解決這個問題? 找出兩個表中關聯的字段
SELECT * FROM student,grade
WHERE student.`gradeId`=grade.`gradeId`

 


-- 查詢出 年齡比 李斯文 小的學生信息
-- 01.先查詢李斯文的年齡 1993-07-23
SELECT bornDate FROM student WHERE studentName='李斯文'
-- 02.把查詢出來的結果當成條件繼續查詢
SELECT bornDate FROM student
WHERE bornDate>'1993-07-23'
-- 疑問? 能不能把兩個sql合並在一起執行
-- 我們就把 '1993-07-23'當成一個java中的變量名
-- 指向了01的sql
STRING a="521";
Stirng b=a+"125";
syso(b)
syso(a+"125")

 

-- 使用子查詢來實現
-- 子查詢就是一個嵌套在select,insert,update或者delete語句或者
-- 其他查詢語句中的查詢語句!
-- 語法: select ... from 表 where 字段 比較運算符(子查詢)
SELECT bornDate FROM student
WHERE
bornDate>(SELECT bornDate FROM student WHERE studentName='李斯文')
-- 子查詢和比較運算符聯合使用的使用,必須保證子查詢返回的值是不能多於一個!


-- 查詢出 最近一次java課程 考試成績的最高分和最低分
-- 01.時間是最大的 最高分和最低分 result
-- 02.java課程 subject

-- 分析 分解書寫
-- 01.先獲取課程java的編號
SELECT subjectNo 學號 FROM `subject`
WHERE
subjectName='java'

-- 02.最近java課程 的考試日期
SELECT MAX(examDate) 考試日期,MAX(studentResult) 最高分,
MIN(studentResult) 最低分 FROM result
WHERE subjectNo=1

-- 03.最近的日期
SELECT MAX(examDate) FROM result

-- 使用子查詢
SELECT MAX(examDate) 考試日期,MAX(studentResult) 最高分,
MIN(studentResult) 最低分 FROM result
WHERE subjectNo=(SELECT subjectNo 學號 FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result) -- 日期是最近的!


-- 查詢java課程考試成績為60的學生姓名
-- 01.先找java的課程編號
SELECT subjectNo 學號 FROM `subject`
WHERE
subjectName='java'

-- 02.找java的成績是60的
SELECT studentResult 成績 FROM result
WHERE studentResult=60
AND subjectNo=(SELECT subjectNo 學號 FROM `subject` WHERE subjectName='java')

-- 03.找學生編號 student 怎么和 result表關聯的???
SELECT studentNo 編號 FROM result
WHERE studentResult=60
AND subjectNo=(SELECT subjectNo 學號 FROM `subject` WHERE subjectName='java')

-- 使用IN替換=之后的子查詢
-- IN后面的子查詢語句可以返回多條結果
SELECT studentName 姓名 FROM student
WHERE studentNo IN
(SELECT studentNo 編號 FROM result
WHERE studentResult=95
AND subjectNo=(SELECT subjectNo 學號 FROM `subject` WHERE subjectName='java'))


-- 查詢學生姓名是張秋麗的信息
SELECT * FROM student WHERE studentName='張秋麗'
-- 查詢學生姓名是張秋麗 或者 肖梅 的信息
SELECT * FROM student WHERE studentName='張秋麗' OR studentName='肖梅'

-- 查詢學生姓名是張秋麗 或者 肖梅 再 或者是 王寶寶 的信息
SELECT * FROM student WHERE studentName='張秋麗'
OR studentName='肖梅' OR studentName='王寶寶'

-- 使用IN替換 多個條件
SELECT * FROM student WHERE studentName IN ('張秋麗','肖梅','王寶寶')

-- 使用NOT IN
-- 查詢出 沒有參加最近一次java課程考試的學生姓名以及編號
SELECT studentName 姓名,studentNo 編號 FROM student
WHERE studentNo NOT IN
(
SELECT studentNo FROM result
WHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
)


第4次課
-- EXISTS : select ... from 表名 where exists(子查詢)
-- 子查詢有返回結果 exists(子查詢)返回true 外層查詢執行
-- 子查詢沒有返回結果 exists(子查詢)返回false 外層查詢不執行

-- 檢查Java課程最近一次考試。
-- 如果有成績達到80分以上者,則顯示分數排在前5名學員的學號和分數


-- 01.查詢java課程的編號
SELECT subjectNo FROM `subject`
WHERE subjectName='java'
-- 02.上面的當成一個條件 繼續查詢 result
SELECT * FROM result WHERE subjectNo=(SELECT subjectNo FROM `subject`
WHERE subjectName='java')
-- 拿到了java所有的考試信息
-- 03. 再次拿到最近考試的時間
SELECT MAX(examDate) FROM result
-- 04.再把03當成條件 拼接查詢02
SELECT * FROM result WHERE subjectNo=(SELECT subjectNo FROM `subject`
WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
-- 05.如果成績有大於80的 查詢出前5名
SELECT * FROM result WHERE
studentResult>80 AND
subjectNo=(SELECT subjectNo FROM `subject`
WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)


-- 06.整體放在exists中 並增加條件
SELECT studentNo 學號,studentResult 分數 FROM result
WHERE EXISTS
(
SELECT * FROM result WHERE
studentResult>80 AND
subjectNo=(SELECT subjectNo FROM `subject`
WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
)
AND subjectNo=(SELECT subjectNo FROM `subject`
WHERE subjectName='java')
ORDER BY studentResult DESC LIMIT 5;


-- 檢查java課程最近一次考試成績
-- 如果全部未通過考試(60分及格),認為本次考試偏難,計算的該次考試平均分加5分
-- not exists

-- 01.查詢java課程的編號
SELECT subjectNo FROM `subject` WHERE subjectName='java'
-- 02.查詢考試成績 01的結果是1
SELECT studentResult FROM result WHERE
subjectNo=1
-- 03. 合並 12
SELECT studentResult FROM result WHERE
subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
-- 04.獲取最近一次考試的時間
SELECT MAX(examDate) FROM result
-- 05. 合並 34
SELECT studentResult FROM result WHERE
subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
-- 06. 獲取成績小於60的
SELECT studentResult FROM result WHERE
subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
AND studentResult>60
-- 07.如果都沒及格 06沒有結果集
SELECT AVG(studentResult)+5 平均分 FROM result
WHERE NOT EXISTS
(
SELECT studentResult FROM result WHERE
subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)
AND studentResult>60
)
AND subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName='java')
AND examDate=(SELECT MAX(examDate) FROM result)

 

-- 如果有1年級的學生
-- 就查詢參加2年級學科考試的學員學號、科目編號、考試成績,考試時間

-- 01.查詢有沒有1年級的學生 student表
SELECT * FROM student WHERE gradeId=
(SELECT gradeId FROM grade WHERE gradeName='1年級')

-- 02.查詢2年級下面的學科
SELECT subjectNo FROM `subject`
WHERE gradeId=(SELECT gradeId FROM grade WHERE gradeName='2年級')

-- 03.整體的結果
SELECT studentNo 學號,subjectNo 科目編號,studentResult 考試成績,
examDate 考試時間 FROM result
WHERE EXISTS(
SELECT * FROM student WHERE gradeId=
(SELECT gradeId FROM grade WHERE gradeName='1年級')
)
AND subjectNo IN
(SELECT subjectNo FROM `subject`
WHERE gradeId=(SELECT gradeId FROM grade WHERE gradeName='2年級'))

-- 使用子查詢的注意事項
-- 01.任何允許使用表達式的地方都可以使用子查詢
-- 02.只出現在子查詢中但是沒有在父查詢中出現的列,結果集中的列不能包含!


-- 為每個學生制作在校期間每門課程的成績單
-- 要求每個學生參加每門課程的最后一次考試成績作為該生本課程的最終成績
-- 成績單的數據項 學生姓名 課程所屬的年級名稱 課程名稱 考試日期 考試成績
SELECT studentName 學生姓名,
(SELECT gradeName FROM grade WHERE gradeId=`subject`.`gradeId`) 課程所屬的年級名稱,
subjectName 課程名稱 , examDate 考試日期 ,studentResult 考試成績
FROM result r1
INNER JOIN student ON r1.`studentNo`=student.`studentNo`
INNER JOIN `subject` ON r1.`subjectNo`=`subject`.`subjectNo`
WHERE r1.`examDate` IN
(SELECT MAX(examDate) FROM result r2
WHERE r1.`subjectNo`=r2.`subjectNo`
GROUP BY r2.`subjectNo`
)

 

-- 隱式內連接
SELECT studentName 學生姓名,gradeName 年級名稱
FROM student,grade
WHERE student.`gradeId`=grade.`gradeId`


-- 顯式內連接
SELECT studentName 學生姓名,gradeName 年級名稱,subjectName 課程名稱
FROM student
INNER JOIN grade
ON student.`gradeId`=grade.`gradeId`

 

-- 統計每門課程平均分各是多少 分組

SELECT subjectNo 課程編號,AVG(studentResult)
FROM result
GROUP BY subjectNo
-- 平均分在60分以上的
SELECT subjectNo 課程編號,AVG(studentResult) 平均分
FROM result
GROUP BY subjectNo
HAVING 平均分>=60

-- 並按照平均成績 升序排列
SELECT subjectNo 課程編號,AVG(studentResult) 平均分
FROM result
GROUP BY subjectNo
HAVING 平均分>=60
ORDER BY 平均分

-- 統計每個年級的 男,女人數
-- 拿到 年級編號 性別 人數

SELECT gradeId 年級編號 , sex 性別 , COUNT(studentNo) 人數
FROM student
GROUP BY gradeId,sex

-- 內連接 inner join
-- 外連接
01.左外連接 left join
02.右外連接 right join

 

-- 拿到student 和 年級表的數據
-- 獲取學生編號 學生姓名 年級名稱

SELECT studentNo ,studentName,gradeName
FROM student INNER JOIN grade
ON student.`gradeId`=grade.`gradeId`

SELECT studentNo ,studentName,gradeName
FROM student,grade
WHERE student.`gradeId`=grade.`gradeId`


-- 三表聯查
-- 查詢學生姓名,學生成績 ,課程名稱
SELECT studentName 學生姓名,studentResult 學生成績,subjectName 課程名稱
FROM student s
INNER JOIN result r ON s.`studentNo`=r.`studentNo`
INNER JOIN `subject` j ON r.`subjectNo`=j.`subjectNo`


-- 左外連接 以左表為准,如果右表中沒有對應的數據 ,則右表返回null
-- 查詢所有學生的成績 和姓名
SELECT DISTINCT(studentName) 姓名, studentResult 成績
FROM student
LEFT JOIN result ON result.`studentNo`=student.`studentNo`

-- 右外連接 以右表為准,如果左表中沒有對應的數據 ,則左表返回null
SELECT DISTINCT(studentName) 姓名, studentResult 成績
FROM student RIGHT JOIN result
ON result.`studentNo`=student.`studentNo`

-- 把查詢的語句 存入到 臨時表中
-- 臨時表只有當前的鏈接可見 隨連接的關閉自動刪除
-- 臨時表的更改不會影響到真表
CREATE TEMPORARY TABLE haha(SELECT studentName FROM student)
SELECT * FROM haha

第5次課
事務:
模擬 銀行轉賬!

-- 創建數據庫
CREATE DATABASE myBank;
-- 切換指定的數據庫
USE myBank;
-- 創建表
CREATE TABLE IF NOT EXISTS bank(
customerName VARCHAR(10) NOT NULL COMMENT '用戶名',
currentMoney DECIMAL(10,2) NOT NULL COMMENT '賬戶余額'
);
-- 插入數據
INSERT INTO bank VALUES('小黑',50000),('小白',500000);


-- 小黑 給小白 轉賬10000
-- 修改兩條數據
-- 01.小黑-10000
-- 02.小白+10000


UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
-- 故意寫錯字段名稱 讓02 報錯
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';

-- 開啟事務 START TRANSACTION 或者 BEGIN
-- 01.02 為一個事務
BEGIN
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoneysss=currentMoney+10000
WHERE customerName='小白';
-- 事務回滾 ROLLBACK
-- 提交事務 COMMIT

UPDATE bank SET currentMoney=500000
WHERE customerName='小黑';
-- 證明mysql是默認提交事務的!

SET autocommit=0(關閉事務自動提交) | 1(開啟事務自動提交)

-- 關閉事務自動提交
SET autocommit=0;

BEGIN; -- 開啟事務
UPDATE bank SET currentMoney=currentMoney-10000
WHERE customerName='小黑';
UPDATE bank SET currentMoney=currentMoney+10000
WHERE customerName='小白';
COMMIT; -- 手動提交事務
UPDATE bank SET currentMoney=10000;
ROLLBACK; -- 事務回滾

SET autocommit=1; -- 恢復自動提交


-- 事務隔離級別
出現的不正常問題:
01.更新丟失
02.臟讀
03.不可重復讀
001.虛讀
002.幻讀

為了保證並發讀取數據的正確性,引入了事務隔離級別!
01.
讀未提交(Read Uncommitted):
允許臟讀取,但不允許更新丟失。
如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,
但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。

 

-- 查詢mysql中默認的事務隔離級別 可重復讀取 禁止臟讀
SELECT @@tx_isolation;

-- 修改事務隔離級別 為 讀未提交
SET tx_isolation='read-uncommitted';
SET tx_isolation='repeatable-read';

UPDATE bank SET currentMoney=100
WHERE customerName='小黑';

 


-- 視圖 是一張虛擬的表
01.表示一張表的部分數據或者是多張表的綜合數據!
02.結構和數據都是建立在對真表的查詢基礎之上的!
03.視圖中存放的數據其實就是對真實表的引用!
對視圖中的數據進行添加,更新刪除都會影響到真實的表!
04.一個真實的表可以創建N個視圖!
05.如果視圖關聯了多表,不允許增 刪!單表可以增刪改
06.視圖一般都是使用查詢!

-- 創建一個視圖 只獲取 學生姓名 編號 以及考試成績
CREATE VIEW view_student_result
AS
SELECT s.studentNo 學生編號,studentName 學生姓名,
studentResult 考試成績
FROM student s,result r
WHERE s.`studentNo`=r.`studentNo`
-- 查詢視圖中的內容
SELECT * FROM view_student_result
-- 查詢mysql數據庫中所有的視圖
SELECT * FROM information_schema.views;
-- 刪除視圖
DROP VIEW view_student_result;

-- 創建一個表的視圖 學生姓名,地址,手機號
CREATE VIEW view_student
AS
SELECT studentName 學生姓名,address 地址,phone 手機號
FROM student

-- 查詢視圖

SELECT * FROM view_student

-- 索引:是一種有效組合數據的方式!目的就是快速或者某個記錄!
提高了數據庫的檢索速度!

mysql索引按存儲類型分2種:
01.B-樹索引(BTREE):INNODB,MyISAM 支持
02.哈希索引


01.普通索引:允許在定義為索引的列中 出現 重復值和空值!
02.唯一索引:索引列不允許出現重復值,但是可以出現一個空值!
03.主鍵索引:創建主鍵的時候,系統會默認創建一個主鍵索引!唯一!不能為空!
04.復合索引:將我們的多個列組合起來!(name,sid)姓名和身份證號!
05.全文索引:允許值的全文查詢!允許空值和重復值!適合在一個內容比較多的列!text!
06.空間索引:對空間數據類型的列建立的索引!


-- 查詢指定表的索引
SHOW INDEX FROM student;
TABLE:索引所在的表
Non_unique:索引是否唯一 0:唯一 1:不唯一
key_name:索引名稱
seq_in_index:該列在索引中的位置
column_name:定義所用的列名稱
null:該列是否為空
index_type:索引類型


-- 給姓名增加 普通索引
CREATE INDEX index_studentName
ON student(studentName);

-- 給學生姓名和身份證號 增加 組合索引
CREATE INDEX index_name_sid
ON student(studentName,identityCard)


-- 刪除索引
DROP INDEX index_name_sid ON student;

DROP INDEX index_studentName ON student;

-- 創建索引的原則
01.經常被查詢的列
02.經常用作選擇的列
03.經常排序,分組的列
04.經常用作連接的列(主鍵/外鍵)


使用索引時的注意事項:
01.查詢時減少使用*返回全部的列,不要返回不需要的列!
02.索引盡量要小,在字節數小的列上建立索引!
03.where字句中有多個條件表達式的時候,包含索引的列要放在其他表達式之前!
04.在order by的字句中避免使用表達式!


數據庫的設計

三大范式:






 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM