本内容没有涉及到数据库的查询操作,如有需求,请移步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(密码)
键 | 值 |
---|---|
-h | localhost |
-P | 3306,端口号 |
-u | root,用户名 |
-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类 |
---|---|---|---|
date | YYYY-MM-DD | 从 ‘1000-01-01’ 到 ‘9999-12-31’ | LocalDate |
time | HH:MM:SS | 从 ‘-838:59:59’ 到 ‘838:59:59’ | LocalTime |
datetime | YYYY-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. 第三范式:
前提:满足第一、第二范式
确保数据表的每个字段必须和主键直接相关,而不可以间接相关
四、三大范式目的:规范数据库的设计,但是为了性能,有时故意设置冗余字段