目录
[删除表: 编辑](#删除表: 编辑)
[DML (表的操作):](#DML (表的操作):)
[insert 添加数据](#insert 添加数据)
[update 修改数据](#update 修改数据)
[delete 删除数据](#delete 删除数据)
[DQL(表内容的查询操作) :](#DQL(表内容的查询操作) :)
常见的数据类型:
数字类型:
分为有符号(signed)和无符号(unsigned)类型,有符号类型有负数,无符号就是都是正数,把有符号类型的负数给了正数
小数: 单精度float (5, 2):5表示的是数字的长度,2表示的是小数位个数,双精度double ,小数值decimal精度更高
字符串类型:
char(10):最多只能存10个字符,占用10个字符空间 (性能高) (浪费空间)
varchar(10): 最多只能存10个字符,不足10个,按照实际长度存储 (性能低) (节省空间)
日期时间类型:
DDL(数据库的操作):
查询所有的数据库: show databases;
查询当前的数据库: select database();
创建: create database 你要创建的数据库名字
sql
-- 表的创建
create table tb_user (
id int comment 'ID,唯一标识',
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
创建表的时候 还可以进行约束
主键加上 auto_increment 表示的是 不写 他是自动增长,默认是从1开始的
sql
-- 表的创建
create table tb_user (
id int primary key comment 'ID,唯一标识', -- 主键约束
username varchar(20) not null unique comment '用户名',-- 非空且唯一
name varchar(10) not null comment '姓名',-- 非空
age int comment '年龄',
gender char(1) default '男' comment '性别' -- 默认值是 男
) comment '用户表';
删除: drop database 你要删除的数据库名字
使用: use 数据库名字
表的创建&查询:
show tables: 查询当前数据库里面的所有表
desc **表名:**查询表的结构
desc就是知道你这个表里面的框架是什么 有什么比如 名字啊 年龄啊 .....
show create table 表名: 查询指定表的建表语句
修改表结构:
在英语中,"alter"是一个动词,意思是改变、修改或调整。
代码:
sql
-- 修改: 为表 tb-user 添加字段 qq varchar(11)
alter table tb_user add qq varchar(11) comment 'QQ';
-- 修改: 修改 字段类型 qq 为varchar(13)
alter table tb_user modify qq varchar(13) comment 'QQ';
-- 修改: 修改新的字段名
alter table tb_user change qq qq_num varchar(13) comment 'QQ';
-- 修改: 删除 qq_num字段
alter table tb_user drop column qq_num;
-- 修改: 修改表的名字
rename table tb_user to tb_new_user;
删除表:
DML (表的操作):
增 删 改 查操作
insert添加数据
sql
-- 添加数据 insert
-- 为指定数据添加字段 insert into 表名 (字段名1, 字段名2) values (值1, 值2)
insert into tb_user (id, username) values (1, 'FindYou.');
-- 全部字段添加数据 insert into 表名 values (值1, 值2, ....)
insert into tb_user values (2, 'FindYou.', 'Who', 20, '男');
-- 批量操作 添加数据 就用()和逗号进行分割 (值1, 值2), (值1, 值2),....;
update修改数据
sql
-- 修改数据 不写where就会修改全部 update 表名 set 字段名 = 新的值 where 限制
update tb_user set name = '张三' where id = 1;
delete 删除数据
sql
-- 删除数据
-- delete from 表名 where 限制
delete from tb_user where id = 2;
DQL(表内容的查询操作) :
语法:
基本查询:
select 你要查找的内容 from 表名 where 限制的条件
sql
-- DQL 查询表
-- 查询表里面全部的数据
-- * 代表的是全部 但是性能比较低
select * from tb_user;
-- 查询指定字段 多个字段之间用逗号隔开
select id, name from tb_user;
-- 查询所有的名字 不要重复 distinct
select distinct name from tb_user ;
-- 查询的时候可以起个别名
select name 姓名 from tb_user;
条件查询:
就是在基础查询的基础上加上where进行限制
比较运算符:
between A and B 范围是[A, B],注意 包括A和B
in(.......) 在in之后的列表中的值,多选一
like 模糊匹配( **_**匹配单个字符, % 匹配任意字符)
is null 是null
sql
-- 查询 没有年龄的员工的姓名
select name from tb_user where age is null ;
-- 查询 年龄不等于20的员工的所有信息
select * from tb_user where age != 20;
-- 查询年龄在18到25之间的员工的信息
select * from tb_user where age between 18 and 25;
-- 查询名字为两个字的信息
select * from tb_user where name like '__';
-- 查询姓 '张' 的人的信息
select * from tb_user where name like '张%';
聚合函数:
sql
-- 聚合函数
-- 统计人的总数 -- count
-- A count(字段) 下面这个表示的就是 id 的个数
select count(id) from tb_user;
-- B count(常量)
select count('A') 数量 from tb_user;
select count(*) from tb_user;
-- 统计年龄的最大值 -- max
select max(age) from tb_user;
-- 统计年龄的平均值 -- avg
select avg(age) from tb_user;
分组查询:
sql
-- 分组
-- 根据性别进行分组 统计每个组之间的总数
select gender, count(*) from tb_user group by gender;
-- 分组之后的数据要写在 having 的后面
排序查询:
order by 字段 升序还是降序; 注意 字段是在升序还是降序的前面的
sql
-- 排序
-- 默认是升序的 按照年龄进行升序
select * from tb_user order by age;
-- 按照年龄进行降序排序
select * from tb_user order by age desc ;
分页查询:
sql
-- 分页查询
-- 1 从起始索引0开始查询 每页展示5条数据
select * from tb_user limit 0, 5;
-- 查询第1页的数据 每页展示5条数据
select * from tb_user limit 0, 5;
-- 查询第2页的数据 每页展示5条数据 注意起始索引是从0开始的
select * from tb_user limit 5, 5;
-- 查询第3页的数据 每页展示5条数据 注意起始的索引是从0开始的
select * from tb_user limit 10, 5;
-- 起始索引 = (页码 - 1) * 每一页展示的数量
多表设计:
一对多:
外键约束:
物理外键添加演示:
以上是物理外键,物理外键的缺点:
因此我们要选择的是逻辑外键 :
一对一:
多对多:
多表查询:
从多张表里面查询数据,要是直接select * from 表A, 表B; 这样返回的数量是 A的数据量*B的数据量,这个称之为笛卡尔集;因此咱们要进行限制,咱们要得到有效的数据,消除无效的数据
sql
-- 多表查询
-- 员工
create table tb_emp (
id int unsigned primary key auto_increment comment' ID' ,
username varchar (20) not null unique comment '用户名',
password varchar(32) default ' 123456' comment ' 密码',
name varchar (10) not null comment '姓名' ,
gender tinyint unsigned not null comment '性别, 说明: 1男,2女',
image varchar (300) comment '图像',
job tinyint unsigned comment '职位, 说明: 1班主任,2讲师,3学工主管,4教研主管',
entrydate date comment ' 入职时间' ,
dept_id int unsigned comment '归属的部门ID',
create_time datetime not null comment ' 创建时间',
update_time datetime not null comment ' 修改时间'
)comment '员工表';
-- 部门
create table tb_dept (
id int unsigned primary key auto_increment comment '主键ID',
name varchar(10) not null unique comment '部门表',
create_time datetime not null comment ' 创建时间',
update_time datetime not null comment ' 修改时间'
)comment '部门表';
-- 插入测试数据
insert into tb_dept (id, name, create_time, update_time) values
(1, '学工部' ,now() ,now()), (2, '教研部' ,now() ,now()), (3, '咨询部' ,now() ,now()),
(4,'就业部',now(),now()),(5,'人事部',now(),now());
INSERT INTO tb_emp (id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time) VALUES
(1, 'jinyong', '123456', '金庸', 1, '1.jpg', 4, '2000-01-01', 2, now(), now()),
(2, 'zhangwuji', '123456', '张无忌', 1, '2.jpg', 2, '2015-01-01', 2, now(), now()),
(3, 'yangxiao', '123456', '杨逍', 1, '3.jpg', 2, '2008-05-01', 2, now(), now()),
(4, 'weiyixiao', '123456', '韦一笑', 1, '4.jpg', 2, '2007-01-01', 2, now(), now()),
(5, 'changyuchun', '123456', '常遇春', 1, '5.jpg', 2, '2012-12-05', 2, now(), now()),
(6, 'xiaozhao', '123456', '小昭', 2, '6.jpg',3,'2013-09-05', 1, now(), now()),
(7, 'jixiaofu', '123456', '纪晓芙', 2, '7.jpg', 1, '2005-08-01', 1, now(), now()),
(8, 'zhouzhiruo', '123456', '周芷若', 2, '8.jpg', 1, '2014-11-09', 1, now(), now()),
(9, 'dingminjun', '123456', '丁敏君', 2, '9.jpg', 1, '2011-03-11', 1, now(), now()),
(10, 'zhaomin', '123456', '赵敏', 2, '10.jpg', 1, '2013-09-05', 1, now(), now()),
(11, 'luzhangke', '123456', '鹿杖客', 1, '11.jpg', 1,'2007-02-01', 1, now(), now()),
(12, 'hebiweng', '123456', '鹤笔翁', 1, '12.jpg', 1, '2008-08-18', 1, now(), now()),
(13, 'fangdongbai', '123456', '方东白', 1, '13.jpg', 2, '2012-11-01', 2, now(), now()),
(14, 'zhangsanfeng', '123456', '张三丰', 1, '14.jpg', 2, '2002-08-01', 2, now(), now()),
(15, 'yulianzhou', '123456', '俞莲舟', 1, '15.jpg', 2, '2011-05-01', 2, now(), now()),
(16, 'songyuanqiao', '123456', '宋远桥', 1, '16.jpg', 2, '2010-01-01', 2, now(), now()),
(17, ' chenyouliang', '123456' ,'陈友谅',1, '17. jpg' ,NULL, '2015-03-21 ', NULL, now() ,now() );
-- 多表查询
select * from tb_emp, tb_dept where tb_emp.dept_id = tb_dept.id;
连接查询的方式:
连接查询和子查询.
其中,连接查询又分为 内连接,外连接,其中外连接又分为左外连接和右外连接
内连接查询:
查询的是AB的交集部分的数据
sql
-- 内连接查询
-- 查询员工的姓名 以及所属的部门名称(隐式内连接实现)
select tb_emp.name, tb_dept.name from tb_emp, tb_dept where tb_emp.dept_id = tb_dept.id;
-- 查询员工的姓名 以及所属的部门名称(显式内连接实现)
-- 在这个查询语句中,表的顺序并不会影响查询结果。因为这是一个内连接(inner join),它会根据两个表之间的关联条件(tb_emp.dept_id = tb_dept.id)将两个表中符合条件的记录进行匹配。无论先写哪张表,查询结果都应该是一样的。
select tb_emp.name, tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
外连接查询:
左外连接,查询的时候会包括左边的全部部分,同理 右外连接会包括右边的全部信息
子查询:
标量查询,行子查询, 列子查询, 表子查询.
标量查询查询的是一行一列
行子查询是一行多列
列子查询是一列多行
表子查询是多行多列
sql
-- 子查询
-- 标量查询 单行单列
-- 查询教研部员工的全部信息
select * from tb_emp where tb_emp.dept_id = (select id from tb_dept where tb_dept.name = '教研部');
-- 列子查询 常见的操作符 就是 in 意思是一列多行
-- 查询 教研部 和 咨询部的所有员工的信息
select id from tb_dept where name = '教研部' or name = '咨询部';
select * from tb_emp where tb_emp.dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');
-- 行子查询 意思就是一行多列
-- 查询与韦一笑 的入职时间和职位都相同的员工的信息
select entrydate, dept_id from tb_emp where name = '韦一笑';
select * from tb_emp where (entrydate, job) = (select entrydate, job from tb_emp where name = '韦一笑');
-- 表子查询 多行多列
-- 查询入职日期是2006-01-01 之后的员工的信息 以及其部门名称
select * from tb_emp where entrydate > '2006-01-01'; -- 让这个表作为了临时的一张表
select e.*, d.name from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept d where e.dept_id = d.id;
事务:
开启事务 start transaction
提交事务 commit 当这个事务里面的全部都成功之后才去提交的
回滚事务 rollback当这个事务里面有一个失败就会进行数据的恢复 也就是回滚
sql
-- 事务
-- 事务控制
-- 开启事务
start transaction ;
-- 提交事务 全部成功之后 才去执行的
commit ;
-- 回滚事务 只要有失败的 就去执行回滚 让删除掉的数据在回来
rollback ;
四大特性:
索引:
如果一个表的数据过大 查询的效率就会降低,因此需要去优化效率 通过索引进行优化,索引更像是一本书里面的目录
数据结构用的是 B+树 查询的时间复杂度是log2(n)
索引的优缺点:
语法:
sql
-- 索引
-- 创建索引
-- 为 tb_emp表的name字段建立一个索引
create index idx_emp_name on tb_emp(name);
-- 查看索引
show index from tb_emp;
-- 删除索引
drop index idx_emp_name on tb_emp;