數據庫學習----MySQL(一)

一、初識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、安裝步驟
  1. 將下載好的軟件包解壓到自己想安裝的目錄下,如:E:\Environment\mysql-5.7.19
  2. 添加環境變量:
    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
  1. 啓動管理員模式下的CMD,然後切換目錄到MySQL下的bin,再輸入 mysqld –install 進行安裝

  2. 再輸入mysqld --initialize-insecure --user=mysql初始化數據文件

  3. 然後輸入net start mysql再次啓動 mysql 再使用命令mysql –u root –p 進入mysql管理界面(密碼可爲空)

  4. 進入頁面後更改root密碼:
    update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
    再輸入flush privileges;刷新權限

  5. 將第2步中的 my.ini 文件中的skip-grant-tables 刪掉

  6. 重啓mysql即可正常使用 net stop mysql ; net start mysql

安裝完成正常使用的界面:
在這裏插入圖片描述

Sqlyog安裝

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'
   )
)

以上就是MySQL的基礎知識,從瞭解數據庫到操作數據庫,以及數據庫的數據查詢操作,這些都是MySQL的基本要求,下一節還會學習MySQL的函數、事務、索引、權限管理等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章