MySQL

数据类型和约束

常用的数据类型

  • 整数: 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时推荐使用,比如技术博客

数据约束

约束本质上是对数据在数据类型限定的基础上添加的额外要求
常见的约束如下:

  1. 主键 primary key:物理上存储的顺序,MySQL建议所有表的主键字段都叫id,类型为 int unsigned
  2. 非空 not null:此字段不允许填写空值
  3. 唯一 unique:此字段的值不允许重复
  4. 默认 defalut:当不填写字对应的值会使用默认值,如果填写时以填写为准
  5. 外键 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值