侧边栏壁纸
博主头像
晨的博客 博主等级

来去如一,真性湛然。风收云散,月在青天。

  • 累计撰写 14 篇文章
  • 累计创建 14 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL基础

野生数分狮 - 晨
2024-04-23 / 0 评论 / 2 点赞 / 14 阅读 / 0 字

在SQL语句里,关键字和函数名用大写字母表示,数据库名,表名,列名用小写字母表示(使用中文可能会发生错误)

  (MySQL不区分大小写)SQL语句的命令需要使用半角字符输入,输人全角字符会发生错误

  在语法描述里,方括号[] )表示可选内容,以竖线| )表示备选列表。包含在方括号( [] )内的列表是可选项可以从中选择一项;包含在花括号( {} )内的列表选项是必选项必须从中选择一项

  使用Enter键输入后,如果需要反复输人相同的数据,可以先按↑键,再按Enter键反复执行该操作

  在启动MγSOL监视器的时候可以加上 --safe-updates选项。在使用此 选项的情况下,如果列上没有WHERE条件就无法执行UPDATE或DELETE

  在SELECT等命令中,当显示的列数量较多或者项目较长时,可以在命 令的末尾使用"\G",代替“;”,显示出来的结果会按列纵向显示,更易于阅读

  统一数据库名: db1 db1A~K

  算数运算符

  比较运算符(和python不同,注意区分)

创建数据库

创建数据库
 CREATE DATABASE db1;
 CREATE DATABASE IF NOT EXISTS db1;
 #Query OK,...
 #显示“->”,则表示命令未结束,输入“;”按下enter即可
 #显示You have an error... SQL语句的语法有问题,检查拼写错误
 #显示Can't create database'db1'...数据库已存在,MySQL无法创建多个同名数据库
 #租赁服务器的数据库名已事先决定
确认数据库
 SHOW DATABASES
 #最下面的一行会显示××rows 1n set这种输出行数的信息,当输出内容无法容纳在MySQL监视器的屏幕中时,我们只要确认行数信息
 # test(安装时自动创建的空数据库,可以直接测试)和mysql(负责存储MySQL各种信息的数据库,保存管理用户信息的表user等。保存存储MySQL信息的数据库及示例数据库)等数据库会默认创建
指定数据库
 use db1
 #Database changed(数据库改变了)
 #use不是SQL语句(这里是用小写字母),所以不输人“;”也可以,use可以用“\u“替代
显示当前数据库
 SELECT DATABASE();

  可以直接指定数据库启动MγSOL监视器 在这种情况下,可以像mysql db1 -u root -proot在命令提示符中指定数据库名来执行mysql命令

  ‍

创建表

  数据类型:INT表示能够存储整数数据。VARCHAR表示能够存储字符数据,后面紧跟“(10)”,表示允许最多输入10个字符

 CREATE TABLE 表名(列名1 数据类型1,列名2 数据类型2,…);
 #例如:CREATE TABLE tb1(empid VARCHAR(10),name VARCHAR(10),age INT);
 #( )内使用空格分开列名和数据类型’各个列
 之间使用","分隔
 #存在相同表名时会发生错误,不会替换之前已经存在的表
 #数据库名、表名和列名可以用(反引号)括起来使用
 #输入到列中的字符串的值需要用单引号‘’或双引号“”括起来
显示所有的表
 SHOW TABLES;
 #显示所有的表

  在MySQL中输人字符到表中时,会因为各种原因出现字符乱码的情况。可以指定字符编码创建表

 CREATE TABLE tb1(empid VARCHAR(10),name VARCHAR(10),age INT) CHARSET=UTF8;
访问其他数据库

  在使用use选择数据库的状态下也能够操作其他数据库中的表。这时可以像“数据库名.表名”这样把"数据库名"和“表名"用"."连接起来

 SELECT * FROM db2.table;
 # 这个命令在没有使用uSe选择数据库的状态下也可以执行

  ‍

显示表的列结构

  用于显示表的列结构的命令是DESC或者DESCRIBE

DESC 表名;
# Null 表示“允许不输人任何值”
# Default 表示“如果什么值都不输入就用这个值
# Field 表示列名, Type表示数据类型
# INT 后面的数值表示位数

  ‍

插入行数据
INSERT INTO 表名 VALUES(数据1,数据2,...);
# 例如:
INSERT INTO tb1 VALUES('A101','张三','35');
#按上下键,会显示之前输入的命令历史,修改后按Enter执行
# 按F7显示历史命令列表
# 当添加的数据里包含时间日期数据,会自动使用TADATIME类型,时间部分默认为“00:00:00”

  指定列名插入数据

INSERT INTO 表名(列名1,列名2...) VALUES (数据1,数据2...);
# 这里列名和数据需要有对应关系,可以打乱顺序

  ‍

一次性插入多行
INSERT INTO 表名(列名1,列名2...) VALUES (数据1,数据2...),(数据1,数据2...),(数据1,数据2...)
# 较长的SQL语句可以在中间换行输入,VALUES等关键字如果不在一行,就会发生错误

  ‍

显示数据

SELECT 列名1,列名2...FROM 表名;
# 这里指定的列顺序就是显示顺序,同一个列可以显示多次
# 例如:SELECT empid,name FROM tb1;
# SELECT * FROM 表名;
# 显示所有记录
# *是通配符,可以代替任意字符,这里表示所有的列

  ‍

使用别名

  别名(alias)是指一般称谓以外的名称。在计算机的世界里’它表示为了指代真实事物,由用户自由命名的名称

SELECT 列名 AS 别名 FROM 表名;
# 在指定多个列的情况下,使用“,”区分各列名,并加上“列名 AS 别名”。如果别名使用了半角符号,需要使用""将别名括起来,否则会发生错误,全角则不会
# 显示结果直接显示别名,不会显示原来的列名

  ‍

计算列值或处理字符串

  算数运算符:

image-20250326161135-7hgidve.png

SELECT 列名*100 AS 别名 FROM 表名;
SELECT 列名/列名 FROM 表名;
SELECT 列名+列名 FROM 表名;

  ‍

使用函数计算
SELECT AVG(列名) FROM 表名;
# 平均值
SELECT SUM(列名) FROM 表名;
# 总和
SELECT COUNT(列名) FROM 表名;
#统计记录个/条数

  ‍

日期和时间函数

  NOW是用于返回当前日期和时间的函数,将输人列设置为DATATIME类型,设置自动连续编号功能

CREATE TABLE t_now(a INT AUTO_INCREMENT PRIMARY KEY,b DATETIME);
# 创建表的表名为t_now,a列数据类型为INT,设置为主键,有自动连续编号功能,b列数据类型为DATETIME
INSERT INTO t_now(b) values(NOW());
# 向b列插入当前的日期和时间

  ‍

  ‍

字符串常用函数
SELECT CONCAT(empid,name,'先生') FROM tb1;
# CONCAT函数可以连接字符串,参数中的字符串数据需要用''括起来
SELECT RIGHT(empid,2) FROM tb1;
# 显示列empid最右边的2个字符,在列empid的值为“A101"的情况下,显示为“01”
SELECT LEFT(empid,2) FROM tb1;
# 显示列empid最左边的2个字符,在列empid的值为“A101"的情况下,显示为“A1”
SELECT SUBSTRING(empid,2,3) FROM tb1;
# 从列empid最左边的第2个字符开始连续显示3个字符,在列empid的值为“A101"的情况下,显示为“101”,注意这里的参数值和索引值不一样
SELECT REPEAT('.',age) FROM tb1;
# 重复显示字符'.',重复次数为列age的值
# 以age的值为横轴,以行数为纵轴的员工年龄简易图表
SELECT REVERSE(name) FROM tb1;
# 反转显示,这里姓名的字符串会倒着显示

  ‍

显示信息

  SELECT可以显示与数据库无关的值,可以用于确认函数的值或计算结果,例如输入“SELECT (2+3)*4;“后按Enter键,就会显示出“20”

SELECT PI();
# PI是显示圆周率的函数
SELECT VERSION();
# 示MySOL服务器版本
SELECT DATABASE();
# 显示当前使用的数据库
SELECT USER();
# 显示当前用户
SELECT CHARSET('这个字符');
显示参数指定的字符的字符编码

  ‍

指定显示范围
SELECT 列名 FROM 表名 LIMIT 行数;
# 显示表的前几行记录

  进一步指定

SELECT 列名 FROM 表名 LIMIT 行数 OFFSET 开始显示的移位数;
# 开始显示的移位数,是指定从第一条记录开始(包含)移动几位后从下一行开始指定(N+1)
SELECT * FROM tb ORDER BY sales DESC LIMIT 2 OFFSET 3;
# 先按照列值salse从大到小排序,然后从第4位开始截取两条记录

  ‍

复制表
CREATE TABLE tb1A SELECT * FROM tb1
# 用方向键重复操作

  ‍

数据类型和输入

数值类型(同python)

image-20250320172324-6kpc1q5.png

  数值数据输入:

  输人数据时可以加上正负号"+""-"。 数值也可以使用指数表示法输入,使用符号”E“。 “○E+△”表示“○乘以10的△次方’。例如, 6.02×I0^23可以表示为‘6.02E+23’

INSERT INTO tb1A (age) values(1E+4);
# 向表tbIA的INT类型的列age中输人l0000
字符串类型

image-20250320173136-4ji2jpd.png

  字符串类型输入:

  CHAR类型为固定长度的字符串,在保存数据的时候,字符数如果没有达到( )中指定的数量就会用空格填充。但是读取时这些填充的空格会被自动删除。而VARCHAR为可变长度字符串,保存数据时不会填充空格

  VARCHAR和CHAR能够在( )中指定位数

  长度不超过255个字符的是VHRCHAR,超过255个字符的是TEXT

  字符串数据需要用双引号或者单引号括起来,如果输人的字符串数据中包含单引号,那么之后出现的单引号就会被解释为表示字符串结束的单引号 所以’当把单引号当成字符输入时,要在它的前面加上“\”,该操作称为转义处理,输人”\"时,也需要在前面加上“\”,输入“\\”

日期和时间类型

image-20250320173929-cgrzzq6.png

  日期和时间类型输入:

  日期与时间类型的数据需要使用单引号或者双引号“"’,括起来。在MySQL中日期必须以YYYY-MM-DD的格式输入,时间必须HH:MM:SS的格式输入

  示例:

CREATE TABLE t_date(a DATE);
# 创建表的表名为t_date,列名为a,数据类型为DATE
INSERT INTO t_date(a) values('2018-5-3');
# 向a列插入内容为'2018-5-3'日期型数据

修改表

修改表的列结构

  用ALTER TABLE命令修改列的结构。根据需要修改的类型,可以使用带有MODIFY(修改列的定义)、ADD(添加列)、CHANGE(修改列名和定义)、DROP(删除列)语句

修改列的数据类型
ALTER TABLE 表名 MODIFY 列名 数据类型;
# 例如:ALTER TABLE tb1C MODIFY name VARCHAR(100);
# 把tb1C表的name列的数据类型VARCHAR改为100
# 超过指定数量的字符会自动删除
# DESE tb1C
# 显示表的列结构

  存储“0开头不是0且仅由数值字符组成的数据"的列能按照"INT类型"→"VARCHAR类型"→"INT类型"的方式进行修改

  如果列中存在数据,原则上就不应该再修改列的数据类型

添加列
ALTER TABLE 表名 ADD 列名 数据类型;
# 将列添加到最后的位置
# 例如:ALTER TABLE tb1C ADD birth DATETIME;
ALTER TABLE 表名 ADD 列名 数据类型 FIRST;
# 将列添加到最前面的位置
ALTER TABLE 表名 ADD COLUMN 列名2 数据类型 AFTER 列名1;
# 将 列名2添加到 列名1之后(列名1可以是任意位置)
修改列的顺序
ALTER TABLE 表名 MODIFY 列名 数据类型 FIRST;
# 将列换到最前面的位置
修改列的位置或数据类型的同时修改列名
ALTER TABLE 表名 CHANGE 修改前的列名 修改后的列名 修改后的数据类型;
# 例如:ALTER TABLE tb1C CHANGE birth birthday DATE;
# 即将birth列数据类型修改为DATE,列名修改为birthday
删除列
ALTER TABLE 表名 DROP 列名; 
# 删除列自然包含删除列中包含的数据
设置主键

  创建唯一记录时会给列设置一个用于和其他列进行区分的特殊属性。在这种情况下需要用到主键(PRIMARY KEY)。主键是在多条记录中用于确定—条记录时使用的标识符

  主键不能有重复的值,不允许输入数值1空值(NULL),项目key显示为PRI

ALTER TABLE 表名(列名 数据类型 PRIMARY KEY ...);  
# 例如:ALTER TABLE t_pk (a INT PRIMARY KEY ,b VARCHAR(10));
# 创建表t_pk其中作为主键的列a为INT类型,列b为
VARCHAR(10)类型
# 显示PRI表示主键PRIMARY KEY
# 设置主键后,会自动创建索引
设置唯一键

  唯一键(umquekey)虽然不允许列中有重复值,但允许输人NULL, 项目key显示为UNI

ALTER TABLE 表名(列名 数据类型 UNIQUE...);
# 例如:ALTER TABLE t_pk (a INT UNIQUE ,b VARCHAR(10));
列的自动连续编号

  要使列具有自动连续编号功能,在定义列的时候需要进行以下3项设置:

  • 据类型为INT等整数类型(包含TINYINT、SMALLINT等)

  • 给数据类型INT加上AUTO_INCREMENT,用于声明连续编号

  • 设置主键(PRIMARY KEY),使列具有唯一性

CREATE TABLE 表名(列名1 数据类型1,列名2 数据类型2,…)
# 在创建表中实现,添加新列使用ALTER TABLE...ADD...
# CREATE TABLE tb1C(a INT AUTO_INCREMENT PRIMARY KEY,b VARCHAR(10);
# 上面三个设置在当列的数据类型依次表述
# 项目Extra显示为AUTO_INCREMENT,表示设置了连续编号功能
# 用插入行语句即可实现连续插入数据(已经连续编号的列不需要输入)
设置连续编号的初始值

  拥有自动连续编号功能的列可以设置任意的值

INSERT INTO tb1C VALUES(100,'西瓜‘);
#列a中就会输入值100,然后从101开始分配连续的编号,即从已经输人的最大值+1开始分配值(记录删除也会连续)

  如果想把所有的记录都删除掉,并且让编号从1开始连续输入(初始化)

ALTER TABLE 表名 AUTO_INCREMENT=1;
# 当表中存在数据时.如果设置的编号值比已经存在的值大,也可以通过上面的语句重新设置编号的初始值;如果设置的编号值比已经存在的值小,则会连续最大值(即不能设置初始值)
设置列的默认值
CREATE TABLE 表名 (列名 数据类型 DEFAULT 默认值...);
# ALTER TABLE 表名 MODIFY 列名 数据类型(修改列的数据类型)
# ALTER TABLE tb1G MODIFY name DEFAULT '未输入姓名';
# 为修改默认值的列显示为NULL
# 输入数据时可以忽略这一列(有默认),如输入则是其他值
数据库的实体

  数据库保存位置:C:\MAMP\db\mysql\db1

  C:\MAMP\db\mysql文件夹内创建文件夹,可以强制创建数据库(执行SHOW DATABASES显示)

image-20250325155223-i2bbwnf.png

创建索引

  根据查找条件的不同,有时候不需要用到索引 ,在某些情况下,使用索引反而会花费更多的时间

  相同值较多(重复值较多)的情况下最好不要创建索引

  当对创建了索引的表进行更新时,也需要对已经存在的索引信息进行维护,更新速度也很可能会变慢

CREATE INDEX 索引名 ON 表名 (列名);
# CREATE INDEX my_ind ON tb1G (empid);
# 在表tb1G的列empid上创建名为my_ind的索引
显示索引
SHOW INDEX FROM 表名;
# 把命令最后的';'换成\G(G是大写字母),可以纵向显示列值,这样看起来会更清晰
删除索引
DROP INDEX 索引名 ON 表名;
# DROP INDEX my_ind ON tblG;
# 删除表tblG上创建的索引my_ind的示例

  ‍

更新记录
修改列的所有记录

  UPDATE命令通常在通过WHERE设置条件之后,以特定的记录为对象执行,如果没有使用WHERE设置条件,所有的列都会被替换掉

  在启动MγSOL监视器的时候可以加上 --safe-updates选项。在使用此 选项的情况下,如果列上没有WHERE条件就无法执行UPDATE或DELETE

UPDATE 表名 SET 列名 = 设置的值;
# 执行UPDATE命令后,结果中会显示××rows affected,它表示××条记录受到影响
修改符合条件的记录
UPDATE 表名 SET 列名 = 设置的值 WHERE 条件;
# 这里也可以使用LIMIT(抓取行数)和ORDER BY(排序)
UPDATE tb SET remark = '优秀' WHERE sales>=100;
# 当列sales的值大于等于100时, 向列remark中输入'优秀'
UPDATE tb 
    SET 列名 = '加油' 
ORDER BY sales 
    LIMIT 3;
# 先使用ORDER BY将列sales按升序排列,并用LIMIT 3对前3条记录进行选择,然后向列remark中输入“加油!”,最后执行UPDATE
# 对所有的列进行排序来检验结果

  ‍

复制

复制表的列结构和记录
复制列结构和记录(复制表)

  这种方法不能复制AUTO_INCREMENT等属性,AUTO_INCREMENT等属性需要在复制后再次进行设置

CREATE TABLE 新表名 SELECT * FROM 元表名;
# 建新表的同时也复制了记录
# 这种方法可能会改变列的属性,在某些MySQL的版本中’VARCHAR(1O)可能会变成CHAR(10O)。还可能不复制元表的索引等情况,所以在执行完复制操作后DESC确认表的结构,然后再使用该表
仅复制表的列结构

  不会复制表中的记录但是会复制AUTO_INCREMENT和PRIMARY KEY等列的属性

CREATE TABLE 新表名 LIKE 元表名;
# CREATE TABLE tb1_G LIKE tb1;
# 创建一个与表 tb1 具有相同列结构的空表tb1_G
复制其他表的记录
INSERT INTO 新表名 SELECT * FROM 元表名;
# INSERT INTO tb1_G SELECT * FROM tb1;
# 将表tb1的所有记录都插入到表tb1_G中
选择某一列复制
INSERT INTO 新表名 SELECT 列名 FROM 元表名;
# INSERT INTO tb1_G(name) SELECT empid FROM tb1;
# 向表tb1_G的姓名列name中插人表tb1的列empjd的记录
# 数据类型不一致可能会失败
复制指定记录
CREATE TABLE 新表名 SELECT * FROM 元表名 WHERE 列名 LIKE '字符串';
# 创建一个新表,插入原表以WHERE条件:列名为‘字符串’的列
# 若表已存在:
INSERT INTO 已存在的表名 SELECT * FROM 元表名 WHERE 列名 LIKE '字符串';
CREATE TABLE tbA_101 
    SELECT * 
FROM tb 
    WHERE empid LIKE 'A101';
# 创建一个新表tbA_101,插入原表tb的以WHERE条件,匹配列名为‘字符串’的列
排序后复制
CREATE TABLE 新表名 
    SELECT * 
FROM 元表名 
    ORDER BY 列名
DESC
    LIMIT 选择行数
OFFSET 开始移位行数
# 先对原表进行降序排列,再从第一行开始移位,从下一行进行选择固定行数复制

  ‍

删除表、数据库和记录

  记录删除后大多无法复原,所以在执行DROP或DELETE命令的时候一定要慎重

删除表
DROP TABLE 表名;
# DROP TABLE IF EXISTS 表名;(表名存在时删除,可以减少错误发生)
删除数据库
DROP DATABASE 数据库名;
删除所有记录
DELETE FROM 表名;
# 不删除表自身,只删除表中记录
删除指定记录
DELETE FROM 表名 WHERE 条件;
DELETE FROM tb1I WHERE age<30;
删除列age值小于30的记录
排序后删除(与排序后复制对应)
DELETE FROM 元表名 
    ORDER BY 列名
DESC
    LIMIT 选择行数;
# 先使用ORDER BY进行降序排列,再使用LIMIT指定要删除的记录(可以选择进一步指定)

  ‍

用命令提示符或终端来操作MγSOL(不启动MySQL监视器)

  • 使用mysqladmin命令创建和删除数据库(直接从命令提示符或终端输入)

    mysqladmin -u 用户名 -p密码 CREATE 数据库名(创建)
    mysqladmin -u 用户名 -p密码 DROP 数据库名(删除)(按Y确认)
  • 使用mysql命令执行SQL语句

mysql 数据库名 -u 用户名 -p密码 -e "命令"
# mysql db1 -u root -proot -e "SELECT * FROM tb1"
# 需要加上-e选项,并且用""将后面的命令括起来,注意是用双引号

  ‍

  ‍

设置条件的查找

以数值为条件的查找
SELECT 列名 FROM 表名 WHERE 条件;
# 显示符合条件的记录
# 如当列a的值大于等于10时, 条件可以写成a>=1O(比较运算符)

  比较运算符(和python不同,注意区分):

image-20250326175411-ir00wfr.png

  数值条件举例:

SELECT * FROM tb WHERE sales<50;
# 列sales的值小于50
SELECT * FROM tb WHERE month<>4;
# 列month的值不等于4
SELECT * FROM tb WHERE sales BETWEEN 50 AND 100;
# 列sales的值在50到100之间(大于50和小于100)
SELECT * FROM tb WHERE sales NOT BETWEEN 50 AND 200;
# # 列sales的值不在50到200之间(小于50或大于100)
SELECT * FROM tb WHERE month IN (5,6);
# 列month的值等于5或6,括号里是一个列表

  ‍

以字符串为条件的查找(含模糊查询)
SELECT * FROM tb WHERE empid='A101';
# 列empjd的内容必须与”A101“完全匹配,因此,“A0101“或“AA101”,的记录不会被提取出来

  模糊查询LIKE

  LIKE可以把包含某字符串的所有内容当成查询对象,在这种情况下,需要用到“%”和“”等通配符,当设置条件时,“%”代表任意字符串,“”代表任意一个字符

image-20250326182903-3bdjm4j.png

SELECT * FROM tb WHERE empid LIKE'A101%';
# 前方一致检索
SELECT * FROM tb WHERE empid LIKE'%A101';
# 后方一致检索
SELECT * FROM tb WHERE empid LIKE'%A101%';
# 部分一致检索
SELECT * FROM tb WHERE empid NOT LIKE'A101%';
# 不以A101开头的检索

  ‍

以NULL为条件的查找

  当列值为NULL时

SELECT * FROM tb1H WHERE age IS NULL;
# 提取表tb1H中列age为NULL的记录

  当列值为非NULL时

SELECT * FROM tb WHERE age IS NOT NULL;
# 提取表tb1H中列age不为NULL的记录

  删除重复的记录

SELECT DISTINCT empid FROM tb;
# 提取出来的empid列中会删除多余的记录

  ‍

多条件查找

  设置“○○和××”的条件,使用AND将多个条件连接起来

例如:
SELECT * FROM tb WHERE sales BETWEEN 50 AND 100;
# 列sales的值在50到100之间(大于50和小于100)
还可以写成以下形式:
SELECT * FROM tb WHERE sales>=50 AND sales<=100 ;
SELECT * FROM tb WHERE empid LIKE '%101' AND month=4;
查找empid列的最后为101,且month列值为4的记录

  设置“○○或××”的条件,使用OR将多个条件连接起来

例如:
SELECT * FROM tb WHERE sales NOT BETWEEN 50 AND 200;
# 列sales的值不在50到200之间(小于50或大于100)
还可以写成一下形式:
SELECT * FROM tb WHERE sales>=50 OR sales<=100 ;

  设置任意次数的AND和OR

SELECT * FROM tb WHERE empid LIKE '%1' AND month=4 OR sales>=200 ;
# 查找empid列的最后为1,且month列值为4的记录或销售额大于200的记录

  当AND和OR混合使用时,会优先处理AND

  如果想要优先处理OR,需要用()把想要优先处理的内容括起来

  ‍

根据条件改变筛选值
CASE
    WHEN 条件1 THEN 显示的值
    WHEN 条件2 THEN 显示的值
    WHEN 条件3 THEN 显示的值
...
ELSE 不满足所有条件时的值
END

  当使用SELECT命令显示列值,我们可以使用上述语句来记述列的内容。如果需要显示多个列,像之前一样使用”,“进行分隔即可

SELECT empid,sales,
    CASE
        WHEN sales<=100 AND sales>=80 THEN '优秀'
        WHEN sales<=80 AND sales>=60 THEN '良好'
        WHEN sales=60  THEN '及格'
        ELSE '不及格'
    END AS 评价
FROM tb;

  为CASE...END设置别名(AS),便于查看结果

  ‍

分组显示

SELECT 列名 FROM 表名 GROUP BY 用于分组的列名;
SELECT 
    empid,COUNT(*) AS 个数
FROM tb 
    GROUP BY empid;
# 按各员工(empid)进行分组,显示计算记录数COUNT(*)
SELECT 
    empid,SUM(sales) AS 个人销售总额
FROM tb 
    GROUP BY empid;
# 按各员工(empid)进行分组,显示计算个人的总销售额SUM(sales)
SELECT 
    empid,AVG(sales) AS 个人平均销售量
FROM tb 
    GROUP BY empid;
# 按各员工(empid)进行分组,显示计算个人的平均销售量AVG(sales)

排序

按升序排序显示(默认)
SELECT 列名 FROM 表名 ORDER BY 作为建的列;
# 记录会按照从小到大的顺序排列,即按升序排列
# 默认按升序显示,指定升序需要在末尾加ASC
SELECT * FROM tb ORDER BY sales;
# 让表tb按照销售额从低到高的顺序显示记录
按降序排序显示
SELECT 列名 FROM 表名 ORDER BY 作为建的列 DESC;
# 默认按升序显示,指定降序需要在末尾加DESC

  ORDER除了可以按顺序显示记录外,在设置删除更新等条件的时候也非 常有用


分组后排序

SELECT 
    empid,AVG(sales) AS 个人平均销售量
FROM tb 
    GROUP BY empid;
ORDER BY AVG(sales)
    DESC;
# 按各员工(empid)进行分组,计算个人的平均销售量AVG(sales),对各个员工平均销量进行降序排列

设置条件的分组查找

先分组再设置查找条件
SELECT 统计列 FROM 表名 GROUP BY 分组列 HAVING 条件;
SELECT 
    empid,SUM(sales) AS 个人销售量总和
FROM tb 
    GROUP BY empid;
HAVING SUM(sales)>=200;
# 对员工进行分组,统计个人总销售额SUM(sales),再对分组统计的结果进行筛选SUM(sales)>=200;
先设置查找条件再分组
SELECT 
    empid,AVG(sales) AS 个人平均销售量
FROM tb
    WHERE sales>=50 
GROUP BY empid
    ORDER BY AVG(sales)
DESC;
# 先用WHERE对sales进行筛选(设置查找条件),按员工(empid)进行分组,对员工的销售额求平均值,再平均值进行降序处理
# 最后显示empid和个人平均销售量两列的所有记录,计算并确认结果

  总记述顺序:1、WHERE条件 2、GROUP BY分组依据 3、HAVING一般在GROUP BY后面执行 4、ORDER BY排序依据

  ‍

多表使用

多表合并显示(UNION)

  一般来说,合并到一起起显示的列,其数据类型需要一致,也可以合并结构不同的表的数据

(SELECT 列名1 FROM 表名1) UNION (SELECT 列名2 FROM 表名2);
# 合并所有列时,把列名换成*,代表所有的列
# 需要合并多个表时,用UNION继续连接
# 括号里的表可以用WHERE条件选择列名,来选择需要合并的列
# 这是列合并到一起的显示,即在表的下方进行合并
按条件提取的的多表合并显示
    (SELECT 
        empid  
    FROM tb1
    WHERE sales>=200) 
UNION 
    (SELECT 
        empid  
    FROM tb2
    WHERE age>=35)
# 先提取表tb1中销售额sales大于200万元的员工empid,再提取表tb2中年龄大于35岁的empid,用UNION合并这两个表的员工列
# 这里会默认消除重复记录(自动去重)
# 如果允许记录重复,需要在UNION后面加上ALL,即
   (SELECT 
        empid  
    FROM tb1
    WHERE sales>=200) 
UNION ALL
    (SELECT 
        empid  
    FROM tb2
    WHERE age>=35)

  ‍

内连接(JOIN) - 多表连接显示

  将多个表通过某个连接键连接在一起的处理称为“连接’,内连接是把不同的表中相匹配的记录提取出来的连接方式

SELECT 表名.列名  
    FROM 表1
JOIN 要连接的表2
    ON 表1的列 = 表2的列
JOIN 要连接的表3
    ON 表1的列 = 表3的列;
# ON的后面要写上作为连接键的列的条件,例如,在连接表tb1和表tb2的情况下,由于列empld是共同的列,所以我们要设置这个列为连接键,‘ON 表1的列 = 表2的列’ 应当表示为:ON tb1.empid=tb2.empid
# 将JOIN部分写成工INNER JOIN(明确指出内连接),结果不会发生任何改变
# 要显示指定的列,必须把列名写成‘正式表名.列名’,这里的表名可以是不同的表,同一列可以重复显示
# 内连接只会提取与连接键相匹配的记录
给表添加别名
表名 AS 别名
# 可以在连接表时,将‘正式表名.列名’写成'别名.列名'
SELECT x.empid,y.name,x.sales 
    FROM tb1 AS x
JOIN tb2 AS y
    ON x.empid = y.empid;
# 指定的连接键列名可以不相同,内容相同即可,即ON x.empid = y.empidee
# 使用相同列名(共有的列)进行指定的情况下,可以使用USING进行表述,即’ON x.empid = y.empid‘可以写成’USING(empid)‘
给连接显示添加条件
SELECT tb1.empid AS 员工号,tb2.name AS 姓名,tb1.sales AS 销售额 
    FROM tb1
JOIN tb2
    USING(empid)
WHERE tb.sales>=100;
# 将表1和表2指定empid为连接键进行连接,显示列sales中大于等于100的记录

  ‍

外连接 - 多表连接显示所有记录

  外连接是其中一个个表的记录与其他表的记录在不匹配的情况下也会提取出来 所有记录的连接方式

  请避免混合使用左外连接和右外连接,可能会导致日后发生错误

左外连接(LEFT JOIN)

  显示 “相匹配的记录”和 “表1 (即左表)的全部记录”

SELECT 表名.列名  
    FROM 表1
LEFT JOIN 要连接的表2
    ON 表1的列 = 表2的列;
# 如果没有相应的数值,该列的值显示为NULL
# LEFT JOIN也可以写成LEFT OUTER JOIN

  ‍

右外连接(RIGHT JOIN)

  显示“相匹配的记录”和“要连接的表2(即右表)的全部记录”

SELECT 表名.列名  
    FROM 表1
RIGHT JOIN 要连接的表2
    ON 表1的列 = 表2的列;
# 若连接键没有数值也会显示为NULL
# RIGHT JOIN也可以写成RIGHT OUTER JOIN

  ‍

自连接 - 和同名的表进行连接

  两个同名的表进行连接,如果直接执行连接会显示出两个同名的列,这样就无法对列进行识别(发生错误),因此连接时必须定义别名

(SELECT 列名1 FROM 表名1 AS 别名1) UNION (SELECT 列名2 FROM 表名2 AS 别名2);
用自连接进行排序
SELECT tb1.name,tb2.age,COUNT(*) 
    FROM tb1 AS a
JOIN tb2 AS b  
    WHERE a.age<=b.age
GROUP BY a.empid;
# 自连接不需要指定连接键
# 设置WHERE条件a.age<=b.age之后,每组a.empid中大于等于a.age的b.age
记录就会被提取出来,之后再用COUNT(*) 计算记录个数就会得出排名

  ‍

子查询 - 从查询到的记录中查询

  使用子查询可以完成两个阶段的处理:执行查询,然后使用检索到的记录进一步执行查询。第一阶段的查询称为子查询,可以返回记录

  第一阶段处理的子查询都需要使用()括起来,忘记加()会发生错误

返回值的子查询 - 表内
提取包含最大值的记录
SELECT MAX(列名) FROM 表名;
SELECT * FROM 表名 WHERE 列名 IN (第一阶段的结果);
# 第一阶段找到列的最大值,第二阶段找到所有记录里包含最大值的记录
SELECT * 
    FROM tb 
WHERE sales 
    IN (SELECT MAX(sales) FROM tb);
# 找到sales列中最大的值,再找到所有记录里包含最大值的记录

  MAX、AVG、SUM等聚合函数也称为“GROUP BY函数”这类函数用于处理分组后的值。但是在没有"GROUP BY’的情况下,这类函数会将整个表作为一个组进行处理

  分组显示

提取大于等于平均值的记录
SELECT * 
    FROM tb 
WHERE age 
    >= (SELECT AVG(age) FROM tb);
返回列的子查询 - 可以跨表
SELECT 显示的列 FROM 表名
    WHERE 列名 IN (通过子查询SELECT提取的列);
# 第一阶段返回符合条件的列,第二阶段以包含包含该列为条件,找到所有记录里包含包含该列的记录
SELECT * 
    FROM tb2 
WHERE empid 
    IN (SELECT empid FROM tb1 sales>=200);
# 先提取表1大于等于200的记录,显示匹配empid的表2的记录

  子查询分两个步骤精确提取,而内连接每一次匹配连接都会显示出来。所以内连接在处理相同事务时,使用去重DISTINCT(加在SELECT之后)会提取与子查询同的记录

  第一阶段提取了多条记录,因此必须使用表示"之一"的IN,否则就会报错,如果第一阶段只有一条记录(排序后指定提取),就可以使用“=”替代IN

返回记录的子查询

  EXISTS:以第—阶段子查询中提取的目标记录为对象进行处理

SELECT * 
    FROM tb2 
WHERE EXISTS 
    (SELECT * FROM tb1 WHERE tb1.empid = tb2.empid);
# 第一阶段从表1里提取表1中和表2empid相同的记录,第二阶段使用EXISTS从表2中提取‘符合’第一阶段结果的记录

  NOT EXISTS:以第—阶段子查询中没有提取的目标记录为对象进行处理

SELECT * 
    FROM tb2 
WHERE NOT EXISTS 
    (SELECT * FROM tb1 WHERE tb1.empid = tb2.empid);
# 第一阶段从表1里提取表1中和表2empid相同的记录,第二阶段使用EXISTS从表2中提取‘不符合’第一阶段结果的记录
使用子查询进行排序
CREATE TABLE tb_rank LIKE tb;
ALTER TABLE tb_rank ADD c_rank INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO tb_rank
    (empid,sales,month)
(SELECT
    empid,sales,month
FROM tb
    ORDER BY sales DESC);
SELECT * FROM tb_rank;
# 1、仅复制表tb的列结构,创建表tb_rank
# 2、向表tb_rank中添加具有自动连续编号功能的列c_rank
# 3、用子查询按sales由高到低的顺序对表tb进行排序,再将列empid、sales、month的记录插入到表tb_rank中
# 4、显示表tb_rank所有的列
# c_rank列输入的自动连续编号就是sales排名

  ‍

视图

  视图不是表,但它没有实体,只是一种信息,可以按照想要的条件收集某表中某列的数据,将SELECT的结果像表一样保留下来的虚表就是视图

  视图可以进行SELECT和UPDATE(有限制),更新视图的记录之后,基表的记录也会更新

  视图的处理和表的处理基本相同

创建视图(定义视图)
CREATE VIEW 视图名 AS SELECT 列名 FROM 表名 WHERE 条件;
# 对SELECT的记录创建视图(CREATE VIEW)
# WHERE可以换成ORDER BY、LIMIT、JOIN等,即将排序、指定、合并的结果创建为视图
CREATE VIEW v1
    AS 
SELECT name,age
    FROM tb1;
SELECT * FROM v1;
# 创建由表tb1的姓名(name)与年龄(age)两个列构成的视图v1
# 显示视图v1的内容(和表的操作一样)
设置条件创建视图
CREATE VIEW v2
    AS 
SELECT tb1.empid,tb2.name,tb1.age
    FROM tb1
JOIN tb2
    USING(empid)
WHERE tb1.sales>=100;
SELECT * FROM v2;
# 先提取表1中sales列大于等于100的记录,用JOIN将提取的记录与表2连接起来(以empid列为连接键),创建视图v2
# 显示视图v2的内容
确认视图
SHOW TABLES;
# 视图和表会一起显示出来
DESC 视图名;
# 显示视图的列结构
SHOW CREATE VIEW 视图名;
# 显示视图的详细信息

  ‍

通过视图更新基表的列值
UPDATE v1 SET name='主任*佐藤' WHERE name='佐藤';
SELECT * FROM v1;
SELECT * FROM tb1;
# 更新视图的记录之后,基表的记录也会更新
更新基表时视图也会变化(满足视图条件)

  在符合视图设置条件的情况下,如果基表更新,视图中的记录也会随之更新,设置了条件的视图始终会显示与条件相匹配的记录

  ‍

视图的插入限制

  对视图执行INSERT操作是有限制的。在使用了UNION、JOIN、子查询的视图中,不能执行INSTER和UPDATE,如果只是从一个表中提取了列,就可以执行INSERT和UPDATE

INSERT INTO v1 VALUES('临时*石田',16);
SELECT * FROM v1;
SELECT * FROM tb1;
# ('临时*石田',16)此条记录插入到视图1和表1中
# 因为视图1中不存在empid列,所以在同步变化时表1的empid列会显示为NULL
对设置了条件的视图进行插入

  当通过视图INSERT记录时,即使与视图WHERE的条件不匹配,数据也会直接输入基表中(因为条件不匹配,所以不能在视图中看到)

  将视图设置成“不接受与条件不匹配的记录”,在创建视图时(CREATE VIEW),加上WITH CHECK OPTION,防止输入不匹配的记录

CREATE VIEW v4
    AS 
SELECT empid,sales
    FROM tb
JOIN sales>100
WITH CHECK OPTION;
INSERT INTO v4 VALUES('不匹配',50);
# 此时插入不符合条件的记录,就会发生错误,无法输入

  ‍

编辑视图
替换视图

  新建视图时,如果经有同名的视图存在,新建命令会报错。这时需要删除原来已存在的同名视图,创建新视图

CREATE OR REPLACE VIEW v1
    AS 
SELECT NOW();
# OR REPLACE会替换掉原来的视图v1
# NOW()会显示当前的日期和时间
修改视图结构
ALTER VIEW 视图名 AS SELECT 列名 FROM 表名;
# 对视图名进行修改操作会改变视图的内容
# 这里和表的修改相似
删除视图
DROP VIEW 视图名;
DROP VIEW IF EXISTS视图名;
# 删除的视图不存在DROP命令就会报错
# 加上IF EXISTS,即使目标视图不存在也不会报错,只是不执行删除操作

  ‍

存储过程

  存储(stored)表示保存,过程(procedure)表示步骤,存储过程是将一系列步骤归纳并存储起来的集合,只需要使用命令"CALL **"就能执行

  存储过程可以编写任意数量的SQL语句,还可以执行编程语言中常见的处理比如:使用变量、使用IF和CASE作为条件分支,使用WHILE和REPEAT反复处理等

创建存储过程
CREATE PROCEDURE 存储过程名()
BEGIN
    SQL 语句1
    SQL 语句2
END
# 创建存储过程时,需要事先将SQL语句后面的分隔符从";" 修改为其他符号,一般使用"//"(不修改MySQL监视器会直接执行";"前面的一部分内容)
# 即使不输入任何值也必须在存储过程名加上()
delimiter //
# 隔符修改为"//"
# 在END之后输入//,直接执行创建存储过程的语句
# 创建结束后,使用“delimiter ;”恢复原始设置
执行存储过程
CALL 存储过程名;
# 调用之前创建的存储过程
创建带参数的存储过程

  将需要处理的数据指定为( )中的参数,并执行存储过程

CREATE PROCEDURE 存储过程名(参数名 数据类型);
# 参数的前面加上IN会得到相同的结果(IN 参数名 数据类型)
# 要将处理结果传给参数,则需要加上OUT
delimiter //
CREATE PROCEDURE pr2(d INT) # 指定整数类型的d的值作为参数
BEGIN
SELECT * FROM tb WHERE sales>=d;
END
//
delimiter ;
执行带参数的存储过程
CALL pr2(200);
# 得到销售额大于等于200万元的记录
显示、删除存储过程
SHOW CREATE PROCEDURE 存储过程名;
# 显示存储过程的内容
DROP PROCEDURE 存储过程名;
# 删除存储过程

  ‍

存储函数(用户自定义函数)

  存储函数(stored function)的思考方式和操作方法与存储过程基本相同,但是存储函数在执行后会返回一个值

  存储函数返回的值可以在SELECT和UPDATE等命令中和普通函数—样使用

创建存储函数
CREATE FUNCTION 存储函数名(参数 数据类型) RETURNS 返回值的数据类型
BEGIN
    SQL 语句
    RETURN 返回值·表达式
END
# 括号内可以指定参数
使用存储函数

  在开启了二进制日志功能的环境,log_bin_trust_function_creators用于控制是否可以信任存储函数创建者,防止创建写入二进制日志引起不安全事件的存储函数,默认值为0(OFF)表示用户不能创建或修改存储函数,除非强制使用DETERMINISTIC、READS SQL DATA、NO SQL特性来声明函数,明确告知MySQL服务器这个函数不会修改数据

  使用前操作

SET GLOBAL log_bin_trust_function_creators=1;
# 设置参数log_bin_trust_function_creators的值为1
SHOW VARIABLE LIKE 'log_bin_trust_function_creators'
# 认设置是否巳正确修改,即参数被设置为ON
# 如果重新启动MySQL,参数的值再次变为0,需要再次执行上述操作

  先创建存储函数fu1

delimiter //
CREATE FUNCTION fu1(height INT) RETURNS DOUBLE
BEGIN
    RETURN height*height*22/10000;
END
//
delimiter ;
# 存储函数自身会返回值,必须对存储函数自身返回的值的数据类型进行指定
# 存储函数fu1返回的值包含小数,指定为可以处理小数的DOUBLE类型
 SELECT fu1(165);
# 执行存储函数fu1
# fu1()函数会返回存储函数中RETURN**的部分

  ‍

  创建存储函数fu2

delimiter //
CREATE FUNCTION fu2() RETURNS DOUBLE
BEGIN
    DECLARE r DOUBLE; #声明变量r和数据类型
    SELECT AVG(sales) INTO r FROM tb; #把SELECT提取到的均值赋值给变量r
    RETURN r; #均值r作为fu2的值返回
END
//
delimiter ;
 SELECT fu2();
#  执行存储函数fu2
显示、删除存储函数
SHOW CREATE FUNCTION 存储函数名;
# 示存储函数的内容
DROP FUNCTION 存储函数名;
# 删除存储函数

  ‍

触发器

  触发器(mgger)是-种对表执行某操作后会触发执行其他命令的机制

  当执行INSERT、UPDATE和DELETE等命令时,触发器提前设置好的操作也会被执行

  可以创建一个触发器,当某表的记录发生更新时,就以此为契机将更新的内容记录到另—个表中

触发器的时机

  'BEFORE' - 在对表进行处理之前触发

  'AFTER' - 在对表进行处理之后触发

  获得对表进行处理之前的列值和对表进行处理之后的列值:

  'OLD·列名' - 对表进行处理之前的列值

  'NEW·列名' - 对表进行处理之后的列值

image-20250403173252-v179lox.png

  即INSERT命令执行前,列值不可以取出来,DELETE命令执行后,列值也不可以取出来

创建触发器
CREATE TRIGGER 触发器名 BEFORE(或AFTER) DELETE等命令
ON 表名 FOR EACH ROW
BEGIN
    更新前(OLD.列名)或者更新后(NEW.列名)的处理
END
delimiter //
CREATE TRIGGER tr1 BEFORE DELETE 
ON tb1 FOR EACH ROW
BEGIN
INSERT INTO tb1_from VALUES(OLD.empid,OLD.name,OLD.age);
//
delimiter ;
# 以表tb1的DELETE命令设置触发器tr1,对删除之前(BEFORE)的列值进行INSERT
# 提取删除记录前(BEFORE)的列值(OLD.empid,OLD.name,OLD.age),并将其插人表tb1_from中
确认、删除触发器
SHOW TRIGGER;
# 确认触发器
DROP TRIGGER 触发器名;
# 删除触发器

  ‍

存储引擎

  存储引擎(storage engine)相互独立且允许用户自主进行选择,每个表都可以单独指定存储引擎,比如“A表是○○存储引擎’B表××存储引擎’

image-20250407151753-umvcj64.png

确认表的存储引擎

  显示表的详细信息:

SHOW CREATE TABLE tb;
# 在ENGINE=××的部分确认存储引擎
# 创建表时,在未指定存储引擎的情况下,默认选择InnoDB
修改表的存储引擎
ALTER TABLE 表名 ENGINE=MyISAM;
# 即使显示了Query OK,存储引擎也可能没有被修改
# 一定要通过SHOW来确认搜索引擎修改成功

  ‍

事务

  将多个操作作为单个逻辑工作单元处理的功能称为事务(transactjon)

  将事务开始之后的处理结果反映到数据库中的操作称为提交(commit)

  不反映到数据库中而是恢复为原来状态的操作称为回滚(rollback)

  除非开启了事务处理,否则数据修改之后无法恢复原状

  ‍

开启事务
START TRANSACTION;
# 也可以输入BEGIN或BEGINWORK
# 显示Query OK,表示事务启动
# 此时表的一部分功能会加锁(lock),在其他会话中不能对该表执行INSERT等操作,有在开启了事务的MySQL监视器中执行了‘COMMIT'或'ROLLBACK′ ,才能进行其他的会话处理

  删除表

DELETE FROM tb;
# 此时表的一部分功能会加锁(lock),在其他会话中不能对该表执行INSERT等操作,有在开启了事务的MySQL监视器中执行了‘COMMIT'或'ROLLBACK′ ,才能进行其他的会话处理

  确认表内容

SELECT * FROM tb;
# 显示了Empty Set,它表示没有记录
# 此时如果在其他命令提示符下使用MySQL监视器执行SELECT就会看到记录还在表中
使用事务

使用回滚

提交

ROLLBACK;
# 回滚,此时事务关闭,记录已经复原
# 下次使用事务需要开启
COMMIT;
# 前面的删除记录会提交,永久删除

  显示表内容

SELECT * FROM tb;
# 可以看到记录被顺利复原

  ‍

表加锁限制操作
LOCK TABLES 表名 锁的类型;
# LOCK命令通过给指定的表加上某种类型的锁来限制对表的操作
LOCK TABLES my_table READ;
# 给表my_table设置READ锁

image-20250408172406-kz7pmcq.png

  READ LOCAL对于InnDB以外的存储引擎,允许加锁以外的客户端执行非冲突性INSERT语匀,但是不允许执行UPDATE

  解锁

UNLOCK TABLES;
# 解锁当前所有的表

  ‍

  ‍

  ‍

自动提交功能(auto commit)

  当存储引擎为InnoDB时,如果执行了START TRANSACTION;(或BEGIN),在执行COMMIT命令之前就不会提交(非自动提交),回滚操作(ROLLBACK)得以执行

  如果没有事务这项功能,所有的命令都会被自动提交

  可以强制关闭自动提交功能,这时执行SQL语句,必须通过COMMIT提交,或ROLLBACK进行回滚

关闭自动提交功能
SET AUTOCOMMIT=0;
# 在自动提交功能关闭的状态下,如果没有进行COMMIT就退出MySQL,工作内容不会
反映到数据库中
恢复自动提交功能
SET AUTOCOMMIT=1;
# 通过SELECT @@AUTOCOMMIT确认当前自动提交功能的模式
# 如果是开启状态则显示为1,如果是关闭状态则显示为0
开启事务不能复原的情况
DROP DATABASE
DROP TABLE
DROP VIEW
ALTER TABLE
# 以上命令会自动提交

  ‍

文件交互

CSV文件

  在CSV文件中,数据用逗号(分隔符)隔开,文件内容包含文本, 每条记录都通过换行符用单独的一行表示

  ‍

导入(import)
导入导出准备

  打开MySQL的设置文件myj.ni,在第41行附近添加下面的部分

secuer-file-priv = ""
# 保存文件后,在MAMP的启动画面中重新启动服务器

  启动MySQL监视器,执行下面的命令,如果没有显示任何内容, 则表示成功

SELECT @@global.secure_file_priv;
# @@global是用于引用MySQL系统全局变量的关键字,连接到这个MySQL服务器的所有客
户端都会引用系统全局变量的值
# secure_file_priv用于指定允许导入、导出文件的路径
# 如果指定为空字符串"",那么任何路径都可以导入或导出文件
# 如果指定为NULL,则不能导入或导出文件

  ‍

导入文件
LOAD DATA INFILE '文件名‘ INTO TABLE 表名 选项的描述;
# 从文件中读取数据
# MySQL监视器客户端的字符编码为GBK,服务器端的字符编码为UTF-8
# 在单纯使用LOAD DATA INFILE命令输入数据的情况下,一般会使用数据库的字符
编码,读取文本文件t.csv需要使用字符编码UTF-8
# 当指定保存CSV文件的文件夹路径时,即使在Wmdows的情况下也不要使用
“\”,而要使用“/”

  除了CSV格式的文件以外,不用逗号分隔的文本文件也能被读取

  可以指定读取的数据的格式,比如指定数据之间的分隔符、换行符、以及从第几行开始读取等

  指定数据格式的选项:

FIELDS TERMINATED BY 分隔符(默认是’\t‘:Tab)
LINES TERMINATED BY 换行符(默认是’\n‘:换行)
IGNORE 最开始跳过的行 LINES(默认是0)
LOAD DATA INFILE 'C:/data/t.csv‘ INTO TABLE tb1K 
FIELDS TERMINATED BY ',';
# CSV文件tcsv使用的分隔符是“,”,通过FIELDS TERMINATED BY ','指定即可
LOAD DATA INFILE 'C:/data/t2.csv‘ INTO TABLE tb1K 
CHARACTER SET GB2312
FIELDS TERMINATED BY ',';
# 假如导入和数据库字符编码(UTF-8)不一样的,简体中文GB2312的CSV文件,需要加上CHARACTER SET GB2312部分

  ‍

导出(export)

  把数据提取到文件中的操作称为导出export,导出的文件可以在其他的数据库和系统中使用,也可以在紧急情况下作为备份使用

SELECT * INTO OUTFILE '文件名' 选项的描述 FROM 表名;
# ‘选项的描述’用于指定导出的文本文件的格式,具体方法与导入时完全相同
SELECT * INTO OUTFILE 'C:/data/out.csv‘  
FIELDS TERMINATED BY ','
FROM tb1;
# 在C:/data文件夹中创建一个名为out.csv的文件
# 可以在文本编辑器中确认导出文件的内容
# 默认导出的文件编码是UTF-8(和数据库编码相同)

  ‍

文本文件读取

  在执行复杂的SQL语句的情况下,可以将其创建为文本文件,然后执行保存的文件这种方法可以提高工作效率,还可以方便显示创建成文本文件的SQL语句,并将其复制、粘贴到MySQL监视器上执行,反复使用

执行包含SQL语句的文本文件
SOURCE 文本文件名
# 如果执行的SQL语句中包含中文,需要注意作为参数的文本文件的字符编码
# 中文文本文件的字符编码必须保存为GBK或GBK的子集GB 2312
# SOURCE不是SQL命令,所以不需要在行的最后添加分隔符
# 使用MγSOl监视器创建需要’多次创建‘的表,或者’复杂的表‘效率会很低,在这种情况可以在文本中编写处理步骤,然后执行SOURCE命令来创建表
SOURCE C:/data/sql.txt
通过命令提示符执行编写在文件中的SQL语句(不启动MySQL监视器)
mysql 数据库名 -u 用户名 -p密码 -e "MySQL监视器的命令"
# 注意要用"" (双引号)将命令括起来’而不是用’‘(单引号)
# 在-p密码、-e和"MySQL监视器的命令"之间加半角空格
# 如果不需要指定数据库名,可以省略数据库名的部分
mysql db1 -u root -proot -e "SOURCE C:/data/sql.txt"
批处理文件中的SQL命令

  将可以通过命令提示符执行的命令汇总为文本文件,编写在—个扩展名为".bat"的批处理文件中,使用起来会非常方便

  提前设置好MγSOL的路径,就可以从任何地方对MγSOL进行操作

mysql db1 -u root -proot -e "SELECT * INTO OUTFILE 'C:/data/out.csv‘  
FIELDS TERMINATED BY ','
FROM tb1"

  ‍

将SOL语句的执行结果保存到文件中
通过重定向输出到文本文件

  像键盘这种一开始就配备好的输人设备称为“标准输入”,像显示器这种一开始就配备好的输出设备称为“标准输出”,“标准输入”和“标准输出”可以更改,这个更改操作称为重定向(redirect)。更改输入、输出目标时,需要使用“>”等符号。

  • 用命令提示符重定向

    在Windows命令提示符下输入dir(如果是Linux终端则输人1s),将会显示文件和文件夹的信息,将这个执行结果保存在非标准输出的abc.txt文件中

    dir > abc.txt
    1s > abc.txt # Linux情况
    # 将dir的执行结果就写入文本文件abc.txt
    # 文本文件abc.txt会保存在执行dir命令的当前路径中
    # 在文本编辑器或命令提示符下执行typeabc.txt来确认文件内容(和执行dir的时候显示的内容相同)
  • 用mysql命令重定向

    mysql -u root -proot > log.txt # 在启动MySQL监视器时执行,忽略Warning警告
    # SQL语句的执行结果将不会显示在屏幕上,而是会输出到重定向指定的log.txt中。注意不要因为没有显示任何结果而胡乱操作
    use db1
    SELECT * FROM tb1;
    exit
    # 使用记事本等文本编辑器打开log.txt,或者在命令提示符下输入type log.
    txt。以前显示在MySQL监视器上的内容变成了文本文件
    # 如果需要显示到屏幕上,用命令提示符执行文本文件sql.txt
    mysql db1 -u root -proot -e "SOURCE C:/data/sql.txt" > log.txt

  通过重定向输入SOL语句

  使用重定向输入文件时需要使用"<",这样就可以使用重定向输入并执行文本文件中的SOL语句(sql.txt)然后再通过重定向将结果输出到文本文件( log2.txt)

mysql db1 -u root -proot C:/data/sql.txt > C:/data/log2.txt
# 看不到过程,只能通过查看文本文件确认

  ‍

使用tee命令将执行结果保存到文件中
tee 输入文件的名称
tee log3.txt
# 创建出一个空的文本文件log3.txt,以后输出结果不仅会显示在屏幕上,还会写入log3.txt中。log3.txt会保存在执行命令的当前路径
notee 
# 停止向文件中输出执行结果
exit 
# 退出MySQL监视器

  ‍

备份和恢复数据库

  将数据库的设置、表和列的定义、数据等数据库的所有信息作为文本文件导出

转储(dump) ​——对数据库的所有内容执行导出的操作称为转储
mysqldump -u 用户名 -p 密码 数据库名 > 输出文件的名称
# 转储MySQL数据库
mysqldump -u root -proot db1 > db1_out.txt
# 用MySQL服务器的默认字符编码为UTF-8,所以使用type命令确认文本内容中文部分会乱码
# 输出的是一个文本文件,可以使用编辑器确认它的内容
# 行的开头 "--" 的部分是注释,用 ”/*“ 和 ”*/“ 括起来的部分也是注释
# 在之后的操作中恢复作业失败,试着在转储时加上"--default-character-set=utf8"
mysqldump -u root -proot db1 > db1_out.txt --default-character-set=utf8
恢复(restore)——把导出的数据还原到数据库中的操作称为恢复

  在命令提示符上使用重定向将文件还原到数据库

 mysqladmin -u root -proot CREATE db2
 # 创建数据库db2,用于填充,否则会报错
 mysql -u root -proot db2 < db1_out.txt --default-character-set=utf8
 # 指定字符编码,避免发生错误


2
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区