一.数据库的基本概念
-
数据库: 数据库中存放的一般是多张表
-
表: 表是用来存放数据
-
关系: 两个表单公共字段
-
行 : 也称为叫记录 , 也叫实体
-
列 : 也称为叫字段 , 也叫属性.
数据冗余:数据冗余可以减少 , 但是不能杜绝 减少数据冗余的方法就是分表
二.数据库的操作
# 创建数据库
CREATE database student;
#显示所有数据库(了解)
show DATABASES;
#删除数据库
drop database `$%`;
# 如果存在 就删除
drop database if exists `create`;
# 选择数据库 (选中)
use student;
三.数据表的操作
#创建数据表
create table [if not exists] student1(
`字段名` 数据类型 [null | not null] [default][primary key] [comment],
`字段名` 数据类型
)[engine = 引擎的名称 ] [charset = 字符编码 ]
解释:{
primary key 主键 : 主键的值不能重复 , 不能为空 , 每张表必须只能有一个主键(其目的是为了标识每条记录,避免数据不完整)
auto_increment : 自动增长, 默认从1开始 每次递增 1
comment :备注
engine : 引擎 数据库存储的引擎 引擎决定了数据的查找和存储
默认 myisam
常用 innodb
}
#删除表
drop table [if exists] 表名;
#修改表 在修改表结构中使用的指令是 alter
ALTER TABLE 数据表名称 MODIFY 字段名 新数据类型;
#添加字段
alter table 表名 add 字段名 数据类型 [位置]
#删除字段
alter table 表名 drop 字段名;
四.数据的操作(增删改查)
#插入数据
insert into 表名 values(值1,值2)
insert into 表名 (字段1,字段2) values(值1,值2)
# 插入相关的数据
INSERT INTO stuinfo VALUE('男' , 5, '郭佳坤' ,19 , 13100001111)
#删除数据
delete from 表名 [where 条件];
#删除所有的记录
DELETE FROM stuinfo;
#更改数据
update 表名 set 字段名 = 值 [where条件]
#查询数据
select 字段名 from 表名
注(提醒):
-
DELETE FROM 和TRUNCATE TABLE的 区别
-
delete from :是遍历表记录 , 一条一条的删除
-
TRUNCATE TABLE: 将原表销毁 , 在重新创建一个同结构的新表,
-
就清空表数据而言, 第二种的效率要高
-
五.数据类型
MySQL是强类型语言,php是弱类型语言
1.整型
整型常用的有 tinyint int
整型 | 占用的字节数 | 范围(带负数) |
| |
---|---|---|---|---|
tinyint | 1 | -128~127 | 0-255 | |
smallint | 2 | -32768~32767 | 0-65535 | |
mediumint | 3 | -8388608~8388607 | 0-16777215 | |
int | 4 | -2147483648~2147483647 | 0-4294967295 | |
bigint | 8 | -9223372036854775808~9223372036854775807 | 0-18446744073909551615 |
特别注意:
选择的范围尽可能小 , 范围越小占用的资源就越少
无符号整型( unsigned )无符号整型就是没有负数
整型支持显示宽度:
Zerofill 整型支持显示宽度 , 显示带宽是最小的显示位数 ,如int(11)表示整型最少用11位数字来表示
如果不够用0 来填充 . 显示默认宽度不起作用 ,
必须要结合 zerofill来使用才能起作用
2.浮点型
浮点型 | 占用字节数 | 范围 |
float(单精度型) | 4 | -3.4E+38~3.4E+38 |
double(双精度型) | 8 | -1.8E+308~1.8E+308 |
定点数
一般用来存钱
原理:
将整型部分和小数部分分开存储
语法:
decimal(M,D)
3.字符型
数据类型 | 描述 |
char | 定长字符,最大可以到255 |
varchar | 可变长度字符,最大可以到65535 |
tinytext | 2^8^–1 =255 |
text | 2^16^–1 =65535 |
mediumtext | 2^24^–1 |
longtext | 2^32^–1 |
问(易考点):
varchar和char的区别是什么?
char 固定长度,当存入的字符串长度小于设置值时,该字段所占空间为设置的值;
varchar 可变长度,当存入的字符串长度小于设置值时,所占空间为字符串实际长度
char类型的效率比varchar的效率稍高
char最大长度是255字符,varchar最大长度是65535个字节
-
Datatime 是日期时间型
-
Year (年)
-
Time (时间)
-
在MySQL不支持布尔型(boolean)
电话号码一般使用什么数据类型存储? < varchar > varchar (字符型 )
手机号码用什么数据类型 < char(11) > (字符型)
性别一般使用什么数据类型存储? < tinyint >
年龄信息一般使用什么数据类型存储? <tinyint >
照片信息一般使用什么数据类型存储? <binary>
薪水一般使用什么数据类型存储? <decimal>
六.MySQL—约束
六大约束
1 主键(primary key):用于保证该字段的值具有唯一性并且不能为空,也起到标识列的作用
2 唯一(unique):用于保证该字段的值具有唯一性,可以为空
3 非空(not null): 用于保证该字段的值不能为空
4 默认值(default):用于保证该字段有默认值
5 检查(check):mysql中不支持,用于检查字段中是否为指定值
6 外键(foreign key):用于限制两张表的关系,用于保证该字段的值必须来自于主表的关联列的值, 在从表添加外键约束,用于引用主表中某些值
键 | 区别 |
主键 | 1、不能重复,不能为空 2、一个表只能有一个主键 |
唯一键 | 1、不能重刻,可以为空 2、一个表可以有多个唯一键 |
七.查询(重要)
-
求和 sum()
-
求平均值 avg
-
最大值 max()
-
最小值 min
-
计数 count()
-
Round 四舍五入
-
rand() 随机数
-
Abs 求绝对值
-
简单查询:
-
select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]
-
Group by 分组排序
-
语法: order by 排序字段名称 排序规则;
-
排序规则:ASC 升序 默认 DESC 降序
-
分页查询:
-
语法
-
select * from 表名 limit [起始位置],显示长度 SELECT * FROM stu LIMIT 6,3;
-
模糊查询
-
通配符
-
在Css * (所有的标签)
-
在MySQL中
-
_ [下划线] 表示任意一个字符
-
% 表示任意字符
高级查询
左外连接
select * from 表1 left join 表2 on 表1.公共字段=表2.公共字段
SELECT * FROM info LEFT JOIN scroll ON scroll.`sid` = info.`id`;
# 常用的数据类型
# mysql 有布尔型????
# 整型
# int tinyint (-127 ~ 128) smallint (-65534 ~ 65535) int(4个字节)
# 浮点型
# float doble
# 定数型(一般用在钱)
# decmal (10,2)
# 字符型
# 定长 char # 变长字符 varchar
# data时间型
# 日期 # 2022-9-7
# 时间日期 # 2022-9-7 9:23:00
八.事务
(一)事务的特征
事务必须具有以下四个属性, 简称 ACID 属性
- 原子性(Atomicity): 事务是一个完整的操作, 事务的各步操作是不可分割的(原子的),要么都执行, 要么都不执行
- 一致性(Consistency): 当事务完成时, 数据必须是一致的状态.
- 隔离性(Isolation): 对数据进行修改的所有并发事务之间是彼此隔离的
- 永久性 (Durability) : 当事务完成后, 数据库的修改是被永久保存的
(二)事务的处理
开启事务
start transaction 或
begin [word]
提交事务
commit
回滚事务
rollback
九.视图
(一)创建视图
create table 表名()
create view 视图的名字 as select * from 表名;
# 创建一个视图
CREATE VIEW vorder AS SELECT * FROM `order`;
SELECT * FROM vorder CREATE VIEW vorder1 AS SELECT num FROM `order`;
SELECT * FROM vorder1;
# 修改视图
ALTER VIEW vorder AS SELECT gid FROM `order`; SELECT * FROM vorder
# 删除视图
DROP VIEW vorder;
十.触发器和逻辑控制
(一)触发器
btn.onclick = 执行的一件事情 点击
滑入 onmouseover
移出 onmouseout
(二)事件类型
-
增加 insert
-
删除 delete
-
更改 update
(三)触发时机
-
前 before
-
后 after
(四)创建触发器
CREATE TRIGGER 触发器名字 触发器的时间 事件类型 ON 表名 FOR EACH ROW
BEGIN
代码体
END
-- test 库存
CREATE TABLE my_goods(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
price DECIMAL(10,2) DEFAULT 1,
inv INT COMMENT '库存数量')CHARSET utf8;
INSERT INTO my_goods VALUE (NULL, 'iPhone11 Pro' , 7888, 100),(NULL, 'iPhone11
Pro Max' , 9888, 100);
-- 订单
CREATE TABLE my_orders(
id INT PRIMARY KEY AUTO_INCREMENT,
gid INT NOT NULL COMMENT '商品id',
g_number INT NULL COMMENT '商品数量')CHARSET utf8
SHOW TABLES;
SELECT * FROM my_goods;
SELECT * FROM my_orders;
# 创建触发器
DELIMITER **
-- 实例
CREATE TRIGGER after_order AFTER INSERT ON my_orders FOR EACH ROW
BEGIN
-- 写的代码是 当订单表的 number 中的值插入为 2 那么就应该让库存表 - 2
UPDATE my_goods SET inv = inv - new.g_number WHERE id = new.gid;
# UPDATE my_goods SET inv = 97- 10 WHERE id = 1;
END
**
SELECT * FROM `my_goods`;
(五)查看触发器
show triggers ;
(六)删除触发器
drop trigger 触发器名字;
-- 实例
drop trigger after_order;
逻辑控制
-
假如用户购买的数量超过库存的数量
-
应该怎么办
-
代码执行的结构
-
顺序执行
-
选择执行
-
if(分支 )
-
-
循环结构
-
if 条件 then
else
end if
实例:
DELIMITER ||
CREATE TRIGGER after_order AFTER INSERT ON my_orders FOR EACH ROW
BEGIN
SELECT inv FROM my_goods WHERE id = new.gid INTO @inv;
IF @inv < new.g_number THEN
INSERT INTO xxxx VALUES(12312312);
END IF;
UPDATE my_goods SET inv = inv - new.g_number WHERE id = new.gid;
END||
DELIMITER ;
INSERT INTO `my_orders` VALUE(NULL,1,10)
十一.Mysql子程序
子程序:在js中或者在java中有一段代码的属性并且需要调用才能执行的代码块才称之为函数
(一) 创建一个存储过程
-- 语法
create procedure 存储过程的名字([参数列表])
begin
end
-- 实例
# 封装为一个存储过程
DELIMITER //
CREATE PROCEDURE queryGoods ()
BEGIN
SELECT * FROM `my_goods`;
END//
-- 调用存储过程
CALL queryGoods();