MySql教程

MySQL的简单总结

本文主要是介绍MySQL的简单总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本内容没有涉及到数据库的查询操作,如有需求,请移步MySQL的简单查询操作

01、开启数据库服务

1. MySQL服务的启动与停止

	方式一:计算机管理 ——> 服务和应用程序 ——> 服务 ——> 找到对应的服务进行操作

	方式二:

		1、 以管理员的身份打开DOS命令行

		2、 启动服务:net start 名(mysql7810)

		3、 停止服务:net stop 名(mysql7810)

2. MySQL服务的登录和退出

登录之前,服务必须是启动状态

方式一:打开MySQl的自己的DOS命令行,输入密码即可

方式二:以管理员的身份打开普通的DOS命令行,输入:"mysql -h主机名 -P端口号 -u用户名 -p密码"

		1、 输入:mysql -h localhost -P 3306(端口号) -uroot(用户名) -pxxxx(密码)

		2、 如果是在本机启动的服务,可以直接:mysql -uroot(用户名) -pxxxx(密码)
-hlocalhost
-P3306,端口号
-uroot,用户名
-p用户的密码

02、 SQL语言的介绍

SQL语言:
	结构化查询语言(Structure Query Language),专门用于与数据库通讯的语言

特点:

	1、 不是特有的语言,几乎所有DBMS都支持SQL语言

	2、 简单易学

	3、 简单,但是功能强大


规则:

	1、 不区分大小写

	2、 用 ";" 结尾,表示一条命令的结束

	3、 注释:单行 “#”  或者 “--空格”;多行”/*  */“

	4、 命令可以换行书写

03、库的管理

1. 查看权限内可使用的所有数据库
SHOW DATABASES;

2. 使用指定的数据库
USE test;

3. 查看当前正在使用哪一个数据库
SELECT DATABASE();

4. 创建一个新的数据库(字符集为utf8)
CREATE DATABASE test CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS test CHARACTER SET utf8;

5. 更改指定数据库的字符集
ALTER DATABASE test CHARACTER SET utf8;

6. 更改数据库的名称
因为SQL语言没有提供直接的命令
我们可以将数据库备份成sql文件,之后在文件中更改参数即可

7. 删除指定的数据库
DROP DATABASE test;
DROP DATABASE IF EXISTS test;

04、常见数据类型的简单总结

1. 整型

(1) 五种整数类型

类型说明字节数范围
tinyint很小的整数1有符号:-2^7 ~ 2^7-1
无符合:0 ~ 2^8-1
smallint小整数2有符号:-2^15 ~ 2^15-1
无符合:0 ~ 2^16-1
mediumint中等整数3有符号:-2^23 ~ 2^23-1
无符合:0 ~ 2^24-1
int普通整数4有符号:-2^31 ~ 2^31-1
无符合:0 ~ 2^32-1
bigint大整数8有符号:-2^63 ~ 2^63-1
无符合:0 ~ 2^64-1

(2) 无符号与有符号的比较

  • 无符号
    • 非负数
    • 相同数据类型,无符号的最大值是有符号的两倍
    • 需要手动设置无符号类型的数:num int unsigned
  • 有符号
    • 有正有负
    • 默认是有符号的数

(3) 数值显示的长度

  • 代表了数值显示的最大宽度
  • 如果不设置长度 会有 默认的长度
  • 如果超出指定的长度,会正常显示全部的数
  • zerofill关键字
    • 若是插入的数据不够指定的长度,会正常显示全部的数,而zerofill关键字会使用’0’进行填充,使其达到符合要求的长度
    • 如果插入的数值长度,则在前面补’0’
    • 例如:长度 = 8, int a = 123, 则插入表的数值是 ‘00000123’,会在前面补上对应的0

(4) 数值的范围

  • 由类型决定
  • 如果插入的数值超出了范围,会报警告(out of range),并默认临界值

(5) 代码演示

DROP TABLE IF EXISTS test;
CREATE TABLE IF NOT EXISTS test (
	t1 INT(10) ZEROFILL, # 如果不足10位,就在前面补'0',超过10位就正常显示
	t2 INT(10), # 默认是有符号位
	t3 INT(10) UNSIGNED, # 设置无符号位,即非负数
	t4 INT(10) ZEROFILL UNSIGNED, # 二者搭配使用
	t5 INT(10)
);

DROP TABLE IF EXISTS test;

2. 小数

(1) 三种小数

类型特点
float(M,D)单精度浮点型
double(M,D)双精度浮点型
decimal(M,D)定点型,可简写成dec(M,D)

(2) 两个参数

  • D:代表小数点后面的位数
  • M:整数部位和小数部位的位数之和
  • 两个参数可以省略
  • 如果不省略
    • 两部分都没有超出长度,正常显示
    • 如果某一部分超出,则显示’临界值’

(3) 定点数和浮点数

  • 浮点数
    • 浮动型默认的是没有M和D
  • 定点数
    • 定点型默认有(10, 0)
    • 定点数的精确度较高,如果要求插入的数值的精确度要求较高,则考虑使用

(4) 代码演示

DROP TABLE IF EXISTS test;
CREATE TABLE test (
	f1 FLOAT  (5, 2), # 浮点
	f2 DOUBLE (7, 3), # 浮点
	f3 DECIMAL(7, 3)  # 定点
);

INSERT INTO test 
VALUES 
(3.4,     3.4,     3.4),
(1234.5,  1234.5,  1234.5),
(12345.6, 12345.6, 12345.6);

SELECT * FROM test;

3. 日期型

(1) 三种日期类型

类型格式范围对应的Java类
dateYYYY-MM-DD从 ‘1000-01-01’ 到 ‘9999-12-31’LocalDate
timeHH:MM:SS从 ‘-838:59:59’ 到 ‘838:59:59’LocalTime
datetimeYYYY-MM-DD HH:MM:SS从’1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’LocalDateTime

(2) 代码演示

DROP TABLE IF EXISTS test;
CREATE TABLE test (
	t1 DATE, # 日期
	t2 TIME, # 时间
	t3 DATETIME, # 日期+时间
);

INSERT INTO test 
VALUES 
(NOW(), NOW(), NOW(), 
('2021-01-01', '15:26:25', '2021-1-1 15:26:25');

SELECT * FROM test;

4. 常用的文本类型

(1) 两个类型

类型对于长度len特点空间效率
char(len)可以省略不写,默认为1固定长度的字符串比较耗费空间效率高
varchar(len)不可以省略可变长度的字符串比较节省空间效率低

(2) 参数’len’

  • 表示想要保存的最大字符数
  • 如果不够,正常显示
  • 如果超出,从字符串后面截断
  • 一个数字、一个字符、一个汉字,均占一个长度

(3) 代码演示

DROP TABLE IF EXISTS test;
CREATE TABLE test (
	s1 CHAR,
	s2 CHAR(5),
	s3 VARCHAR(5)
);

INSERT INTO test 
VALUES 
('123456', '123456', '123456');

SELECT * FROM test;

5. 不常用的文本类型

(1) blob类型

  • 保存图片专用的,通过JDBC进行操作
  • 对于图片,一般保存它的链接地址,链接到图床当中

(2) enum枚举类型

  • 不区分大小写
  • 如果枚举列表中没有要插入的值,则插入空值
  • 插入的数据只可以是枚举列表中的一个
  • 可以插入整数’n’,代表在枚举列表中元素的序号,从1开始
  • 语法:ENUM(枚举1, 枚举2, … , 枚举n)

(3) set集合类型

  • 不区分大小写
  • 如果集合列表中不存在插入的值,则插入空值
  • 只可以选择set集合中的一个或多个
  • 语法:SET(元素1, 元素2, … , 元素n)

(4) 代码演示

DROP TABLE IF EXISTS test;
CREATE TABLE test (
	enums ENUM('a', 'b', 'c'),
	sets  SET ('a', 'b', 'c')
);

INSERT INTO test VALUES
(2, 'a'), # b a
(1, 'b'), # a b
(5, 'a'), # null a
('b', 'b');  # b b

SELECT * FROM test;

05、常用的函数

1. 字符函数

# 1. length():获取参数的字节个数
SELECT LENGTH('aaa'); # 一个字母占一个字节(utf8)
SELECT LENGTH('中国人'); # 一个中文3个字节(utf8)


# 2. upper()、lower():大小写转换
SELECT UPPER('Abc'); # ABC
SELECT LOWER('Abc'); # abc 


# 3. concat():拼接字符串
SELECT CONCAT('aaa', 'bbb'); # aaabbb
SELECT CONCAT('a', 'b', 'c'); # abc


# 4. trim():去掉前后字符(默认去掉空格,可以指定去掉前后字符)
SELECT LENGTH(' abc '); # 5
SELECT LENGTH(TRIM(' abc ')); # 3【默认去掉空格】
SELECT TRIM('a' FROM 'aaaa1234aa'); # 1234【去掉字符串前后两边的字符'a'】


# 5. instr(str1, str2):返回str2在str1中第一次出现的索引,找不到返回0(索引从1开始)
SELECT INSTR('123456_123456', '123'); # 1
SELECT INSTR('123456_123456', '_123456'); # 7
SELECT INSTR('123456_123456', '0123'); # 0


# 6. replace(str, a, b) 将str中的a全部替换成b
SELECT REPLACE('你是大XX,你个XX', 'XX', '***');


# 7. substr(str, pos, [len]):截取字符串【或者:substring(str, pos, [len])】
SELECT SUBSTR('12345', 1); # 12345 【截取字符串[pos - last](索引从1开始)】
SELECT SUBSTR('12345', 2); # 2345
SELECT SUBSTR('123456789', 1, 1); # 1 【截取字符串[pos - (pos + len - 1)](索引从1开始)】
SELECT SUBSTR('123456789', 1, 3); # 123


# 8. 字符串填充【lpad(str, len, chr)、rpad(str, len, chr)】
    # 不够->补,按方向补指定的字符
    # 超出->截,均在右边截断
# lpad():左填充
SELECT LPAD('wangks', 8, '+'); # ++wangks【在左边补充2个字符'+',使其长度为8】
SELECT LPAD('wangks', 5, '+'); # wangk【截断右边的字符's',使其长度为5】

# rpad():右填充
SELECT RPAD('wangks', 8, '+'); # wangks++【在右边补充2个字符'+',使其长度为8】
SELECT RPAD('wangks', 5, '+'); # wangk【截取右边的字符's',使其长度为5】

2. 数学函数

# 1. 绝对值【abs(s)】
SELECT ABS(-1), ABS(1);

# 2. 平方根【sqrt(x)】
SELECT SQRT(4), TRUNCATE(SQRT(5), 5);

# 3. 求余【mod(a, b):结果的正负由 a 决定】
SELECT MOD(12, 5); # 2
SELECT MOD(-12, 5); # -2
SELECT MOD(-12, -5); # -2
SELECT MOD(12, -5); # 2

# 4. 幂运算【pow(a, b)】
SELECT POW(2, 4);
SELECT POW(2, 10); 

# 5. 数字截断,直接截断小数点指定位数后面的数【truncate(x, len)】
SELECT TRUNCATE(1.699, 2); # 1.69
SELECT TRUNCATE(1.699, 0); # 1

# 6. 四舍五入【round(x)、round(x, len)】 
SELECT ROUND(1.1); # 1【直接保留到整数位】
SELECT ROUND(1.568, 2); # 1.57【指定小数点保留的位数】

# 7. PI的使用【pi():默认显示后6位】
SELECT PI();

# 8. ceil  向上取整,返回 >=本身 的 最小整数
SELECT CEIL(1.1); # 2
SELECT CEIL(1.0); # 1


# 9. floor 向下取整,返回 <=本身 的 最大整数
SELECT FLOOR(1.1); # 1
SELECT FLOOR(1.0); # 1

3. 日期函数

# 1. 【now():返回当前系统的 日期和时间】
SELECT NOW();


# 2. 【curdate():返回当前系统的 日期】
SELECT CURDATE();


# 3. 【curtime():返回当前系统的 时间】
SELECT CURTIME();

 
# 4. 获取指定时间的年、月、日、时、分、秒
SELECT YEAR(NOW()); # 获取参数 的 年 
SELECT YEAR('1212-5-5'); # 1212

SELECT MONTH(NOW()); # 获取参数 的 月  
SELECT MONTH('1212-5-5'); # 1212

SELECT DAY(NOW()); # 获取参数 的 日  
SELECT MONTH('1212-5-5'); # 5 

SELECT HOUR(NOW()); # 获取参数 的 时
SELECT HOUR('2021-08-17 18:49:58'); # 18

SELECT MINUTE(NOW()); # 获取参数 的 分
SELECT MINUTE('2021-08-17 18:49:58'); # 49

SELECT SECOND(NOW()); # 获取参数 的 秒 
SELECT SECOND('2021-08-17 18:49:58'); # 58


# 5. 【DATEDIFF(d1, d2):返回两日期之间的天数之差,d1 - d2】
SELECT DATEDIFF('2001-12-15', NOW()); # 7148


/*
%Y:年,4位数的年
%m:月,01 02 03...
%d:日,01 02 03...
%H:时,24小时制
%i:分,00 01 02...
%s:秒,00 01 02...
--------------------------
%y:年,2位数的年
%c:月,1 2 3 4....
%h:时,12小时制
*/
# 6. 【date_format(date, str):日期 --> 字符串】
SELECT DATE_FORMAT(NOW(), '%Y--%d--%m');
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日');


# 7. 【str_to_date(str1, tr2):字符串 --> 日期
SELECT STR_TO_DATE('12++2001++29', '%m++%Y++%d'); # 2001-12-29
SELECT STR_TO_DATE('2021年9月7日 8点2分0秒', '%Y年%m月%d日 %H点%i分%s秒'); # 2021-09-07 08:02:00

4. 多行函数

  • 对非数值类型使用多行函数时,不会报错,但是无意义,应当作错误处理
# 1. sum、avg、max、min【求和、平均值、最大值、最小值】
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;



# 2. count【求个数,count(*)效率较好,绝对的忽略null值】
SELECT COUNT(*) FROM employees; # 求该表共有几行
SELECT COUNT(`commission_pct`) FROM employees; # 求有几行,但是参数为null的行不计算

SELECT COUNT(1) FROM employees; # 新增一列,每行的新列都是1,统计1的个数,即实现了统计行数
SELECT COUNT(2) FROM employees; # 新增一列,每行的新列都是2,统计2的个数,即实现了统计行数
SELECT COUNT('++--') FROM employees; # 新增一列,每行的新列都是++--,统计++--的个数,即实现了统计行数



# 3. continct 去重
SELECT COUNT(DISTINCT `job_id`) FROM employees; # 统计有多少个部门,先对部门id去重,求有多少行
SELECT DISTINCT IFNULL(department_id, 'xxx') FROM employees; # 查找员工表里面所有的部门id

5. 其他函数

# 1. 别名函数【as 或 空格】
SELECT POW(2, 10) AS 幂次方;
SELECT MOD(51, 2); 取余


# 2. 设置字符集
SET NAMES gbk;
SET NAMES utf8;


# 3. 查看版本号
SELECT VERSION(); # 5.5.54


# 4. 代表当前用户
SELECT USER();


# 5. IFNULL(a, b) 当a为null时返回b,否则返回a
SELECT IFNULL(NULL, '是null');
SELECT IFNULL(NULL, '是null');


# 6. 另类的加号‘+’【在MySQL中,‘+’仅表示运算符的加号】
/*
      6.1 两个数值型,直接相加
	
      6.2 有字符型,将其转换成数字型,如果成功,继续加法运算,否则将字符型转换成0
		
      6.3 如果其中有一个null,则结果一定为null
*/
SELECT 100 + 100; # 200
SELECT 100 + 100 + NULL; # null
SELECT 100 + 100 + '123'; # 323
SELECT 100 + 100 + 'abc'; # 200


# 7. 查看创建表时的SQL语句:【show create table 表名】
SHOW CREATE TABLE test;

06、常见约束、标识列

1. 六大约束

  • 用于限制表中的数据,保证表中数据的一致性
  • 外键的特点
    • 设置外键约束的表叫做从表,与其关联的表叫做主表
    • 从表的那一个字段的类型要与主表那一个字段的类型 一致或兼容
    • 要求主表的关联列必须是一个key(主键、唯一键)
    • 插入数据时,先插入主表,在插入从表
    • 删除数据时,先删除从表,在删除主表
    • 修改、删除主表时,必须先删除外键的关系
类型说明级别常用级别
not null(非空约束)该字段的值不可以为空列级列级
default(默认约束)该字段有默认的值列级列级
primary key(主键约束)该字段的值具有唯一性、非空性【一个表中,最多有1个主键】列级、表级列级
unique(唯一约束)该字段的值具有唯一性,但是可以为空列级、表级表级
check(检查约束)mysql中不支持
foreign key(外键约束)该字段的值必须来自主表的关联列的值表级表级

2. 标识列

  • 含义:又称为自增长列,可以不用手动的插入值,系统会提供默认的序列值
  • 语法:【字段名 类型 约束 auto_increment】
  • 特点
    • 一个表只可以有一个标识列【※】
    • 标识符可以和 是key的列 搭配
    • 标识列的类型,只可以是 数值型,一般是int
    • 标识列可以通过 set auto_increment_increment=n; 设置步长
    • 第一条插入的数据如果没有指定标识列的值的话,默认为1
    • 可以通过手动插入第一条数据,来设置标识列的起始值

3. 约束的使用

(1) 创建表时添加约束

# 主表
DROP TABLE IF EXISTS otherTable;
CREATE TABLE IF NOT EXISTS otherTable (
	id INT,
	UNIQUE KEY (id)
);


# 从表
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo (
	`id` INT(20), # 主键
	`name` VARCHAR(50) NOT NULL,
	`nationals` VARCHAR(20) NOT NULL DEFAULT 'Chines',
	`age` INT(20) NOT NULL DEFAULT 999,
	`numbers` VARCHAR(30), # 唯一键
	`majorId` INT, # 外键
	
	
	PRIMARY KEY `bieming1` (id), # 起别名、表级约束
	UNIQUE KEY `bieming2` (numbers), # 起别名、表级约束
	CONSTRAINT fk_stuinfo_otherTable FOREIGN KEY(`majorId`) REFERENCES otherTable(id)
	# 外键的别名:fk_从表的名字_主表的名字
);

(2) 修改表时修改约束

  • 可以从无到有,也可以从有到无,或者是修改
  • 两种级别的写法
    • 列级约束
      • 不支持起名字
      • ALTER TABLE 表名 MODIFY COLUMN 字段名 类型 约束类型;
    • 表级约束
      • 支持起名字
      • ALTER TABLE 表名 ADD 【contraint 别名】 约束类型(字段名) 【外键的引用】;
# 主表
DROP TABLE IF EXISTS otherTable;
CREATE TABLE IF NOT EXISTS otherTable (
	id INT,
	UNIQUE KEY(id)
);

# 从表
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo (
	`id` INT(20) UNIQUE, # 主键
	`name` VARCHAR(50), # 非空
	`nationals` VARCHAR(20), # 默认
	`numbers` VARCHAR(30), # 唯一
	`majorId` INT # 外键
);


# ====================================================================================


# 1. 非空约束
ALTER TABLE stuinfo MODIFY COLUMN `name` VARCHAR(20) NOT NULL; # 列级

# 2. 默认约束
ALTER TABLE stuinfo MODIFY COLUMN `nationals` VARCHAR(20) DEFAULT 'Chines'; # 列级

# 3. 主键
ALTER TABLE stuinfo ADD PRIMARY KEY(id); # 表级

# 4. 唯一键
ALTER TABLE stuinfo ADD UNIQUE KEY(numbers); # 表级
ALTER TABLE stuinfo ADD CONSTRAINT `otherName1` UNIQUE KEY(numbers); # 表级

# 5. 外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorId) REFERENCES major(id); # 表级
ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES otherTable(id); # 表级

(3) 修改表时删除约束

# 主表
DROP TABLE IF EXISTS otherTable;
CREATE TABLE IF NOT EXISTS otherTable (
	id INT,
	UNIQUE KEY(id)
);


# 从表
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE IF NOT EXISTS stuinfo (
	`id` INT(20), # 主键
	`name` VARCHAR(50) NOT NULL,
	`nationals` VARCHAR(20) NOT NULL DEFAULT 'Chines',
	`age` INT(20) NOT NULL DEFAULT 999,
	`numbers` VARCHAR(30), # 唯一键
	`majorId` INT, # 外键
	
	
	PRIMARY KEY `bieming1` (id), # 起别名、表级约束
	UNIQUE KEY `bieming2` (numbers), # 起别名、表级约束
	CONSTRAINT fk_stuinfo_otherTable FOREIGN KEY(`majorId`) REFERENCES otherTable(id)
	# 外键的别名:fk_从表的名字_主表的名字
);


# ====================================================================================


# 1. 删除非空
ALTER TABLE stuinfo MODIFY COLUMN `name` VARCHAR(20);
ALTER TABLE stuinfo MODIFY COLUMN `name` VARCHAR(20) NULL;

# 2. 删除默认
ALTER TABLE stuinfo MODIFY COLUMN `nationals` INT;
ALTER TABLE stuinfo MODIFY COLUMN `nationals` INT NULL;

# 3. 删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;

# 4. 删除唯一键【未成功】
ALTER TABLE stuinfo DROP INDEX numbers;

# 5. 删除外键约束【未成功】
ALTER TABLE stuinfo DROP CONSTRAINT fk_stuinfo_otherTable; 

4. 标识列(自增长列)的使用

# 1. 创建表时添加标识列
DROP TABLE IF EXISTS autos;
CREATE TABLE autos (
	`id` INT AUTO_INCREMENT,
	`name` VARCHAR(20) NOT NULL,
	
	PRIMARY KEY(`id`)
);

# 2. 修改表时添加标识列
ALTER TABLE autos MODIFY COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

# 3. 修改表时删除标识列
ALTER TABLE autos MODIFY COLUMN id INT PRIMARY KEY;

# 4. 设置步长
SET auto_increment_increment = 2; 

# 6. 清空所有数据时,有自增长字段
DELETE FROM autos; # 下次插入数据时,自增长列的值依然从断点处自增
TRUNCATE TABLE autos; # 下次插入数据时,自增长列的值从1开始

07、表的管理

1. 常用的简单操作

# 1. 查看当前库中所有的表
SHOW TABLES;

# 2. 查看创建表时的SQL语句:【show create table 表名】
SHOW CREATE TABLE stuinfo;

# 3. 清空表
TRUNCATE TABLE stuinfo;
DELETE FROM stuinfo;

2. 表的管理操作

# 1. 创建 Book表
CREATE TABLE books(
	id INT,
	bName VARCHAR(20),
	price DOUBLE,
	authorId VARCHAR(20),
	publishDate DATETIME
);

# 2. 修改字段名:要求修改字段名的时候,一定要加上字段的数据类型
ALTER TABLE books CHANGE COLUMN publishDate pubDate DATETIME;

# 3. 修改字段的类型、约束、标识列
ALTER TABLE books MODIFY COLUMN `id` INT;
ALTER TABLE books MODIFY COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT; # 注意:标识列只可以和键级约束搭配

# 4. 添加新字段
ALTER TABLE books ADD COLUMN price DOUBLE DEFAULT 0;

# 5. 删除字段
ALTER TABLE books DROP COLUMN price;

# 6. 修改表名
ALTER TABLE books RENAME TO books_;

# 7. 表的删除
DROP TABLE IF EXISTS books;

# 8. 表的复制【用到的时候再查】

08、数据的增删改

# 1. 插入数据
INSERT INTO tab_date(`id`, `name`) VALUES(1, 'Tom');
INSERT INTO tab_date VALUES(2, 'Jarry');
INSERT INTO tab_date SET `id` = 3, `name` = 'Jacck';


# 2. 修改单表的数据
UPDATE tab_date SET `name` = 'Toms' WHERE `id` = 1;
UPDATE tab_date SET `name` = 'Tom' WHERE `id` = 1;


# 3. 修改多表的数据
# 案例 -- 将id=4的男生的女朋友的手机号修改为'12345654321'
UPDATE beauty b
LEFT JOIN boys bo ON b.`boyfriend_id` = bo.`id`
SET b.phone = 'xxxxx'
WHERE bo.id = 4;


# 4. 删除单表的一条数据
DELETE FROM tab_date WHERE id = 1;


# 5. 清空数据
TRUNCATE tab_date;


# 6. delete和truncate的区别
/*
    1. delete 可以加WHERE 条件,TRUNCATE不能加
    2. truncate删除,效率高一点点
    3. 假如要删除的表中有自增长列
        -- 用DELETE删除后,  再次插入数据,自增长列的值从断点开始
        -- 用TRUNCATE删除后,再次插入数据,自增长列的值从1开始
    4. truncate删除没有返回值,DELETE删除有返回值
    5. truncate删除不能回滚,DELETE删除可以回滚	
*/


# 7. 删除和A表的一条数据有关的B表中的记录【多表删除】  
/*
    【sql92语法】
	delete a, b
	frOM 表1, 表2
	on 连接条件
	wherE 筛选条件

    【sql99语法】
	delete a, b
	from 表1
	(inner|lefT|RIGhT) JoIN 表2 ON 连接条件
	where 筛选条件
*/
# sql99:可以只删一个表,也可以两个表都删除
DELETE be
FROM boys b
INNER JOIN beauty be
ON b.id = be.boy_id
WHERE b.id = 1;


# sql92:只可以实现两个表都删除
DELETE be, b
FROM beauty be, boys b
ON b.id = be.boy_id
WHERE b.id = 1;

09、数据库的备份

# 方式1:直接拷贝物理文件

# 方式2:在SQLyog工具中手动导出
    1. 在想要导出的表或库 右键 选中导出
    2. 一般限制导出 结构 和 数据
    
# 方式3:使用命令行
1. 	导入
	# 导入一个表
	# 1. 登录服务
	# 2. 选择库
	# 3. source 备份文件 

	# 导入一个库
	# 1. 登录
	# 2. 直接导入库
	
2. 导出【mysqldump:不是SQL命令,故不可以登录sql之后再使用此命令】
	# 2.1 导出一个表
	# mysqldump -h主机 -u用户名 -p 库 表 > 地址
	mysqldump -hlocalhost -uroot -p pdsu other > D:/a.sql


	# 2.2 导出多个表 
	# mysqldump -h主机 -u用户名 -p 库 表1 表2 表3 > 地址
	mysqldump -hlocalhost -uroot -p pdsu other otherTable > D:/a.sql


	# 2.3 导出一个库
	# mysqldump -h主机 -u用户名 -p 库 > 地址
	mysqldump -hlocalhost -uroot -p pdsu > D:/a.sql

10、MD5加密(单向加密,不可恢复)

DROP TABLE IF EXISTS tab_md5;
CREATE TABLE IF NOT EXISTS tab_md5 (
	`id` INT(20),
	`pwd` VARCHAR(50)
);


# 1. 插入明文
INSERT INTO tab_md5 VALUES
(1, '123'),
(2, '123456');


# 2. 插入密文
INSERT INTO tab_md5 VALUES
(3, MD5('123')),
(4, MD5('123456'));


# 3. 明文与密文的校验
SELECT *
FROM tab_md5
WHERE `id` = 4 AND `pwd` = MD5('123456');


# 4. 修改明文为密文
UPDATE tab_md5 SET `pwd` = MD5(`pwd`) WHERE id = 1; # --- 修改单独一个
UPDATE tab_md5 SET `pwd` = MD5(`pwd`); # --- 修改全部

11、用户管理

# 用户管理的本质:对MySQL库下面的user表进行增删查改

# 1. 方式一:SQLyog可视化管理

# 2. 方式二:cmd
    # 1. 创建用户
    CREATE USER wangks IDENTIFIED BY '123456';

    # 2. 修改当前用户密码
    SET PASSWORD = PASSWORD('7810');

    # 3. 修改指定用户密码
    SET PASSWORD FOR wangks = PASSWORD('123456');

    # 4. 用户重命名
    RENAME USER wangks TO newwangks;

    # 5. 删除用户
    DROP newwangks;

    # 6. 授予用户部权限【除了不可以给别人这种权限,其余和root一样】
    GRANT ALL PRIVILEGES ON *.* TO wangks1; 

    # 7. 查看指定用户的权限
    SHOW GRANTS FOR newwangks;

    # 8. 查看管理员权限
    SHOW GRANTS FOR root@localhost;

12、数据库的设计

	
	一、糟糕的数据库
	
		1. 数据冗余,浪费空间
		2. 数据库的插入和删除麻烦
		3. 可能有异常
		4. 性能差
	
	
	二、良好的数据库
	
		1. 节省内存空间
		2. 保证数据库的完整性
		3. 方便我们开发系统


	三、三大范式
	
		1. 第一范式:要求数据库的每一列都是不可分割的原子数据项【原子性】
		
		2. 第二范式:
			前提:满足第一范式
			确保数据表的每个字段和主键相关,而不能只与主键的某一部分相关
			每张表只描述一件事情
			
		3. 第三范式:
			前提:满足第一、第二范式
			确保数据表的每个字段必须和主键直接相关,而不可以间接相关


	四、三大范式目的:规范数据库的设计,但是为了性能,有时故意设置冗余字段


这篇关于MySQL的简单总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!