数据类型和约束
常用的数据类型
- 整数: int, bit
- 小数:decimal
- 字符串:varchar, char, text
- 日期类型:date, time, datetime
- 枚举类型(enum)
特别说明类型如下
- decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占两位
- char表示固定长度的字符串,如char(3),如果填充 ‘ab’ 时会补一个空格 'ab ’
- varchar表示可变长度的字符串,如varchar(3),填充 ‘ab’ 时就会存储 ‘ab’
- 对于图片、音频、视频等文件,不存储在数据库种,而是上传到某个服务器上,然后在表种存储这个文件的保存路径
- 字符串text表示存储大文本,当字符串大于4000时推荐使用,比如技术博客
数据约束
约束本质上是对数据在数据类型限定的基础上添加的额外要求
常见的约束如下:
- 主键 primary key:物理上存储的顺序,MySQL建议所有表的主键字段都叫id,类型为 int unsigned
- 非空 not null:此字段不允许填写空值
- 唯一 unique:此字段的值不允许重复
- 默认 defalut:当不填写字对应的值会使用默认值,如果填写时以填写为准
- 外键 foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
操作数据库
语句 | 说明 |
---|---|
net start mysql | 启动MySQL服务 |
mysql -u root -p | 连接数据库 |
show databases; | 查看所有数据库 |
selsct version(); | 查看数据库版本号 |
select database(); | 查询当前数据库 |
create database 数据库名 charset=utf8; | 创建数据库 |
show create database 数据库名; | 查看这个数据库是怎么创建的 |
use 数据库名 | 进入数据库 |
drop database 数据库名; | 删除数据库 |
数据表的操作
语句 | 说明 |
---|---|
show tables; | 查看当前数据库种所有的表 |
show create table 表名 | 查看表的创建语句 |
desc 表名; | 查看表结构(查看表字段的一些信息) |
drop table 表名 | 删除表 |
create table test(字段 类型 约束 [ ,字段 类型 约束); | 创建表 |
添加修改删除字段
-- 修改表-添加字段 mascot(吉祥物)
-- alter table 表名 add 列名 类型;给classes表添加mascot字段
alter table classes add mascot varchar(50);
-- 修改表-修改字段:不重命名版
-- alter table 表名 modify 列名 类型及约束
alter table classes add modify 列名 varchar(100);
-- 修改表-修改字段:重命名版
-- alter table 表名 change 原名 新名 类型及约束
alter table classes change mascot jxw int unsigned;
-- 修改表-删除字段
-- alter table 表名 drop 列名
alter table classes drop jxw;
添加数据
-- insert into 表名(字段1, 字段2) values(值1,值2);
-- 主键字段 额可以用 0 null defalut来占位
-- 向classes表中插入数据
insert into classes(id, name) values(1, "张三");
-- id设置了自增(auto_increment)可以不写id
insert into classes(name) values("李四");
-- 向students表插入 一个学生信息
+--------+-------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| age | int unsigned | YES | | NULL | |
| high | decimal(3,2) | YES | | NULL | |
| gender | enum('男','女','保密','中性') | YES | | 保密 | |
| cls_id | int unsigned | YES | | NULL | |
+--------+-------------------------------------+------+-----+---------+----------------+
-- 全部插入
-- insert into 表名 values(值1, 值2, 值3...);
insert into students values(1, "张三", 18, 1.83, '男', 1);
-- 部分插入
-- insert into 表名(列1, ...) values(值1, ...);
insert into students(name) values("李四");
-- 多行插入
-- insert into 表名(列1) values (值), (值)
insert into students(name, age) values ("王五", 20), ("马六", 21), ("小七", 22), ("老八", 23);
修改
-- update 表名 set 字段名=值1, 字段名2=值2... where 条件
-- 全部修改
-- 修改所有age都是10
update students set age = 10;
-- 按条件修改
-- 修改id为3的age等于10
update students set age = 10 where id = 3
-- 按条件修改多个值
-- update students set gender = "", age="" where name="xxx"
update students set age = 20, high=1.66 where name="小七"
查询
-- 查询所有列
-- select * from 表名
-- 查询students表中的所有数据信息
select * from students;
-- 指定条件查询
-- 查询id为1的学生所有信息
select * from students where id = 1;
-- 查询指定列
-- select 列1, 列2, ... from 表名;
-- 查询表中所有的name字段和age字段
select name, age from students;
-- 查询表中id=1的name字段和age字段
select name, age from students where id = 1;
-- 可以使用as为列或表指定别名
-- select 字段[as 别名], 字段[as 别名] from 数据表;
select name as "姓名", age as "年龄" from students;
+--------+--------+
| 姓名 | 年龄 |
+--------+--------+
| 张三 | 18 |
| 李四 | NULL |
| 王五 | 20 |
| 马六 | 21 |
| 小七 | 20 |
| 老八 | 23 |
+--------+--------+
删除
-- 物理删除,不可逆
-- delete from 表名 where id = 4
delete from students where id = 4;
-- 逻辑删除
-- 用一个字段来表示 这条信息是否已经不能在使用了
-- 给students表添加一个 is_delete 字段 bit 类型
alter table students add is_delete bit default 0;
-- update 表名 set is_delete = 1 where id = ;
update students set is_delete = 1 where id = 1
-- distinct 字段 去重重复
select distinct gender from students;
-- 使用分组的做法消除重复
select gender from students group by gender;
条件查询
比较运算符
-- select .... from 表名 where ....
-- 查询年龄大于18岁的学生信息 >
select * from students where age > 18;
-- 查询年龄大于等于18岁的学生信息 >=
select * from students where age >= 18;
-- 查询年龄为18岁的学生信息 =
select * from students where age = 18;
-- 查询年龄不为18岁的学生信息 != 或者<>
select * from students where age != 18;
select * from students where age <> 18;
逻辑运算符
-- and / between .. and ..
-- 年龄大于18 并且 小于28 之间的所有学生信息
select * from students where age >= 18 and age <= 28;
-- 年龄从18到28之间的所有学生信息
select * from students where age between 18 and 28;
-- 18岁以上的女性的学生信息
select * from students where age >= 18 and gender = '女';
-- 枚举的数据类型可以用数字来表示,数字从1开始
select * from students where age >= 18 and gender = 2;
-- or 或者的意思
-- 18岁以上或者生超高180(包含)以上的学生信息
select * from students where age > 18 or high >= 1.80;
-- not 取反的意思
-- 不在18岁以上的女性
select * from students where not (age > 18 and gender = '女');
模糊查询(where name like 要查询的数据)
-- like
-- % 替换任意个
-- _ 替换1个
-- 查询姓名中 以 "张" 开始的名字的学生信息
select * from students where name like "张%";
-- 查询姓名中 有 "号" 所有的名字的学生信息
select * from students where name like "%号%";
-- 查询有 2 个字的名字的学生信息, 查询3个字的名字就是三个下划线
select * from students where name like "__";
-- 查询只要有2个字的名字的学生信息
select * from students where name like "__%";
范围查询
-- in (1, 3, 8) 表示在一个非连续的范围内
-- 查询年龄为 18 或 20 的学生信息
select * from students where age in (18, 20); -- 不是区间,是确切的值
-- not in 不是非连续的范围之内
-- 年龄不是 18 或 20 的学生信息
select * from students where age not in(18, 20);
-- between ... and ... 表示在一个连续的范围内
-- 查询 年龄在18到20之间的学生信息
select * from students where age between 18 and 20;
-- not between ... and ... 表示不在一个连续的范围内
-- 查询 年龄不在18到20之间的学生信息
select * from students where age not between 18 and 20;
-- 空判断
-- 判空 is null
-- 查询身高为空的学生信息
select * from students where high is null;
-- 判非空 is not null
select * from students where high is not null;
排序查询
-- order by 字段
-- asc
-- asc从小到大排列,即升序
-- desc
-- desc从大到小排序,即降序
-- 查询年龄在18岁到30岁之间的男性,按照年龄从小到大排序,by 后的字段是什么就按照什么排序,是年龄就按照年龄排序,是身高就按照身高排序
select * from students where gender = 1 and age between 18 and 30 order by age asc;
-- 查询年龄在 10 到 30 岁之间的女性,按照身高排序从高到低排序
select * from students where gender = 2 and age between 10 and 30 order by high desc;
-- order by 多个字段 多个字段排序用逗号分开
-- 查询年龄在10 到 30 之间的女性,身高从高到矮排序,如果在身高相同的情况下就按照年龄从小到大排序
select * from students where gender = 2 and age between 10 and 30 order by high desc, age asc;
-- 如果年龄也相同那么按照id从大到小排序
select * from students where gender = 2 and age between 10 and 30 order by high desc, age asc, id desc;
聚合函数
-- 总数
-- count
-- 查询男性有多少人
select count(*) from students where gender = 1;
-- 最大值
-- max
-- 查询最大的年龄
select max(age) from students;
-- 查询女性的最高身高
select max(high) from students where gender = 2;
-- 最小值
-- min
-- 查询最小的年龄
select min(age) from students;
-- 求和
-- sum
-- 计算所有身高大于1.70的年龄总和
select sum(age) from students where high >= 1.70;
-- 平均值
-- avg
-- 计算平均年龄
select avg(age) from students;
-- 平均值计算 sum(age)/count(*)
-- 年龄总和除以全部人数
-- 四舍五入 round(123.23, 1) 保留1位小数
-- 计算所有人的平均年龄,保留2位小数
select round(avg(age), 2) from students;
-- 计算男性的平均身高 保留2位小数
select round(avg(high), 2) from students where gender = 1;
# 聚合函数计算的时候不会把null计算进去
分组查询
-- 分组的写法
-- select 分组的字段, from 表名 group by 分组字段;
-- group by
-- 按照性别分组,查询所有的性别
-- 以性别分组,性别放在第一列,第二列是每个性别有多少人
select gender from students group by gender;
-- 计算每种性别的人数
select gender, count(*) from students group by gender;
-- group_concat(...)
-- 查询同种性别中的姓名 group_concat(name)
select gender, group_concat(name) from students group by gender;
-- 查询每组性别的平均年龄
select gender, avg(age) from students group by gender;
-- having(注意having和group by 连用 having后通常也要跟 聚合函数)
-- 聚合函数如果作为条件出现,只能和having配合。不能和where配合使用
-- 查询平均年龄超过30岁的性别,以及姓名
select gender, avg(age), group_concat(name) from students group by gender having avg(age) > 20;
-- 查询每种性别中的人数多于2个的信息
select gender, count(*) from students group by gender having count(*) > 5;
分页查询
-- limit start, count
-- limit 放在最后面(注意)
-- 查询前5个数据
select * from students limit 5;
-- 通用写法
-- 从第二条数据开始,显示后面的5条数据,3到7
select * from students limit 2, 5;
-- 先排序后分页,年龄按照从小到大进行排序,从第二条消息开始,往后显示10条消息
select * from students order by age asc limit 2, 10;
连接查询 (表与表之间的连接, 为了更好的查出有效数据)
-- inner join ... on
-- select ... from 表A inner join 表B;
-- 查询 有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id = classes.id;
-- 按照要求显示姓名、班级
select students.name, classes.name from students inner join classes on students.cls_id = calsses.id;
-- 给表起名字
select B1.name as 姓名, B2.name as 班级 from students as B1 inner join classes as B2 on B1.cls_id = B2.id order by B1.cls_id asc;
-- 按照班级从小到大排序
select students.*, classes.name from students inner join classes on students.cls_id = classes.id order by students.cls_id, students.id asc;
子查询(一个查询的结果作为另一个查询的一部分)
-- 标量子查询:子查询返回的结果是一个数据(一行一列)
-- 列子查询:返回的结果是一列(一列多行)
-- 行子查询:返回的结果是一行(一行多列)
-- 查询高于平均身高的学生信息
select * from students where high > (select avg(high) from students);
-- 查询学生的班级号能够对应的 学生姓名 班级id
select students.name, students.cls_id from students where cls_id = 1 or cls_id = 2;
-- 使用on(1,2)
select students.name, students.cls_id from students where cls_id on(1,2);
-- 在不知道有哪些班级的情况下,使用子查询让他自己去里面找有哪些班级,自动去里面匹配
select students.name, students.cls_id from students where cls_id on(select id from classes);