MySQL
創(chuàng)建要操作的數(shù)據(jù)庫(kù)
- 連接
mysql -u root -p
- 查看所有的數(shù)據(jù)庫(kù)
show databases;
- 選擇要操作的數(shù)據(jù)庫(kù)
use <database>;
- 創(chuàng)建新的數(shù)據(jù)庫(kù)
create database <database>;
例:
CREATE DATABASE users DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_bin
- 創(chuàng)建數(shù)據(jù)表
CREATE TABLE 數(shù)據(jù)庫(kù)表名稱 (
字段名稱 字段屬性...,
PRIMARY KEY (主鍵字段名稱),
INDEX 索引名稱(索引字段...)...
) ENGINE=InnoDB DEFAULT CHARSET=utf8
字段屬性設(shè)置
- 字段類型:int(10)、char(10)、varchar(200)
- 是否為null:NOT NULL
- 無符號(hào):UNSIGNED
- 自動(dòng)增長(zhǎng):AUTO_INCREMENT
- 默認(rèn)值:DEFAULT 0
例:
CREATE TABLE user(
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL DEFAULT '',
`age` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`gender` ENUM('男', '女') NOT NULL DEFAULT '男',
PRIMARY KEY (`id`),
INDEX uname(`username`),
INDEX age(`age`),
INDEX gender(`gender`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
MySQL 特點(diǎn)
- 數(shù)據(jù)以表格的形式出現(xiàn)
- 表格中每一行表示一組數(shù)據(jù)
- 表格中每一列表示某組數(shù)據(jù)對(duì)應(yīng)的字段(屬性)
- 若干這樣的行和列就組成了一張表
- 若干個(gè)表格組成一個(gè)庫(kù)
MySQL 服務(wù)就是維護(hù)了若干個(gè)這樣的庫(kù)
查詢所有數(shù)據(jù)
SELECT * FROM table_name
實(shí)際使用中,并不推薦 *
SELECT column_name,column_name FROM table_name
別名
SELECT column_name as c1,column_name as c2 FROM table_name as t WHERE t.column_name = val
列:
select username,age from users;
node & mysql - mysql2
安裝
npm i mysql2
使用
const mysql = require('mysql2/promise')
連接數(shù)據(jù)庫(kù)
const connection = await mysql.createConnection(opts)
opts選項(xiàng)
host:數(shù)據(jù)庫(kù)服務(wù)器
user:數(shù)據(jù)庫(kù)連接用戶名稱
password:數(shù)據(jù)連接密碼
database:要操作的數(shù)據(jù)庫(kù)
添加數(shù)據(jù)
INSERT INTO table_name(field1,...fieldN) VALUES(value1,...valueN)
列:
數(shù)據(jù)添加
insert into users (username,age,gender) values ('小明',18,'男');
批量添加
insert into `user` (`username`, `age`, `gender`) values ('lili', 6, '女'),('小明', 18, '男');
Node.js - mysql2
connection.query('INSERT INTO table_name (fileld1,fileld2) VALUES (value1,value2)')
返回值依據(jù)其操作來決定
- INSERT INTO: [{affectedRows,insertId},undefined]
更新數(shù)據(jù)
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
列:
update todos set title='set' where id=14
Node.js - mysql2
connection.query('UPDATE table_name SET ??=?',[key,value])
返回值依據(jù)其操作來決定
- UPDATE: [{affectedRows,insertId},undefined]
刪除數(shù)據(jù)
DELETE FROM table_name
WHERE some_column=some_value;
列:
delete from todos where id=14
刪除表的其他方法
- DROP 表名稱:刪除表、數(shù)據(jù)以及結(jié)構(gòu)
- TRUNCATE 表名稱:刪除表的數(shù)據(jù),保留結(jié)構(gòu),不支持事務(wù),不可撤銷恢復(fù)
- DELETE 表名稱:刪除表的數(shù)據(jù), 保留結(jié)構(gòu),支持事務(wù)
Node.js - mysql2
connection.query('DELETE FROM table_name WHERE id=?',[1])
返回值依據(jù)其操作來決定
- DELETE: [{affectedRows},undefined]
查詢數(shù)據(jù)
connection.query(SQL語句)
返回值依據(jù)其操作來決定
- SELECT:[數(shù)據(jù)集合,字段集合]
條件查詢
SELECT column_name,column_name FROM table_name [WHERE Clause]
WHERE 子句
WHERE condition1 [AND [OR]] condition2......
操作符
=、<>,!=、>、<、>=、<=
查詢參數(shù)占位符
.query('SELECT ??,?? FROM ?? WHERE ?? = ?',['id','username','users','id','1'])
??: 字段名、表名
?:值
數(shù)量限制查詢
SELECT column_name,column_name FROM table_name [LIMIT N]
N:數(shù)字,要限制的查詢數(shù)據(jù)的最大條數(shù)
查詢偏移
SELECT column_name,column_name FROM table_name [LIMIT N] [OFFSET M]
M:數(shù)字,要偏移的數(shù)量值,從0開始
OFFSET 必須與 LIMIT 一起使用,且 LIMIT 在前
偏移與限制
SELECT column_name,column_name FROM table_name [LIMIT [M,]N]
注意,這種寫法偏移在前,限制在后,如果只有一個(gè)數(shù)字,默認(rèn)為限制
ORDER BY 必須在 LIMIT 之前 WHERE(GROUP BY) 之后
去重
DISTINCT:查詢表中不重復(fù)的記錄,如果指定多個(gè)字段,則作為聯(lián)合條件
SELECT DISTINCT column_name,column_name... FROM table_name
模糊查詢
LIKE:模糊查詢,通常與 % 配合使用,不使用 % 同 =
% 類似 *,通配
%name:以 name 結(jié)尾的內(nèi)容
name%:以 name 開頭的內(nèi)容
%name%:包含 name 的內(nèi)容
通配符
%:一個(gè)或多個(gè)字符
_:一個(gè)字符
SELECT column_name... FROM table_name WHERE column_name LIKE %name%
例:
select * from todos where title LIKE '%node%'
NOT LIKE:與 LIKE 相反
正則
SELECT 字段... FROM 表名 WHERE 字段名 REGEXP '規(guī)則'
規(guī)則:正則表達(dá)式
注意:字符串轉(zhuǎn)義,\d 需要寫成 '\d'
例:
SELECT * FROM user WHERE age REGEXP '3|1';
多值匹配
IN:多值匹配
SELECT column_name... FROM table_name WHERE column_name IN (value1,value2...)
例:
select title from todos where title IN ('123','1234')
NOT IN:與 IN 相反
范圍查詢
BETWEEN:范圍查詢
SELECT column_name... FROM table_name WHERE column_name BETWEEN value1 AND value2
NOT BETWEEN :與 BETWEEN 相反
排序
ORDER BY:按照某個(gè)字段某種規(guī)則進(jìn)行排序
SELECT column_name... FROM table_name ORDER BY column_name1 DESC,column_name2 ASC
- DESC:降序
- ASC:升序,默認(rèn)
- 如果有多個(gè)排序字段和規(guī)則,執(zhí)行順序?yàn)閺淖蟮接?/li>
多表查詢
SELECT * FROM 表一, 表二 WHERE 表一.字段 運(yùn)算符 表二.字段
例:
SELECT * FROM user,message WHERE user.id=message.uid;
內(nèi)連接(同上)
SELECT * FROM 表一 JOIN 表二 ON 表一.字段 運(yùn)算符 表二.字段
SELECT * FROM 表一 INNER JOIN 表二 ON 表一.字段 運(yùn)算符 表二.字段
例:
SELECT * FROM user JOIN message ON user.id=message.uid;
SELECT * FROM user INNER JOIN message ON user.id=message.uid;
左連接
SELECT 字段 FROM 表一 LEFT JOIN 表二
ON 表一.字段 運(yùn)算符 表二.字段
LEFT JOIN 關(guān)鍵字從左表(表一)返回所有的行,即使右表(表二)中沒有匹配。如果右表中沒有匹配,則結(jié)果為 NULL。
例:
SELECT * FROM user LEFT JOIN message ON user.id=message.uid;
右連接
SELECT 字段 FROM 表一 RIGHT JOIN 表二
ON 表一.字段 運(yùn)算符 表二.字段
RIGHT JOIN 關(guān)鍵字從右表(表二)返回所有的行,即使左表(表一)中沒有匹配。如果左表中沒有匹配,則結(jié)果為 NULL。
SELECT * FROM user RIGHT JOIN message ON user.id=message.uid;
函數(shù)
SQL 也提供了一些內(nèi)置函數(shù),以便對(duì)數(shù)據(jù)進(jìn)行一些常規(guī)操作
聚合函數(shù)
計(jì)算從列中取得的值,返回一個(gè)單一的值,如:COUNT、SUM、MAX、MIN標(biāo)量函數(shù)
基于輸入值,返回一個(gè)單一的值,如:UCASE、LCASE、NOW
COUNT
返回匹配指定條件的行數(shù)
SELECT COUNT(column_name) FROM table_name
例:
select count(id) from todos
SUM
返回?cái)?shù)值列的總數(shù)
SELECT SUM(column_name) FROM table_name
例:
select sum(id) from todos
AVG
返回?cái)?shù)值列的平均值
SELECT AVG(column_name) FROM table_name
例:
select avg(id) from todos
MAX
返回指定列的最大值
SELECT MAX(column_name) FROM table_name
例:
select max(id) from todos
MIN
返回指定列的最小值
SELECT MIN(column_name) FROM table_name
例:
select min(id) from todos
UCASE
把字段的值轉(zhuǎn)換為大寫
SELECT UCASE(column_name) FROM table_name
例:
select UCASE(title) from todos
LCASE
把字段的值轉(zhuǎn)換為小寫
SELECT LCASE(column_name) FROM table_name
例:
select LCASE(title) from todos
MID
從文本字段中提取指定字符
SELECT MID(column_name,start[,length]) FROM table_name
start:從1開始計(jì)算
例:
select MID(title,1,3) from todos
LENGTH
返回文本字段中值的長(zhǎng)度
SELECT LENGTH(column_name) FROM table_name
例:
select LENGTH(title) from todos
NOW
返回當(dāng)前系統(tǒng)的日期和時(shí)間
SELECT NOW() FROM table_name
例:
SELECT NOW() FROM todos // 2019-07-24 09:54:32
GROUP BY
用于結(jié)合聚合函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組
SELECT column_name FROM table_name GROUP BY column_name1
存儲(chǔ)引擎
數(shù)據(jù)在計(jì)算機(jī)上存儲(chǔ)的方式
MYSQL 常見存儲(chǔ)引擎:InnoDB、MyISAM等
InnoDB的優(yōu)勢(shì)在于提供了良好的事務(wù)處理、崩潰修復(fù)能力和并發(fā)控制。缺點(diǎn)是讀寫效率較差,占用的數(shù)據(jù)空間相對(duì)較大
MyISAM的優(yōu)勢(shì)在于占用空間小,處理速度快,缺點(diǎn)是不支持事務(wù)的完整性和并發(fā)性
字符集、編碼
指數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)的編碼
- utfmb4 :支持更多的 unicode 字符(四字節(jié))
數(shù)據(jù)校對(duì)
數(shù)據(jù)庫(kù)除了要存儲(chǔ)數(shù)據(jù),還要對(duì)數(shù)據(jù)進(jìn)行排序,比較等操作,不同的校對(duì)規(guī)則會(huì)有不同的結(jié)果
- utfmb4_unicode_ci:基于標(biāo)準(zhǔn)的 Unicode 來排序和比較,能夠在各種語言之間精確排序
數(shù)據(jù)類型
數(shù)據(jù)存儲(chǔ)的類型
數(shù)字類型:INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT,DECIMAL,NUMERIC,FLOAT,DOUBLE
日期時(shí)間類型:DATE,DATETIME,TIMESTAMP,TIM,YEAR
字符串類型:CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM,SET
主鍵
表中的一個(gè)或多個(gè)字段,它的值用于唯一地標(biāo)識(shí)表中的某一條記錄,用來保持?jǐn)?shù)據(jù)的完整性
- 一個(gè)表只能有一個(gè)主鍵
- 主鍵可以是第一個(gè)字段,也可以有多個(gè)字段組成
- 主鍵值不能重復(fù)
- 加快對(duì)數(shù)據(jù)的操作
自增
auto_increment
添加數(shù)據(jù)的時(shí)候由數(shù)據(jù)庫(kù)自動(dòng)設(shè)置的值
一般在設(shè)計(jì)表的時(shí)候會(huì)設(shè)置一個(gè)自動(dòng)增加字段作為主鍵
索引
對(duì)表中一列或多列(注意是列)的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問表中特定的信息
加快對(duì)表中記錄的查找或排序