1. 程式人生 > 其它 >10記錄資料庫

10記錄資料庫

資料庫: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'..)..];

注意

  1. 欄位和欄位之間使用英文逗號隔開
  2. 欄位是可以省略的,但是值必須完整且一一對應
  3. 可以同時插入多條資料,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塊錢

事務四大特性

原子性、一致性、隔離性、永久性

未完待續...