1. MySQL數據庫
phpstudy 數據庫服務器及圖形化軟件 軟件鏈接
鏈接:https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw
提取碼:xl3k
數據庫對于我們前端同學來說,就是一個了解。
對于不會變化的數據(省、市、縣),我們可以保存到json文件中。
對于經常變化的數據,我們建議保存到數據庫中。
1.1 什么是數據庫
數據庫 (database) 是用來組織、存儲和管理數據的倉庫。 當今世界是一個充滿著數據的互聯網世界,充斥著大量的數據。數據的來源有很多,比如出行記錄、消費記錄、
瀏覽的網頁、發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。
為了方便管理互聯網世界中的數據,就有了數據庫管理系統的概念(簡稱:數據庫)。用戶可以對數據庫中的數 據進行新增、查詢、更新、刪除等操作。
- 增刪改查
- 新增
- 刪除
- 修改
- 查詢
1.2 常見的數據庫及分類
市面上的數據庫有很多種,最常見的數據庫有如下幾個:
- MySQL 數據庫(目前使用最廣泛、流行度最高的的開源免費數據庫;)
- Oracle 數據庫(收費)
- SQL Server 數據庫(收費)
- Mongodb 數據庫(Community + Enterprise)
其中,MySQL、Oracle、SQL Server 屬于傳統型數據庫(又叫做:關系型數據庫 或 SQL 數據庫),這三者的 設計理念相同,用法比較類似。
而 Mongodb 屬于新型數據庫(又叫做:非關系型數據庫 或 NoSQL 數據庫),它在一定程度上彌補了傳統型 數據庫的缺陷。
1.3 MySQL簡介
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下產品
我們常說數據庫,其實只是一個泛指。那么數據庫的結構是怎樣的呢?
- 數據庫服務器
- 數據庫(一般來說,一個項目,都會使用一個獨立的數據庫)
- 數據表(真正存儲數據的地方)
- 行與列(每一行代表一條數據。列又叫做字段)
- 數據表(真正存儲數據的地方)
- 數據庫(一般來說,一個項目,都會使用一個獨立的數據庫)
真正存儲數據的是數據表。數據表和我們見過的Excel表格結構基本相同。
數據表的結構和excel一模一樣。
id(不允許重復) | name | age | sex | tel |
---|---|---|---|---|
1 | 王宇 | 23 | 男 | 13200008888 |
2 | 王宇 | 23 | 男 | 13300008888 |
3 | 裴志博 | 25 | 男 | 18866669999 |
… | … | … | … | … |
2 安裝MySQL
MySQL 服務器軟件 ---- 存儲數據,可以創建數據庫、數據表
MySQL圖形化管理工具 — 可以使用它管理(創建、增刪改查等等)數據庫
2.1 安裝MySQL服務軟件
安裝wampserver
安裝過程,略
2.2 安裝操作MySQL的圖形化工具(Navicat)
圖形化的管理工具,有很多種
- mysql-workbeach(英文版,沒有中文版)
- Navicat
前面已經安裝了MySQL軟件。那么我們如何管理或者說使用它呢,對于我們來說,還需要安裝一個管理MySQL的工具,它就是 Navicat
。
MySQL服務和圖形化工具的關系
安裝過程略,但要記住你的安裝目錄。
破解:將補丁中的 “navicat.exe” 復制到你的安裝目錄中,覆蓋原理的文件即可
3 Navicat使用
3.1 連接到MySQL服務器
3.2 創建數據庫
3.3 創建數據表
比如創建一個學生信息表:
id(不允許重復) | name | age | sex | tel |
---|---|---|---|---|
1 | 王宇 | 23 | 男 | 13200008888 |
2 | 王宇 | 24 | 男 | 13300008888 |
3 | 裴志博 | 25 | 男 | 18866669999 |
… | … | … | … | … |
對于一張表,最重要的是表頭的設計
對于數據庫中的數據表,最重要的設計也是表頭,只不過在數據庫中
把表頭叫做字段
。
名(表頭) | 類型 | 長度 | 不是null | 鍵 | 其他 |
---|---|---|---|---|---|
id | int | √ | 🗝 | 勾選自動遞增 | |
name | varchar | 10 | √ | ||
age | int | ||||
sex | char | 1 |
-
id – 自動遞增 – √
-
最后保存,填表名
student
。 -
其他補充點
- 數據庫中的數字類型
- tinyint -128~127
- smallint -65535 ~ 65535
- int -21億 ~ 21億
- bigint 更大
- 數據庫中的字符串類型
- varchar - 變長字符串類型
- char - 定長字符串類型
- 數據庫中的數字類型
3.4 導入導出數據表
-
導出
- 在數據表名字上,比如
student
上,右鍵 --> 轉儲SQL文件 --> 結構和數據,選擇保存位置保存即可。
- 在數據表名字上,比如
-
導入
- 在數據庫名上面 --> 右鍵 --> 運行SQL文件 --> 選擇SQL文件,運行即可完成導入。
- 導入注意事項,表名不能重復。
SQL語句(重點)
SQL(英文全稱:Structured Query Language)是結構化查詢語言,專門用來訪問和處理數據庫的編程語言。
三個關鍵點
- SQL 是一門數據庫編程語言
- 使用 SQL 語言編寫出來的代碼,叫做 SQL 語句
- SQL 語言只能在關系型數據庫(例如 MySQL、Oracle、SQL Server)中使用。非關系型數據庫(例如 Mongodb) 不支持 SQL 語言
SQL能做什么
- 從數據庫中查詢數據
- 向數據庫中插入新的數據
- 更新數據庫中的數據
- 從數據庫刪除數據
- 可以創建新數據庫
- 可在數據庫中創建新表
- 可在數據庫中創建存儲過程、視圖
- etc…
4. 數據查詢
語法格式:
- SQL語句,
不區分
大小寫。
-- 基本的查詢語法
SELECT 字段1,字段2,... FROM 表名
select 字段,字段,.... from 表名-- 查詢所有的字段
SELECT * FROM 表名-- 帶條件的查詢
SELECT * FROM 表名 [WHERE 條件] [ORDER BY 排序字段[, 排序字段]] LIMIT [開始位置,]長度.....
4.1 基本查詢
格式: select 字段名1, 字段名2,… from 表名
案例1: 查詢所有英雄的姓名和昵稱
select name,nickname from heroes
案例2: 查詢全部英雄的全部信息
select * from heroes
4.2 帶where子句的查詢
select field1, field2… from 表名 查詢表中的所有數據
where 可以使用條件來篩選查詢出的結果
-- 查詢id小于10的英雄
-- select * from heroes where 條件
-- select * from heroes where id<10-- 查詢id小于20的女英雄
-- select * from heroes where id<20 and sex='女'-- 查詢年齡大于等于20小于等于30的英雄
-- select * from heroes where age>=20 and age<=30
-- select * from heroes where age between 20 and 30
4.3 模糊查詢
通配符:
-
%: 代表任意長度(包括0)的任意字符
-
_: 代表1位長度的任意字符
like: 在執行模糊查詢時,必須使用like來作為匹配條件
-- 查詢名字中帶有 “斯” 的英雄
-- select * from heroes where name like '%斯%'-- 查詢名字的最后一個字是 “斯” 的英雄
-- select * from heroes where name like '%斯'-- 查詢名字中帶有 “斯” ,并且要求 “斯”前面只能有一個字的英雄
select * from heroes where name like '_斯%'
4.34 統計查詢
- max 查詢最大值
select max(age) from heroes
- Min 查詢最小值
select min(age) from heroes
- avg 查詢平均值
select avg(age) from heroes
- sum 查詢總和(查詢所有英雄的年齡之和)
select sum(age) from heroes
- count 查詢總記錄數(查詢共計有多少個英雄)
select count(*) cc from heroes
-- 查詢所有英雄中年齡最大的的年齡
-- select max(age) from heroes-- 查詢所有英雄中年齡最小的的年齡
-- select min(age) from heroes-- 查詢所有英雄年齡的平均值
-- select avg(age) from heroes-- 查詢所有英雄的年齡之和
-- select sum(age) from heroes-- 查詢共計有多少個英雄
-- select count(*) from heroes-- 查詢共計有多少英雄,用cc表示
-- select count(*) cc from heroes
4.4 查詢結果排序
order by 可以對查詢結果按某個字段進行升序或者降序排列
- 升序 asc (默認值)
- 降序 desc
可進行排序的字段通常是 整型 英文字符串型 日期型 (中文字符串也行,但一般不用)
-- select * from heroes order by 排序字段 asc/desc
-- asc 默認值,可以省略,表示升序
-- desc,表示降序-- 查詢所有的英雄,按年齡升序排序
-- select * from heroes order by age asc
-- select * from heroes order by age-- 查詢所有的英雄,按年齡降序排序
-- select * from heroes order by age desc-- 查詢所有的英雄,先按年齡降序排序;如果年齡相同的,再按id降序排序
-- select * from heroes order by age desc, id desc-- 查詢年齡大于50歲的英雄,并按年齡降序排序
select * from heroes where age>50 order by age desc
注意:如果SQL語句中,有where和order by,where一定要放到order by之前。
4.5 限制查詢結果
limit 用來限制查詢結果的起始點和長度
- 格式: limit start, length
- start: 起始點。 查詢結果的索引,從0開始。 0代表第一條數據。如果省略start,則默認表示從0
- length: 長度
-- 查詢所有英雄中前5個英雄
-- select * from heroes limit 起始位置, 長度
-- select * from heroes limit 0, 5
-- select * from heroes limit 5-- 查詢所有英雄中,第6到10個英雄
-- select * from heroes limit 5, 5-- 查詢年齡最大的3個英雄
-- select * from heroes order by age desc limit 3-- 查詢年齡最大的3個女英雄
select * from heroes where sex='女' order by age desc limit 3
注意:where、order by、limit如果一起使用,是有順序的,where在最前面、其次是order by、limit要放到最后。另外三者之間沒有and之類的。
4.6 小結
- 控制查詢的列數
- select 字段, 字段, … from heroes ---- 選擇查詢指定的列
- select * from heroes ---- 查詢所有的列
- 控制查詢的行數
- where 條件
- where id>3
- where id>3 and age<30
- where id<3 or sex=‘男’
- where name like ‘%斯%’
- order by 字段 排序規則
- order by age asc
- order by age desc
- limit 起始位置, 長度
- limit 0, 3 相當于 limit 3
- limit 3, 3
- where 條件
select 字段 from 表名 [where 條件] [order by 排序字段 排序規則] [limit 起始位置,長度]
select count(*) as total from 表名 – 查詢總記錄數
5. 添加數據
基本的格式: insert into 表名 …
方式一:指定字段和值,只要字段和值對應即可。和順序無關
insert into heroes (字段, 字段, ...) values (值, 值, ...)
insert into heroes (nickname, age, name) values ('虛空恐懼', 98, '科加斯')
方式二:和順序有關,因為沒指定字段,所以值必須是所有的值,而且順序和表中字段的順序要一致
insert into heroes values (null, '拉克絲', '光輝女郎', '女', 28)
方式三:使用set里設置新數據的值,沒有順序關系
insert into heroes set 字段=值, 字段=值, ....
insert into heroes set name='李青', nickname='盲僧'
6. 修改數據
格式:
update 表名 set 字段1=值1, 字段2=值2,... where 修改條件
修改表中的哪一條(幾條)數據的 字段1=值1…
不指定修改條件會修改所有的數據
-- 加條件修改
update heroes set age=28, skill='在地上打滾' where id=19
-- 如果不指定條件,則會修改所有的行
update heroes set sex='妖'
7. 刪除數據
格式: delete from 表名 where 刪除條件
注意:不指定條件將刪除所有數據
-- delete from heroes where id=19
-- 不加條件,將刪除所有的數據,危險操作
-- delete from heroes
drop table stu; – 刪除stu表
drop database heroes – 刪除庫,加入反引號可以防止出現問題,否則MySQL可能會將70當做關鍵字或其他意思解釋
小結
- 添加
- insert into 表名 set 字段=值, 字段=值, 字段=值, …
- 更新
- update 表名 set 字段=值, 字段=值, 字段=值 where 條件
- 刪除
- delete from 表名 where 條件
8. node中的mysql模塊
8.1 mysql模塊的作用
mysql模塊是一個第三方模塊,專門用來操作MySQL數據庫。 可以執行增刪改查操作。
# 如果前面沒有安裝過其他模塊,需要先初始化
npm i mysql
curd: 就代表數據庫的增刪改查
c: create 就是添加 (增)
u: update 就是修改 (改)
r: read 就是查詢 (查)
d: delete 就是刪除 (刪)
8.2 mysql模塊的使用步驟
在Node中使用MySQL模塊一共需要5個步驟:
-
加載 MySQL 模塊
-
創建 MySQL 連接對象
-
連接 MySQL 服務器
-
執行SQL語句
-
關閉鏈接
// 1. 加載mysql模塊
const mysql = require('mysql');
// 2. 創建連接對象(設置連接參數)
const conn = mysql.createConnection({// 屬性:值host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong'
});// 3. 連接到MySQL服務器
conn.connect();// 4. 完成查詢(增刪改查)
/*
conn.query(SQL語句, [SQL中占位符的值], (err, result, fields) => {err: 錯誤信息result: 查詢結果fields: 當前查詢過程中涉及到的字段信息,一般用不著
});
*/// 5. 關閉連接,釋放資源
conn.end();
8.3 基本的增刪改查
基本的查詢
執行查詢類型的SQL語句,查詢結果(result)是一個數組,數組的每個單元是對象,每個對象就是一條記錄,對象的屬性是數據表的字段名
// 1. 加載mysql
const mysql = require('mysql');// 2. 創建連接對象(填寫連接參數)
const conn = mysql.createConnection({host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong',multipleStatements: true // 表示可以一次性執行多條SQL
})// 3. 連接到MySQL服務器
conn.connect();// 4. 完成查詢
// conn.query(SQL語句, 給占位符的值, 回調函數);/// 4.1 基本的查詢
conn.query('select * from heroes limit 2', (err, result) => {if (err) throw err;console.log(result);
});// 5. 關閉連接
conn.end();
執行增刪改語句
要完成增刪改操作,只需要將SQL語句換成增刪改語句即可。
對于增刪改語句,返回的result是一個表示SQL執行結果的對象。其主要屬性如下:
- insertId 添加時有該屬性,表示新增數據的id
- affectedRows 受影響行數,表示受影響的行數。增刪改的時候都有該屬性
- changRows 改變的行數,修改操作的時候,會有該屬性
// 1. 加載mysql
const mysql = require('mysql');// 2. 創建連接對象(填寫連接參數)
const conn = mysql.createConnection({host: 'localhost',port: 3306,user: 'root',password: '',database: 'yingxiong',multipleStatements: true // 表示可以一次性執行多條SQL
})// 3. 連接到MySQL服務器
conn.connect();// 4. 完成查詢
// conn.query(SQL語句, 給占位符的值, 回調函數);/// 4.2 增刪改
conn.query('delete from heroes where id = 1', (err, result) => {if (err) throw err;console.log(result);
});// 5. 關閉連接
conn.end();
8.4 占位符模式的增刪改查
什么是占位符
SQL中的“?” 就是占位符。比如
select * from heroes where id > ?
insert into heroes set ?
update heroes set ? where id = ?
delete from heroes where id = ?
如何為占位符傳值
當SQL語句中使用了占位符,則query方法需要使用參數2為這些占位符傳遞實際的值。并且不同的 “?” 需要的值格式也不同。具體要符合下面三種要求:
-
SQL中有 1 個占位符,則query方法的第二個參數設置為一個值
-
SQL中有 多 個占位符,則query方法的第二個參數設置為數組,數組中的值按順序分別傳遞給每個占位符
-
SQL中,如果
字段=值,字段=值...
使用 “?” 站位了,則需為這個 “?” 傳遞一個對象,形式如下:let val = {// 字段: 值name: '壓縮',nickname: '疾風劍豪',// 其他... }
有占位符的增刪改查
// 例子一:查詢id小于3的英雄
let sql = 'select * from heroes where id < ?';
conn.query(sql, 3, (err, result) => {if (err) throw err;console.log(result);
});
// 例子二:查詢id小于3的女英雄
let sql = 'select * from heroes where id < ? and sex = ?';
conn.query(sql, [3, '女'], (err, result) => {if (err) throw err;console.log(result);
});
// 例子三:SQL中的 "字段=值, 字段=值..."的位置使用了一個占位符,則需為該占位符傳遞一個對象
// 如果SQL語句中有 字段=值, 字段=值, .... 可以使用一個 ? 表示;并且要為這個問號傳遞一個對象
let sql = 'insert into heroes set ?';
let values = {// 字段: 值name: '艾克',nickname: '時間刺客',age: 34
};
conn.query(sql, values, (err, result) => {if (err) throw err;// console.log(result);if (result.affectedRows > 0) {console.log('添加成功,最新添加的id為:' + result.insertId);} else {console.log('添加失敗');}
});
// 例子四:
// SQL中有兩個占位符,所以要傳遞一個數組
// 第1個問號表示 “字段=值, 字段=值...”,所以為這個問號傳遞一個對象
let sql = 'update heroes set ? where id = ?';
let values = {skill: '時光倒流',sex: '男'
}
conn.query(sql, [values, 36], (err, result) => {if (err) {console.log('修改失敗');} else {console.log('修改成功');}
});