- 下載MySQL
- 終端執(zhí)行MySQL命令
- 會(huì)發(fā)現(xiàn)
command not found: mysql
- 因?yàn)镸ySQL沒(méi)有添加到環(huán)境變量中(如果想要在任意地方命令得到執(zhí)行 必須把命令添加到環(huán)境變量中)
- Mac添加環(huán)境變量:終端執(zhí)行
export PATH=$PATH:/usr/local/mysql/bin
- 會(huì)發(fā)現(xiàn)
終端連接MySQL
mysql -uroot -p********
- -u是user的縮寫(xiě)泽裳,后面跟著登錄的用戶名,這里是root(可以沒(méi)有空格)
- -p是password的縮寫(xiě) 后面跟著的是密碼(可以沒(méi)有空格)
或者可以mysql -uroot -p
然后回車,再輸入密碼
常見(jiàn)命令
show databases;
展示所有的數(shù)據(jù)庫(kù)(默認(rèn)會(huì)有四個(gè)數(shù)據(jù)庫(kù))
// 默認(rèn)數(shù)據(jù)庫(kù)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
information_schema:信息數(shù)據(jù)庫(kù)山橄。其中包括MySQL在維護(hù)的其他數(shù)據(jù)庫(kù)番官、表为障、列肴捉、訪問(wèn)權(quán)限等信息
performance_schema:性能數(shù)據(jù)庫(kù)鬓长。記錄著MySQL Server數(shù)據(jù)庫(kù)引擎在運(yùn)行過(guò)程中資源消耗相關(guān)的信息
mysql:用于存儲(chǔ)數(shù)據(jù)庫(kù)管理者的用戶信息核蘸、權(quán)限信息以及日志信息等
sys:相當(dāng)于是建議版的performance_schema巍糯,將性能數(shù)據(jù)庫(kù)中的數(shù)據(jù)匯總成更容易理解的形式啸驯;
create database 名稱;
:創(chuàng)建數(shù)據(jù)庫(kù)
select database();
:查看當(dāng)前使用的數(shù)據(jù)庫(kù),沒(méi)有選擇的話就是NULL
+------------+
| database() |
+------------+
| NULL |
+------------+
use 數(shù)據(jù)庫(kù)名;
:使用選擇的數(shù)據(jù)庫(kù)
show tables;
:查看當(dāng)前數(shù)據(jù)庫(kù)中有哪些表
create table users(
-> name varchar(10),
-> age int,
-> height double);
創(chuàng)建一張表祟峦,并指定表中字段以及類型罚斗。這里創(chuàng)建一個(gè)名為users的表,表中字段有name宅楞,age以及height针姿。
select * from 表名;
查詢表中所有的數(shù)據(jù)
insert into 表名 (字段1,字段2,...) vaules (vaule1,value2, ...);
:插入數(shù)據(jù)
insert into users (name, age, height) values ('lilei', 20, 1.88);
GUI工具
使用終端操作數(shù)據(jù)庫(kù)有很多不方便的地方厌衙,比如語(yǔ)句沒(méi)有高亮距淫、沒(méi)有任何提示、格式不美觀婶希,容易出現(xiàn)錯(cuò)誤等等榕暇。所以在開(kāi)發(fā)中可以使用一些GUI工具
常見(jiàn)的MySQL的GUI工具有很多,比如:Navivat(收費(fèi))饲趋,SQLYog(免費(fèi))拐揭,TablePlus(常用功能都可以使用,但有一些限制)
這里使用的是Navicat奕塑,下載安裝之后堂污,點(diǎn)擊左上角的連接,選擇MySQL龄砰,創(chuàng)建一個(gè)連接
創(chuàng)建之后雙擊我們創(chuàng)建的連接名盟猖,就可以連接到數(shù)據(jù)庫(kù)』慌铮可以看到我們已經(jīng)有的數(shù)據(jù)庫(kù)式镐。
SQL語(yǔ)句
跟數(shù)據(jù)庫(kù)進(jìn)行溝通的語(yǔ)言就是SQL。SQL是Structured Query Language的縮寫(xiě)固蚤,稱之為結(jié)構(gòu)化查詢語(yǔ)言娘汞。使用SQL編寫(xiě)的語(yǔ)句就是SQL語(yǔ)句,SQL語(yǔ)句可以用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作夕玩。
常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)SQL語(yǔ)句都是比較類似的你弦。所以學(xué)習(xí)了MySQL之后再去學(xué)習(xí)Oracle或者其他關(guān)系型數(shù)據(jù)庫(kù)也是很方便的。
SQL語(yǔ)句的常用規(guī)范:
* 通常關(guān)鍵字是大寫(xiě)的燎孟,比如`CREATE`禽作、`TABLE`、`SHOW`等
* 一條語(yǔ)句結(jié)束后需要以`;`分號(hào)結(jié)尾
* 如果關(guān)鍵字作為表名或者字段名揩页,需要使用``進(jìn)行包裹旷偿。
SQL語(yǔ)句的分類
常見(jiàn)的SQL語(yǔ)句可以分為四類:
-
DDL(Data Definition Language):數(shù)據(jù)定義語(yǔ)言
- 可以通過(guò)DDL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)或者表進(jìn)行:創(chuàng)建、刪除、修改等操作
-
DML(Data Manipulation Language):數(shù)據(jù)操作語(yǔ)言
- 可以通過(guò)DML語(yǔ)句對(duì)表進(jìn)行:添加萍程、刪除幢妄、修改等操作
-
DQL(Data Query Language):數(shù)據(jù)查詢語(yǔ)言
- 可以通過(guò)DQL從數(shù)據(jù)庫(kù)中查詢記錄
-
DCL(Data Control Language):數(shù)據(jù)控制語(yǔ)言
- 對(duì)數(shù)據(jù)庫(kù)、表的權(quán)限進(jìn)行相關(guān)訪問(wèn)控制操作
數(shù)據(jù)庫(kù)的操作
字符集:代表存到數(shù)據(jù)庫(kù)中的數(shù)據(jù)以什么樣的編碼存儲(chǔ)尘喝,默認(rèn)為utf8mb4
磁浇。但不能正常存儲(chǔ)emoji表情斋陪。
排序規(guī)則:ai
表示排序的時(shí)候不區(qū)分輕重音朽褪,as
的話表示區(qū)分輕重音。ci
表示不區(qū)分大小寫(xiě)无虚,cs
表示區(qū)分大小寫(xiě)缔赠。
比如創(chuàng)建數(shù)據(jù)庫(kù)時(shí)可以指定對(duì)應(yīng)的編碼和排序規(guī)則(不常用):
CREATE DATABASE IF NOT EXISTS huya DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
修改數(shù)據(jù)庫(kù)的編碼(COLLATE是排序規(guī)則):
# 修改數(shù)據(jù)庫(kù)的編碼
ALTER DATABASE bili CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;
MySQL的數(shù)據(jù)類型
MySQL支持的數(shù)據(jù)類型有:數(shù)字類型,日期和時(shí)間類型友题,字符串(字符和字節(jié))類型嗤堰,空間類型和 JSON數(shù)據(jù)類型。
MySQL支持的數(shù)據(jù)類型有:數(shù)字類型度宦,日期踢匣,時(shí)間類型,字符串(字符和字節(jié))類型戈抄,空間類型和JSON數(shù)據(jù)類型
數(shù)字類型
MySQL數(shù)字類型有很多离唬。
整數(shù)類型有:INTEGER,INT划鸽,SMALLINT输莺,TINYINT,MEDIUMINT裸诽,BIGINT
Type | Storage (Bytes) | Minimum Value Signed | Minimum Value Unsigned | Maximum Value Signed | Maximum Value Unsigned |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -263 | 0 | 263-1 | 264-1 |
浮點(diǎn)數(shù)字類型:FLOAT,DOUBLE(FLOAT是4個(gè)字節(jié)嫂用,DOUBLE是8個(gè)字節(jié))
精確數(shù)字類型:DECIMAL,NUMERIC (DECIMAL是NUMERIC的實(shí)現(xiàn)形式);
日期類型
日期和時(shí)間類型有:DATE, TIME, DATETIME, TIMESTAMP, YEAR
DATETIME和TIMESTAMP都是以格式Y(jié)YYY-MM-DD hh:mm:ss顯示值丈冬,他們的主要區(qū)別在于DATETIME支持的范圍是1000-01-01 00:00:00
到 9999-12-31 23:59:59
嘱函;TIMESTAMP數(shù)據(jù)類型的范圍是UTC時(shí)間:1970-01-01 00:00:01
到2038-01-19 03:14:07
表約束
主鍵:PRIMARY KEY
主鍵是表中唯一的索引。永遠(yuǎn)不會(huì)重復(fù)
并且必須是NOT NULL的埂蕊,如果沒(méi)有設(shè)置NOT NULL往弓,那么MySQL也會(huì)隱式的設(shè)置為NOT NULL
-
主鍵也可以是多列索引,PRIMARY KEY(key_part, ...), 一般稱之為聯(lián)合主鍵或者復(fù)合主鍵
CREATE TABLE IF NOT EXISTS moment_label ( moment_id INT NOT NULL, label_id INT NOT NULL, // 聯(lián)合主鍵 PRIMARY KEY(moment_id, label_id) );
唯一:UNIQUE
- 唯一性粒梦,使用UNIQUE約束的字段在表中必須是不同的
- 對(duì)于所有的引擎亮航,UNIQUE索引允許NULL包含的列具有多個(gè)NULL值,也就是NULL值可以重復(fù)
默認(rèn)值:DEFAULT
- 為某個(gè)字段設(shè)置默認(rèn)值
自動(dòng)遞增:AUTO_INCREMENT
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT, # id設(shè)置為主鍵匀们,并且是遞增的
name VARCHAR(20) NOT NULL, # name設(shè)置為可變字符類型缴淋,并且長(zhǎng)度在20以內(nèi),且不能為空
age INT DEFAULT 0, # age設(shè)置為INT類型 默認(rèn)為0
phoneNum VARCHAR(20) UNIQUE DEFAULT '', # 手機(jī)號(hào)為20個(gè)字符以內(nèi)的 唯一 且默認(rèn)為‘’
createTime TIMESTAMP
)
# 刪除數(shù)據(jù)表
DROP TABLE users;
DROP TABLE IF EXISTS users;
修改表
修改表的名字
語(yǔ)法:ALTER TABLE 表名 RENAME TO 新表名;
// 將數(shù)據(jù)表users改名為user
ALTER TABLE `users` RENAME TO `user`;
添加新的列
語(yǔ)法:ALTER TABLE 表名 ADD 新列的名 類型;
# 2.添加新的列 在user表中新增TIMESTAMP類型的updateTime字段
ALTER TABLE `user` ADD `updateTime` TIMESTAMP;
修改字段的名字
語(yǔ)法:ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新字段的類型;
# 3.修改字段名稱 將user表中的phoneNum字段名修改為telphone 類型為 VARCHAR(20)
ALTER TABLE `user` CHANGE `phoneNum` `telPhone` VARCHAR(20);
修改字段的類型
語(yǔ)法:ALTER TABLE 表名 MODIFY 字段名 新的字段類型;
# 4.修改字段的類型 將user表中的name字段的類型修改為VARCHAR(30)
ALTER TABLE `user` MODIFY `name` VARCHAR(30);
刪除字段
語(yǔ)法:ALTER TABLE 表名 DROP 要?jiǎng)h除的字段;
# 5.刪除字段 刪除user表中的age字段
ALTER TABLE `user` DROP `age`;
根據(jù)表的結(jié)構(gòu)創(chuàng)建另一張表
語(yǔ)法:CREATE TABLE 新表名 LIKE 表名
只會(huì)復(fù)制表的結(jié)構(gòu),而不會(huì)把表的內(nèi)容復(fù)制到新創(chuàng)建的表
# 根據(jù)user表的結(jié)構(gòu)創(chuàng)建表user2
CREATE TABLE `user2` LIKE `user`;
根據(jù)表的內(nèi)容創(chuàng)建另一張表
語(yǔ)法:CREATE TABLE 新表名 AS(可省略) (SELECT * FROM 表名);
# 根據(jù)user表中的內(nèi)容創(chuàng)建user3表
// CREATE TABLE `user3` AS (SELECT * FROM `user`);
CREATE TABLE `user3` (SELECT * FROM `user`);
DML-對(duì)數(shù)據(jù)庫(kù)的增刪改
插入數(shù)據(jù)
語(yǔ)法:INSERT INTO 表名 (字段1,字段2,...) VALUES (value1,value2,...)
# 向user表中插入數(shù)據(jù)
INSERT INTO user VALUES (110,'lwy','15665431234','2020-11-11','2020-12-12');
# 向user表中插入對(duì)應(yīng)字段的數(shù)據(jù)
INSERT INTO user (name,telPhone,createTime,updateTime)
VALUES ('zhangsan','020-123456','2020-11-12','2020-12-13');
INSERT INTO user (name, telPhone)
VALUES ('lisi','030-213456');
設(shè)置字段的默認(rèn)值
# createTime 默認(rèn)為創(chuàng)建時(shí)的時(shí)間
ALTER TABLE user MODIFY createTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
# updateTime 默認(rèn)為創(chuàng)建時(shí)間 在修改時(shí)自動(dòng)設(shè)置修改時(shí)間
ALTER TABLE user MODIFY updateTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
INSERT INTO user (name, telPhone)
VALUES ('lris','050-213456');
刪除數(shù)據(jù)
語(yǔ)法:DELETE FROM 表名;
DELETE FROM 表名 WHERE 條件;
# 刪除user表中所有的數(shù)據(jù)
DELETE FROM user;
# 刪除user表中id為110的數(shù)據(jù)
DELETE FROM user WHERE id = 110;
更新數(shù)據(jù)
# 更新所有的數(shù)據(jù)
UPDATE user SET name = '李四', telPhone = '012-12345600';
# 更新符合條件的數(shù)據(jù)
UPDATE user SET name = '李四', telPhone = '012-12345600' WHERE id = 111;
DQL語(yǔ)句
DQL:Data Query Language(數(shù)據(jù)查詢語(yǔ)言)
- SELECT用于從一個(gè)或者多個(gè)表中檢索選中的行
官方文檔介紹的很詳細(xì)重抖。
基本查詢
# 1.基本查詢
# 查詢表中所有字段和所有數(shù)據(jù)
SELECT * FROM products;
# 查詢指定的字段
SELECT title, price FROM products;
# 對(duì)字段結(jié)果起別名
SELECT title AS phoneName, price AS currentPrice FROM products;
WHERE查詢條件
-
基本查詢
# WHERE后面是查詢條件 SELECT * FROM products WHERE price = 1000; SELECT title, price FROM products WHERE price > 1000; # 下面兩種寫(xiě)法是一樣的 都是不等于 SELECT * FROM products WHERE price != 1000; SELECT * FROM products WHERE price <> 1000;
-
邏輯運(yùn)算符
# 案例一:價(jià)格1000到2000的手機(jī) SELECT * FROM products WHERE price > 1000 AND price < 2000; SELECT * FROM products WHERE price > 1000 && price < 2000; # BETWEEN AND包含等于的情況 SELECT * FROM products WHERE price BETWEEN 1000 AND 2000; # 邏輯或 SELECT * FROM products WHERE price > 5000 || brand = '華為'; # 查詢一個(gè)值是否為NULL # 查詢url為NULL的數(shù)據(jù) SELECT * FROM products WHERE url IS NULL; # 查詢url不為NULL的數(shù)據(jù) SELECT * FROM products WHERE url IS NOT NULL;
-
模糊查詢
模糊查詢使用LIKE關(guān)鍵字露氮,結(jié)合兩個(gè)特殊的符號(hào):
-
%
表示匹配任意個(gè)(0個(gè)或多個(gè))的任意字符 -
_
表示匹配一個(gè)的任意字符;
# 查詢 title中有M的數(shù)據(jù) SELECT * FROM products WHERE title LIKE '%M%'; # 查詢title中第二個(gè)字母是P的數(shù)據(jù) SELECT * FROM products WHERE title LIKE '_P%';
-
-
IN:取多個(gè)值中的一個(gè)即可
SELECT * FROM products WHERE brand = '華為' || brand = '小米' || brand = '蘋(píng)果'; # 這句跟上面的作用相同 SELECT * FROM products WHERE brand IN ('華為','小米','蘋(píng)果');
排序
通過(guò)ORDER BY
關(guān)鍵字進(jìn)行排序
ASC: 升序
DESC:降序
# 查詢結(jié)果的排序
# ASC: 升序 DESC:降序
# 查詢的結(jié)果根據(jù)價(jià)格的升序排序
SELECT * FROM products WHERE brand IN ('華為','小米','蘋(píng)果') ORDER BY price ASC;
# 查詢的結(jié)果以價(jià)格的升序排序 價(jià)格相同時(shí)以score的降序排序
SELECT * FROM products WHERE brand IN ('華為','小米','蘋(píng)果') ORDER BY price ASC, score DESC;
分頁(yè)查詢
LIMIT
查詢的數(shù)據(jù)钟沛,OFFSET
:偏移量
語(yǔ)法:LIMIT limit OFFSET offset
或者可以 LIMIT offset,limit
SELECT * FROM products LIMIT 20 OFFSET 0;
# 偏移量0 長(zhǎng)度為20 等同于上面的
SELECT * FROM products LIMIT 0,20;
聚合函數(shù)
聚合函數(shù)表示對(duì)值集合進(jìn)行操作的組(集合)函數(shù)
默認(rèn)情況下畔规,聚合函數(shù)相當(dāng)于是將整張表的數(shù)據(jù)看作一組數(shù)據(jù),對(duì)這一組數(shù)據(jù)進(jìn)行某些操作使用的函數(shù)就是聚合函數(shù)恨统。
1.聚合函數(shù)的使用
# 1.1 求所有手機(jī)價(jià)格的總和
SELECT SUM(price) FROM products;
## 設(shè)置名稱
SELECT SUM(price) AS totalPrice FROM products;
## AS可以省略
SELECT SUM(price) totalPrice FROM products;
2.GROUP BY
GROUP BY通常和聚合函數(shù)一起使用叁扫。表示我們先對(duì)數(shù)據(jù)進(jìn)行分組,再對(duì)每一組數(shù)據(jù)畜埋,進(jìn)行聚合函數(shù)的計(jì)算;
按照品牌來(lái)分組計(jì)算對(duì)應(yīng)的平均價(jià)格 數(shù)量 平均評(píng)分
SELECT AVG(price), COUNT(*), AVG(score) FROM products GROUP BY brand;
結(jié)果如下:
但可以看出來(lái)并沒(méi)有顯示對(duì)應(yīng)的品牌名稱莫绣,如果要顯示對(duì)應(yīng)的品牌名稱
SELECT brand, AVG(price), COUNT(*), AVG(score) FROM products GROUP BY brand;
需要注意的是,因?yàn)槭歉鶕?jù)brand進(jìn)行分組(GROUP BY)的悠鞍,所以SELECT后面跟著的是brand对室,而不能是title等其他的字段。當(dāng)然brand和AVG(price)等的順序可以自由調(diào)節(jié)
HAVING的使用
如果要對(duì)分組之后的數(shù)據(jù)再進(jìn)行篩選咖祭,需要使用HAVING語(yǔ)句掩宜,而不是WHERE
# 3.1 按照品牌來(lái)分組計(jì)算對(duì)應(yīng)的平均價(jià)格 數(shù)量 平均評(píng)分之后 篩選出其中平均價(jià)格大于2000的數(shù)據(jù)
# 可能會(huì)在結(jié)果后面跟上WHERE篩選條件 這樣是語(yǔ)法錯(cuò)誤的
# SELECT brand, AVG(price) avgPrice, COUNT(*), AVG(score) FROM products GROUP BY brand WHERE avgPrice > 2000;
# 應(yīng)該是
SELECT brand, AVG(price) avgPrice, COUNT(*), AVG(score) FROM products GROUP BY brand HAVING avgPrice > 2000;
WHERE和HAVING的區(qū)別:
WHERE是用來(lái)篩選數(shù)據(jù)表中的某些條件的,HAVING是對(duì)分組(GROUP BY)之后的數(shù)據(jù)進(jìn)行篩選么翰。也就是WHERE是跟在表的后面牺汤,作用于表,HAVING是跟在GROUP BY后面硬鞍,作用于GROUP BY分組之后的慧瘤。