MySQL

目录

常见的数据类型:

数字类型:

字符串类型:

日期时间类型:

DDL(数据库的操作):​编辑

表的创建&查询:

修改表结构:​编辑

代码:

[删除表: ​编辑](#删除表: 编辑)

[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;
相关推荐
张声录12 分钟前
【ETCD】【实操篇(十六)】基于角色的访问控制:ETCD 安全管理指南
数据库·安全·etcd
warrah7 分钟前
redis——岁月云实战
数据库·redis·缓存
秀儿y8 分钟前
Redis-十大数据类型
数据库·redis·缓存·oracle
凡人的AI工具箱28 分钟前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
知识的宝藏32 分钟前
Django models中的增删改查与MySQL SQL的对应关系
sql·mysql·django·django models
路在脚下@32 分钟前
MySQL的索引失效的原因有那些
数据库·mysql
凡人的AI工具箱38 分钟前
每天40分玩转Django:实操图片分享社区
数据库·人工智能·后端·python·django
CT随43 分钟前
MongoDB
数据库·mongodb
cwtlw43 分钟前
CSS学习记录20
前端·css·笔记·学习
新子-存在了1 小时前
linux中 mysql备份
linux·运维·mysql