先理解相关概念:
- 数据库就是将数据存储在硬盘上,可以达到持久化存储的效果。
- DDL(Data Definition Language) : 用来操作数据库、表
- DML:对表中的数据进行增删改。
- DQL: 对表中数据进行查询操作。
- DML:对数据库、表进行权限操作,让特定用户进行访问。
通用语法
DDL
# 1.数据库
show databases; create datebase qhx;
# 查询所有数据库 # 创建名称为qhx的数据库,if not exists 则创建。
drop database qhx; use qhx; select database();
# 删除qhx数据库,if exists ,如果存在则删除 # 使qhx数据库,就能操作下面的表,# 查看当前使用数据库的名称。
# 2.表
show tables;
# 查询所有表
create table qhx (
name varchar(1),
age tinyit,
);
# 创建名称为qhx的表,,卧槽剩下的删除操作跟操作数据库一致,就改个单词。
desc qhx;
# 查询表结构
3.修改表
1.修改表名
alter table qhx rename to qhx1
2.添加一列
alter table qhx add update_time dattetime;
3.修改数据类型
alter table qhx modify address int;
# 修改qhx表中address 数据类型为int
4.修改列名和数据类型
alter table stu change address addr varchar(50);
-- 将stu表中的address字段名改为 addr,类型改为varchar(50)
5.删除列
alter table qhx drop name; # 删除qhx表中的name列。
悄悄说一句,设置自动获取时间,datatime ,默认值 current_datatime
真是情况下,一般表创建好其实就不会对表中列的数据类型和字段更改了,一般是为了练习才这样操作。
DML
DML主要是对数据进行增(insert)删(delete)改(update)操作。
1. 添加(insert)
insert into qhx (id,name) values (1,'qhx');
默认全部添加
insert into qhx values (1,'qhx');
2.删除(delete)
delete from qhx where name = 'qhx';
# 删除qhx表中为name='qhx'的一列
delete from qhx;
# 删除全部
3.修改(update)
update qhx set name='qhx',age=16 where id = 2;
# 没有加条件。默认全部修改
DQL
1. select (distinct) name (as 数学成绩) from qhx whrer id = 1
# * 默认全部字段,也可以查询多个字段, `distinct` 关键字去重重复数据。
# as 给查询字段展示的记过起别名
# 有些语法跟其他语法有些独特但是也兼容,我觉得没必要就没写了。
2. select * from stu where age in (18,20 ,22);
# 查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
3. select * from stu where english is null;
select * from stu where english is not null;
null值的比较不能使用 = 或者 != 。需要使用 is 或者 is not
4.select * from stu where name like '%焕%';
# 查询name 有焕字,%就是通配符的意思
# 真的有人把前端能实现排序的数据特意放到后端来进行排序操作?
5.select * from stu order by age (asc);
# asc 升序排列默认的,desc 降序排列
select * from stu order by age asc,math asc;
# 查询学生年龄先按学生升序排,成绩一样按成绩排。
# 分组查询
select * from stu where name like '%焕%' group by age having name = "曲焕新";
# 查询有"焕"字的列表,按照age分组,等一下一定要分组的字段(是表字段),having分组之后选出name = "曲焕新"的人。
limit 具体索引,具体方法用处具体探究。
除了as 起别名意外其他都是有效字段。
进阶语法
约束
# 约束
CREATE TABLE 表名(
id int NOT NULL auto_increment,
# 另外还有 unique,primary key(主键),check ,default.foreign key
…
);
# 非 null 且自增
# 外键约束-:删除外表之前必须要删除主表
-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
以stu表中的sch_id列和sch表中的id列为例
alter table stu add constranit fk_stu_sch foreign key(sch_id) references sch(id);
# 要知道相关的概念,也不要太在意,外键名称一般,fk_主表名_副表名
数据库设计
按照业务需求,对于数据库之间有业务联系表的之间建立最优的数据库模型。
- 一对多模式:
- 多对多模式:建立中间表。
-
# 案例:多对多模式 -- 删除表 DROP TABLE IF EXISTS tb_order_goods; DROP TABLE IF EXISTS tb_order; DROP TABLE IF EXISTS tb_goods; -- 订单表 CREATE TABLE tb_order( id int primary key auto_increment, payment double(10,2), payment_type TINYINT, status TINYINT ); -- 商品表 CREATE TABLE tb_goods( id int primary key auto_increment, title varchar(100), price double(10,2) ); -- 订单商品中间表 CREATE TABLE tb_order_goods( id int primary key auto_increment, order_id int, goods_id int, count int ); -- 建完表后,添加外键 alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id); alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);
多表查询
- 查询多个表的字段数据,
-
select * from qhx ti,wls t2 where t1.id = t2.id; # 给wls 和 qhx 起了t1 和t2别名。 # 查询qhx,wls表的所有数据展示 # 内连接:求2表交际,加个条件即可。如: select * from qhx,wls where t1.id = t2.id; # 左外连接:查询左表的全部数据 + 交集。 select * from qhx left join wls on qhx.id = wls.id; # 右外连接:左外连接,同右外连接。改个right
子查询
- 将一个表1的查询结果当做一个虚拟表来给表2查询。
事务
- 就是原子操作,理解java线程中 同步锁,是你增删改操作表位原子性操作,防止对数据进行错误修改。
- 我说一下,其实你对现在对数据库的操作,其实大部分用java或者python后端语言来操控,
- 而如java等,有专门的mybatis框架来封装,你只需知道 增删改 需要事务提交。
-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = '李四';
出现异常了... -- 此处不是注释,在整体执行时会出问题,后面的sql则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = '张三';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;