10記錄資料庫
阿新 • • 發佈:2022-12-04
資料庫:DB(DataBase)
1.概念
顧名思義,就是資料倉庫
作用:儲存、管理資料
2.分類
1.關係型資料庫 :SQL(Structured Query Language)
- MySQL、Oracle、SQLServer、SQLlite
- 表單形式
2.非關係型資料庫:NoSQL(Not Only SQL)
- Redis、MongoDB
- 鍵值對形式
基本命令
所有的語句都要以分號結尾
show databases; --展示當前所有的資料庫 use 資料庫名; --開啟指定的資料庫 show tables; --檢視所有的表 desc 表名; --顯示錶的資訊 create database 資料庫名; --建立一個數據庫 exit; --退出資料庫
操作資料庫
1.建立資料庫
create database 資料庫名; --(前提)判斷是否存在,以下同理
2.刪除資料庫
drop database 資料庫名;
3.使用資料庫
use 資料庫名
4.檢視資料庫
show database;
資料庫表
c建立一個學生表
CREATE TABLE IF NOT EXISTS `student`( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號', `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' 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
注意點
:
- 表名和欄位儘量使用``括起來
- AUTO_INCREMENT 代表自增
- 所有的語句後面加逗號,最後一個不加
- 字串使用單引號括起來
- 主鍵的宣告一般放在最後,便於檢視
- 不設定字符集編碼的話,會使用MySQL預設的字符集編碼Latin1,不支援中文,可以在my.ini裡修改
DML語言
```Data Manipulation Luaguge`:資料操作語言``
1.新增insert
-- 普通用法 INSERT INTO `student`(`name`) VALUES ('zsr'); -- 插入多條資料 INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女'); -- 省略欄位 INSERT INTO `student` VALUES (5,'Bareth','123456','男','2000-02-04','武漢','[email protected]',1);
語法
INSERT INTO 表名([欄位1,欄位2..])VALUES('值1','值2'..),[('值1','值2'..)..];
注意:
- 欄位和欄位之間使用英文逗號隔開
- 欄位是可以省略的,但是值必須完整且一一對應
- 可以同時插入多條資料,VALUES後面的值需要使用逗號隔開
2.修改update
-- 修改學員名字,指定條件
UPDATE `student` SET `name`='zsr204' WHERE id=1;
-- 不指定條件的情況,會改動所有表
UPDATE `student` SET `name`='zsr204';
-- 修改多個屬性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1;
-- 通過多個條件定位資料
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';
語法
UPDATE 表名 SET 欄位1=值1,[欄位2=值2...] WHERE 條件[];
3. 刪除 delete
-- 刪除資料(避免這樣寫,會全部刪除)
DELETE FROM `student`;
-- 刪除指定資料
DELETE FROM `student` WHERE id=1;
語法
delete from 表名 [where 條件]
DQL查詢資料
```Data QueryLanguage` 資料查詢語言``
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 聯合查詢
[WHERE ...] -- 指定結果需滿足的條件
[GROUP BY ...] -- 指定結果按照哪幾個欄位來分組
[HAVING] -- 過濾分組的記錄必須滿足的次要條件
[ORDER BY ...] -- 指定查詢記錄按一個或多個條件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查詢的記錄從哪條至哪條
- 查詢資料庫資料 , 如SELECT語句
- 簡單的單表查詢或多表的複雜查詢和巢狀查詢
- 是資料庫語言中最核心,最重要的語句
- 使用頻率最高的語句
前提配置
-- 建立學校資料庫
CREATE DATABASE IF NOT EXISTS `school`;
-- 用school資料庫
USE `school`;
-- 建立年級表grade表
CREATE TABLE `grade`(
`GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年級編號',
`GradeName` VARCHAR(50) NOT NULL COMMENT '年紀名稱',
PRIMARY KEY (`GradeID`)
)ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- 給grade表插入資料
INSERT INTO `grade`(`GradeID`,`GradeName`)
VALUES (1,'大一'),(2,'大二'),(3,'大三'),(4,'大四');
-- 建立成績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;
-- 給result表插入資料
INSERT INTO `result`(`StudentNo`,`SubjectNo`,`ExamDate`,`StudentResult`)
VALUES (1000,1,'2019-10-21 16:00:00',97),(1001,1,'2019-10-21 16:00:00',96),
(1000,2,'2019-10-21 16:00:00',87),(1001,3,'2019-10-21 16:00:00',98);
-- 建立學生表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 '聯絡電話,允許為空,即可選輸入',
`Adress` 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;
-- 給學生表插入資料
INSERT INTO `student`(`StudentNo`,`LoginPwd`,`StudentName`,`Sex`,`GradeID`,`Phone`,`Adress`,`BornDate`,`Email`,`IdentityCard`)
VALUES (1000,'1241','dsaf',1,2,'24357','unknow','2000-09-16 00:00:00','[email protected]','809809'),
(1001,'1321','dfdj',0,2,'89900','unknow','2000-10-16 00:00:00','[email protected]','908697');
-- 建立科目表
CREATE TABLE `subject`(
`SubjectNo` INT(11) NOT NULL AUTO_INCREMENT COMMENT '課程編號',
`SubjectName` VARCHAR(50) DEFAULT NULL COMMENT '課程名稱',
`ClassHour` INT(4) DEFAULT NULL COMMENT '學時',
`GradeID` INT(4) DEFAULT NULL COMMENT '年級編號',
PRIMARY KEY (`SubjectNo`)
)ENGINE=INNODB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
-- 給科目表subject插入資料
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeID`)
VALUES(1,'高數','96',2),(2,'大物','112',2),(3,'程式設計',64,3);
SELECT 欄位 FROM 表;
基礎查詢
語法:
SELECT 查詢列表 FROM 表名;
- 查詢列表可以是:表中的(一個或多個)欄位,常量,變數,表示式,函式
- 查詢結果是一個虛擬的表格
-- 查詢全部學生
SELECT * FROM student;
-- 查詢指定的欄位
SELECT `LoginPwd`,`StudentName` FROM student;
-- 別名 AS(可以給欄位起別名,也可以給表起別名)
SELECT `StudentNo` AS 學號,`StudentName` AS 學生姓名 FROM student AS 學生表;
-- 函式 CONCAT(str1,str2,...)
SELECT CONCAT('姓名',`StudentName`) AS 新名字 FROM student;
-- 查詢系統版本(函式)
SELECT VERSION();
-- 用來計算(計算表示式)
SELECT 100*53-90 AS 計算結果;
-- 查詢自增步長(變數)
SELECT @@auto_increment_increment;
-- 查詢有哪寫同學參加了考試,重複資料要去重
SELECT DISTINCT `StudentNo` FROM result;
條件查詢
where 條件字句:檢索資料中符合條件的值
語法:
select 查詢列表 from 表名 where 篩選條件;
-- 查詢考試成績在95~100之間的
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`>=95 AND `StudentResult`<=100;
-- &&
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`>=95 && `StudentResult`<=100;
-- BETWEEN AND
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`BETWEEN 95 AND 100;
-- 查詢除了1000號以外的學生
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentNo`!=1000;
-- NOT
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT `StudentNo`=1000;
-- 查詢名字含d的同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentName` LIKE '%d%';
-- 查詢名字倒數第二個為d的同學
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentName` LIKE '%d_';
-- 查詢1000,1001學員
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentNo` IN (1000,1001);
分組查詢
語法:
select 分組函式,分組後的欄位
from 表
【where 篩選條件】
group by 分組的欄位
【having 分組後的篩選】
【order by 排序列表】
區別:
使用關鍵字 | 篩選的表 | 位置 | |
---|---|---|---|
分組前篩選 | where | 原始表 | group by的前面 |
分組後篩選 | having | 分組後的結果 | group by 的後面 |
-- 查詢不同科目的平均分、最高分、最低分且平均分大於90
-- 核心:根據不同的課程進行分組
SELECT SubjectName,AVG(StudentResult),MAX(`StudentResult`),MIN(`StudentResult`)
FROM result r
INNER JOIN `subject` s
on r.SubjectNo=s.SubjectNo
GROUP BY r.SubjectNo
HAVING AVG(StudentResult)>90;
連線查詢
目前記錄左連線、右連線、內連線
-- 查詢學員所屬的年級(學號,學生姓名,年級名稱)
SELECT `StudentNo`,`StudentName`,`GradeName`
FROM student s
INNER JOIN grade g
ON s.GradeID=g.GradeID;
-- 查詢科目所屬的年級
SELECT `SubjectName`,`GradeName`
FROM `subject` s
INNER JOIN `grade` g
ON s.GradeID=g.GradeID;
-- 查詢列參加程式設計考試的同學資訊(學號,姓名,科目名,分數)
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
on s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
on r.SubjectNo=sub.SubjectNo
where SubjectName='課程設計';
排序與分頁
排序
語法
select 查詢列表
from 表
where 篩選條件
order by 排序列表 asc/desc --說明desc倒序,預設升序
分頁
語法
select 查詢列表
from 表
limit offset,pagesize;
- offset代表的是起始的條目索引,預設從0開始
- size代表的是顯示的條目數
-- 第一頁 limit 0 5
-- 第二頁 limit 5,5
-- 第三頁 limit 10,5
-- 第n頁 limit (n-1)*pagesize,pagesize
-- pagesize:當前頁面大小
-- (n-1)*pagesize:起始值
-- n:當前頁面
-- 資料總數/頁面大小=總頁面數
-- limit n 表示從0到n的頁面
子查詢
本質:在 where
子句中巢狀一個子查詢語句
-- 查詢‘課程設計’的所有考試結果(學號,科目編號,成績)降序排列
-- 方式一:使用連線查詢
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM result r
INNER JOIN `subject` s
on r.StudentNo=s.SubjectNo
WHERE SubjectName='課程設計'
ORDER BY StudentResult DESC;
-- 方式二:使用子查詢(由裡到外)
SELECT StudentNo,SubjectNo,StudentResult
from result
WHERE SubjectNo=(
SELECT SubjectNo FROM `subject`
WHERE SubjectName='課程設計'
)
MySQL函式
1. 常用函式
-- 數學運算
SELECT ABS(-8); -- 絕對值
SELECT CEIL(5.1); -- 向上取整
SELECT CEILING(5.1); -- 向上取整
SELECT RAND(); -- 返回0~1之間的一個隨機數
SELECT SIGN(-10); -- 返回一個數的符號;0返回0;正數返回1;負數返回-1
-- 字串函式
SELECT CHAR_LENGTH('我喜歡你'); -- 字串長度
SELECT CONCAT('我','喜歡','你'); -- 拼接字串
SELECT INSERT('我喜歡',1,1,'超級') -- INSERT(str,pos,len,newstr) 從str的pos位置開始替換為長度為len的newstr
SELECT UPPER('zsr'); -- 轉大寫
SELECT LOWER('ZSR'); -- 轉小寫
SELECT INSTR('zsrs','s'); -- 返回第一次出現字串索引的位置
SELECT REPLACE('加油就能勝利','加油','堅持'); -- 替換出現的指定字串
SELECT SUBSTR('堅持就是勝利',3,6); -- 返回指定的字串(源字串,擷取位置,擷取長度)
SELECT REVERSE('rsz'); -- 反轉字串
-- 時間日期函式
SELECT CURRENT_DATE(); -- 獲取當前日期
SELECT CURDATE(); -- 獲取當前日期
SELECT now(); -- 獲取當前時間
SELECT LOCALTIME(); -- 本地時間
SELECT SYSDATE(); -- 系統時間
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
-- 系統資訊
SELECT SYSTEM_USER();
SELECT USER();
SELECT VERSION();
2. 聚合函式
函式 | 描述 |
---|---|
max | 最大值 |
min | 最小值 |
sum | 和 |
avg | 平均值 |
count | 計算個數 |
SELECT COUNT(StudentName) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(1) FROM student;
SELECT SUM(`StudentResult`) FROM result;
SELECT AVG(`StudentResult`) FROM result;
SELECT MAX(`StudentResult`) FROM result;
SELECT MIN(`StudentResult`) FROM result;
事務
要麼都成功,要麼都失敗
例子:銀行轉賬 張三給李四轉1000塊錢
事務四大特性
原子性、一致性、隔離性、永久性
未完待續...