一、初識MySql
1、爲什麼要學習數據庫
- 公司業務需求,崗位要求
- 用來存儲數據信息
- 大數據時代,數據庫是基本要求
- 數據庫也是所有軟件體系中的核心存在
2、什麼是數據庫(DataBase)?
- 數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”,是一個長期存儲在計算機內的、有組織的、有共享的、統一管理的數據集合。
- 數據庫是以一定方式儲存在一起、能與多個用戶共享、具有儘可能小的冗餘度、與應用程序彼此獨立的數據集合,可視爲電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。
3、數據庫的分類
關係型數據庫:(Sql)
- 通過表和表之間的關係進行存儲的數據,如學生信息表,成績表;
- 常見的關係型數據庫:MySql、Oracle、Sql Sever、DB2等
非關係型數據庫
- 非關係型數據庫存儲對象,由對象自身的屬性決定;
- 常見的非關係型數據庫:Redis、MongoDB。
4、什麼是MySql?
MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件之一。
MySQL所使用的 SQL 語言是用於訪問數據庫的最常用標準化語言。 一般中小型網站和大型網站的開發都選擇 MySQL 作爲網站數據庫。
二、MySQL安裝、Sqlyog安裝
命令行安裝MySQL步驟
1、下載軟件
64位安裝軟件下載鏈接
根據自己的電腦配置下載相關的軟件包
2、安裝步驟
- 將下載好的軟件包解壓到自己想安裝的目錄下,如:E:\Environment\mysql-5.7.19
- 添加環境變量:
1、打開自己電腦的環境變量配置;
2、選擇Path,在後面加上MySQL中的bin文件夾的路徑;
3、E:\Environment\mysql-5.7.19下新建 my.ini 文件;
4、編輯新建的 my.ini 文件,將其中路徑切換爲自己的文件路徑;
[mysqld]
basedir=E:\Environment\mysql-5.7.19\
datadir=E:\Environment\mysql-5.7.19\data\
port=3306
character-set-server=utf8
skip-grant-tables
-
啓動管理員模式下的CMD,然後切換目錄到MySQL下的bin,再輸入
mysqld –install
進行安裝 -
再輸入
mysqld --initialize-insecure --user=mysql
初始化數據文件 -
然後輸入
net start mysql
再次啓動 mysql 再使用命令mysql –u root –p 進入mysql
管理界面(密碼可爲空) -
進入頁面後更改root密碼:
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
再輸入flush privileges;
刷新權限 -
將第2步中的 my.ini 文件中的
skip-grant-tables
刪掉 -
重啓mysql即可正常使用
net stop mysql ; net start mysql
安裝完成正常使用的界面:
Sqlyog安裝
下載完成後正常安裝即可。
命令行連接數據庫
mysql -uroot -p123456
三、操作數據庫
1、 操作數據庫 – 操作數據庫中的表 – 操作數據表中的數據
1、創建數據庫
CREATE DATABASE `westos`;
2、刪除數據庫
DROP DATABASE `westos`;
3、使用數據庫
use `westos`;
4、查看所有的數據庫
SHOW DATABASES;
2、數據庫的列類型
數值
tinyint --特別小數據 1字節
smallint --較小的數據 2字節
int --標準的整數 4字節
bigint --較大的數據 8字節
float -- 單精度浮點數 4字節
double -- 雙精度浮點數 8字節
decimal --字符串形式的浮點數,一般用於金融計算
字符串
char --字符串大小固定 0-255字符
varchar --可變字符串 0-65535字符
tinytext --微型文本 2^8-1個字符
text --文本串 2^16-1個字符
時間日期格式
date --YYYY-MM-DD 日期格式
time --hh:mm:ss 時間格式
datetime --最常用的時間日期格式 YYYY-MM-DD hh:mm:ss
timestamp --時間戳 1970.1.1到現在經過的毫秒數
3、數據庫的字段屬性
Unsigned
- 無符號的整數
- 不能爲負數
zerofill
- 0填充
- 位數不足,0來填充,如:int(3),1 – 001
自增
- 自動在上一條記錄上加1
- 自增的字段必須是整數類型
非空
- not null,不填寫就會報錯
4、創建數據庫的數據表
創建一個school數據庫
創建student數據表
列屬性:id(10)name(20)sex(2)birthday(10)phone(20)
主鍵爲id,自增
-- 創建數據庫
CREATE DATABASE IF NOT EXISTS `school`;
-- 創建數據表
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '學號',
`name` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性別',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`phone` VARCHAR(15) DEFAULT NULL COMMENT '聯繫方式',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
創建數據表的格式
CREATE TABLE IF NOT EXISTS `表名` (
`字段名` 列類型 屬性 註釋,
......
)表類型 字符集設置 註釋
5、數據表的類型
- INNODB 默認使用類型
- MYISAM 早期使用的數據表類型
這兩個數據表的區別:
MYISAM | INNODB | |
---|---|---|
事務 | 不支持 | 支持 |
數據行鎖定 | 不支持 | 支持 |
外檢約束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空間大小 | 較小 | 較大,約爲MYISAM的兩倍 |
優點 | 節約空間,速度快 | 安全性高,可以處理事務、多表的用戶操作 |
數據表在物理空間的存儲位置
創建的所有數據庫都在安裝 MySQL 的目錄下的 data 文件夾中。
數據表的字符編碼
CHARSET=utf8
6、對數據表的修改和刪除
修改
-- 修改表名 格式:ALTER TABLE 原表名 RENAME AS 新表名
ALTER TABLE `teacher` RENAME AS `newteacher`;
-- 增加表中的字段 ALTER TABLE 表名 ADD 字段名 列屬性
ALTER TABLE `newteacher` ADD `age` INT(3);
-- 修改表的字段 ALTER TABLE 表名 MODIFY 字段名 列屬性
ALTER TABLE `newteacher` MODIFY `id` VARCHAR(15);
-- 修改字段的名字 ALTER TABLE 表名 CHANGE 原字段名 新字段名
ALTER TABLE `newteacher` CHANGE `id` `newid` INT(3);
-- 刪除表的字段 ALTER TABLE 表名 DROP 字段名
ALTER TABLE `newteacher` DROP `age`;
刪除
-- 刪除表
DROP TABLE IF EXISTS `newteacher`;
在所有的創建和刪除和刪除操作時加上判斷操作,以免程序報錯。
四、MySQL數據管理
1、外鍵
在創建外鍵的時候,增加外鍵約束
-- 創建年級表
CREATE TABLE `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年級id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年級名稱',
PRIMARY KEY (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 創建學生表,添加外鍵約束
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 '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '學生的年級',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
PRIMARY KEY(`id`),
-- 定義外鍵
KEY `FK_gradeid` (`gradeid`),
-- 給外鍵添加約束
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
創建表成功後,添加外鍵約束
-- 格式:ALTER TABLE 表名 ADD CONSTRAINT 約束名 FOREIGN KEY (外鍵的列) REFERENCES 哪個表(哪個字段)
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
2、DML語言(數據庫操作語言)
- insert(插入語句)
注意點:字段和字段之間要用英文逗號隔開;字段的名字是可以省略的,但後面的字段的值要和每個字段對應。
-- 插入一個字段
INSERT INTO `grade`(`gradename`)VALUES('大一');
-- 插入多個字段
INSERT INTO `grade`(`gradename`)VALUES('大二'),('大三');
INSERT INTO `student`(`name`)VALUES('lili');
INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES('heihei','123456','男');
INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES('zhangsan','789456','男'),('lisi','789123','nv');
- update(修改語句)
-- 修改字段的值,指定位置進行修改
UPDATE `student` SET `name`='zhaohang' WHERE `id`='1';
-- 如果不指定位置進行修改,會將所有的字段值全部修改
UPDATE `student` SET `name`='update';
-- 修改字段的多個屬性,用逗號隔開
UPDATE `student` SET `name`='zhangsan',`pwd`='01011110' WHERE `id`='1';
-- 通過where定位字段,可以設置區間或大於小於某個值。
- delete(刪除語句)
DELETE FROM `student` -- 不推薦這樣寫,會刪除數據表中所有的數據
DELETE FROM `student` WHERE id='4'; -- 指定字段進行刪除
-- TRUNCATE命令,清空一個數據庫的表,但表的結構和約束不會變
TRUNCATE `student`;
delete和truncate的相同和區別:
相同:都可以刪除數據,但不會破壞表的結構
區別:TRUNCATE 後表的自增會歸零,不會影響事務。
五、DQL數據查詢
1、DQL數據查詢語言(Data Query Language)
- 數據庫中所有的查詢操作都使用 SELECT
- 數據庫中最核心的語言和操作
- 使用頻率最高的操作
2、 指定字段查詢
-- 查詢所有的學生
SELECT *FROM `student`;
-- 指定查詢的字段
SELECT `StudentName`,`GradeId` FROM `student`;
-- 給查詢的字段結果起一個自定義別名進行查詢
SELECT `StudentName` AS '學生姓名' FROM `student`;
-- 拼接字符串函數concat()
SELECT CONCAT('姓名:',`StudentName`) `newname` FROM `student`;
查詢語法:SELCET 字段 FROM 數據表
查詢結果去重:如果查詢的結果出現重複的數據,只顯示一條
-- 去重查詢
SELECT DISTINCT `StudentNo` FROM `result`;
表達式
-- 查看系統版本
SELECT VERSION();
-- 計算數據
SELECT 1000*12-15464 AS 結果;
-- 計算自增的步長
SELECT @@auto_increment_increment;
3、where 指定條件進行查詢
獲取符合條件的數據
-- where 指定條件進行查詢
-- 查詢成績大於等於90的學生的學號和成績
SELECT `StudentNo`,`StudentResult`FROM `result` WHERE `StudentResult`>=90;
-- &&查詢
SELECT `StudentNo` FROM `student` WHERE `StudentNo`>1005&&`Sex`='1';
-- between and 區間查詢
SELECT DISTINCT `StudentNo` FROM `result` WHERE `StudentResult` BETWEEN '85' AND '90';
-- NOT和!=
SELECT `GradeId` FROM `student` WHERE NOT `StudentNo`='1000';
SELECT `GradeId` FROM `student` WHERE `StudentNo`!='1000';
4、Join 聯表查詢
連接方式 | 描述 |
---|---|
Inner Join | 如果表中至少有一個匹配,就返回該行 |
Left Join | 從左表中返回左右的值,即使右表中沒有匹配 |
Right Join | 從右表中返回所有的值,即使左表中沒有匹配 |
使用合適:
SELECT 字段1,字段2,...
FROM 第一個表
連接方式
ON 判斷條件
- Inner Join
-- 聯表查詢 參加了考試的同學的學號、姓名、科目編號、分數
/*
分析步驟:
1、分析查詢的字段來自那些表
2、確定使用那種查詢方式:
a、確定交叉點(這兩個表中的那些數據是相同的)
b、判斷的條件:學生表中的studentNo=成績表中的studentNo
*/
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` AS s
INNER JOIN `result` AS r
WHERE s.`StudentNo`=r.`StudentNo`;
- Left Join
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` s
LEFT JOIN `result` r
ON s.`StudentNo`=r.`StudentNo`;
- Right Join
SELECT s.`StudentNo`,`StudentName`,`SubjectNo`,`StudentResult`
FROM `student` s
RIGHT JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`;
案例:
查詢參加考試同學的信息(學號,姓名,科目名,分數)
思路:
1、分析要查詢的字段來自哪些表
2、確定使用哪種查詢方式
a、確定交叉點
b、判斷條件
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM `student` AS s
JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`
INNER JOIN `subject` AS sub
ON r.`SubjectNo`=sub.`SubjectNo`;
自連接:自己和自己連接
一張表當兩張表使用
-- 創表
CREATE TABLE `category` (
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主題id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主題名字',
PRIMARY KEY (`categoryid`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
-- 插入數據
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
VALUES('2','1','信息技術'),
('3','1','軟件開發'),
('4','3','數據庫'),
('5','1','美術設計'),
('6','3','web開發'),
('7','5','ps技術'),
('8','2','辦公信息');
-- 自連接
SELECT a.`categoryName` AS '父類',b.`categoryName` AS '子類'
FROM `category` a,`category` b
WHERE a.`categoryid`=b.`pid`;
執行結果:
5、分頁和排序
排序 :升序和降序
-- 排序 ORDER BY 降序DESC 升序ASC
select s.`StudentName`,`SubjectName`,`StudentResult`
from `student` as s
inner join `result` as r
on s.`StudentNo`=r.`StudentNo`
inner join `subject` as sub
on r.`SubjectNo`=sub.`SubjectNo`
where sub.`SubjectName`='高等數學-1'
order by `StudentResult` desc;
分頁
分頁的必要性: 緩解數據庫的壓力,給用戶以更好的體驗。
語法:
limit 起始值,頁面的容量
案例:
SELECT `SubjectName`,`GradeID`
FROM `subject`
LIMIT 0,5;
執行結果:
6、子查詢
子查詢的本質:在 WHERE 語句中在嵌套一條 SELECT 語句
案例:查詢 高等數學-1的所有考試結果(學號,科目編號,成績)
-- 方式一:使用連接查詢
SELECT r.`StudentNo`,r.`SubjectNo`,`StudentResult`
FROM `result` r
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE sub.`SubjectName`='高等數學-1'
ORDER BY r.`StudentResult` DESC;
-- 方式二:使用子查詢(執行順序從內向外)
SELECT `StudentNo`,`SubjectNo`,`StudentResult`
FROM `result`
WHERE `SubjectNO` = (
SELECT `SubjectNo` FROM `subject`
WHERE `SubjectName`='高等數學-1'
)
ORDER BY `StudentResult` DESC;
嵌套查詢:代碼量少,但較難理解
-- 嵌套查詢高等數學-1成績大於80分的學生的學號和姓名
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `StudentNo` IN (
SELECT `StudentNo` FROM `result` WHERE `StudentResult` > 80 AND `SubjectNo`=(
SELECT `SubjectNo` FROM `subject` WHERE `SubjectName`='高等數學-1'
)
)