MySQL 數(shù)據(jù)庫(kù)入門

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ì)表中記錄的查找或排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容