在数据库的表中,常见的数据类型:
| 类型 | 描述 |
| --------- | ------------------------------------------------------ |
| int | 整型,存储整数 |
| double | 浮点型,存储小数<br />double(4,3): 这个小数最多只有4位,且有三位是小数部分 |
| char | 字符串,在使用的时候需要定义长度<br />char(5): 每个数据占用固定的长度5 |
| varchar | 字符串,在使用的时候需要定义长度<br />varchar(5): 长度可动态调整的,这里的5只是一个上限 |
| text | 字符串,在使用的时候不需要指定长度 |
| blob | 字节类型 |
| date | 日期类型,格式是 yyyy-MM-dd |
| time | 时间类型,格式是 hh:mm:ss |
| timestamp | 时间戳,格式是 yyyy-MM-dd hh:mm:ss,会自动赋值 |
| datetime | 时间类型,格式是 yyyy-MM-dd hh:mm:ss |
建表语句
create table 表名(字段1 数据类型, 字段2 数据类型);
查看表
show tables; #查看所有的表
show create table 表名; # 查看某一张表的建表信息
desc 要查询的表名 ; 查询表的字段详情
删除表
drop table t_score; # 删除t_score表
修改表
alter table t_score add brithday data; #给 t_score表 添加一个 brethday字段 数据类型为 data
alter table t_score drop age; # 删除 t_scroe表中的 age 字段
alter table t_score modify height int; #为 t_score 表中的 height 字段 换为 int 类型
alter table t_score change height weigth int; # 修改一个字段的名字(需要同时修改类型)
alter table t_scour character set gbk; #修改 t_score 表中的字符集为gbk
alter table t_score rename t_user; #修改 t_score表的名称为t_user
表中数据的增删改 DML
insert into t_student values('name',age,'male');为 t_student表中添加数据
insert into t_student (name,age,gender) values ('张三',18,‘男’),(‘李四’,23,‘女’) ; #批量为表中添加数据
删除表
delete from t_studeng; #删除 t_studend 表
truncate t_student; #删除t_studend 表 效率高于 delete from
删除指定条件的数据
delete from t_student where name='xiaoming'; #删除 t_student 表中 name='xiaoming'的数据
delete from t_student where gender not in('male', 'female'); #删除 t_student 表中 gender不是'male', 'female' 的数据 (人妖)
修改数据 update 修改表中的某些字段的值
1 基础修改,修改一个字段 update t_student set age=20 where name='xiaohui'; #修改t_student 表中 name='xiaohui' 的 age 修改为 20
2. 修改多个字段 update t_student set age = 10, gender = 'male', score = 90 where name = 'polly';
#修改t_student 表中 name='pollyi' 的 age 修改为 10 gender 改为 'male' score 改为 90
条件子句,关键字where
# 作用:提供了一个条件,可以对一些数据操作进行一些数据筛选。
# = : 判断是否相等,类似于Java中的==
# != <> : 判断是否不相等
# > < >= <= : 大小关系的判断
# between... and... : 判断是否在指定的范围之间
# in(set) : 判断是否在指定的集合中存在
# is null : 判断是否是null
# and or not : 逻辑关系连接,与、或、非
# is not null : 判断是否不是null
# not in(set) : 没有在指定的集合中存在
数据库表查询 DQL
1. 基础查询 [select 列名 from 表] select name from t_score;
如果想要查询所有列,可以使用*替代列 select * from t_score;
2. 条件查询
查询所有java不及格的学生姓名和全部的成绩 select * from t_score where java < 60;
查询所有的java不及格,并且mysql也不及格的全部信息
select * from t_score where java < 60 and mysql < 60;
查询所有的java成绩在80到90之间的学生信息
select * from t_score where java between 80 and 90;
查询java成绩和mysql成绩差值大于10分的所有学生信息
select * from t_score where mysql - java > 10 or java - mysql > 10;
3 模糊查询 like
_: 通配符,匹配任意的字符,只能匹配一位
%: 通配符,匹配任意的字符,可以匹配多位
查询成绩表中所有姓张的学生信息 select * from t_score where name like '张%';
查询成绩表中所有姓张的,并且名字长度是3的学生信息 select * from t_score where name like '张__';(这里有两个下划线)
查询所有的mysql成绩是个位数的学生信息
select * from t_score where mysql like '_';
查询所有的hadoop成绩大于90分的学生信息
select * from t_score where hadoop like '9_';
# 查询所有的linux成绩尾数为8的学生信息
select * from t_score where linux like '%8';
查询结果去重
关键字distinct,使用distinct修饰的字段,会进行去重
但是,distinct只能放在紧跟在select后面的位置,不能写在其他字段之后
distinct后面如果有多个字段,会根据多个字段去重:每一个字段的值都相同,才会认为是重复的值
查询所有人的所有hadoop成绩,查询结果按照成绩去重
select distinct hadoop from t_score;
给列起别名
按照 姓名 Java 成绩 ...... 显示 表
select name as '姓名', java as 'Java成绩', mysql, linux, hadoop from t_score;
as 关键字可以省略
列之间的计算
需求:查询表中的所有人的所有成绩和总成绩
select *, java+mysql+linux+hadoop as '总成绩' from t_score;
# 列之间的相加注意事项: NULL值和任意的值相加,结果都是NULL。
# ifnull(列, 值): 如果指定列的值是NULL,则按照指定的值处理
select *, java+mysql+ifnull(linux,0)+hadoop as '总成绩' from t_score;
查询结果排序: 将查询的结果,按照一定的大小关系进行排列。
在查询语句的最后方,添加 order by
order by 默认是按照指定的列进行升序排序,如果需要降序,则在最后添加一个 desc
注:升序排序,也可以在字段后面添加一个asc)
select *, java+mysql+ifnull(linux,0)+hadoop as '总成绩' from t_score order by java asc;#按照 java成绩升序排序
select *, java+mysql+ifnull(linux,0)+hadoop as '总成绩' from t_score order by java+mysql+ifnull(linux,0)+hadoop desc; #按照总成绩做降序
聚合函数 在查询到的所有的结果中,可以使用聚合函数,对某些数据进行一些操作
重点: 聚合函数,是作用于列。是做纵向计算的。
# count() : 计算数量,但是不会计算NULL。
# sum() : 计算总和
# avg() : 计算平均值
# max() : 计算最大值
# min() : 计算最小值
# 需求1: 统计这张表中有多少学生
select count(name) from t_score;
需求2: 统计有多少人的MySQL成绩及格
select count(MySQL) from t_score where MySQL>=60;
需求3: 计算linux成绩的总和
select sum(Linux) from t_score;
需求4: 计算hadoop成绩的平均值
select avg(hadoop) from t_score;
需求5: 计算Java成绩的最高分和最低分
select max(java), min(java) from t_score;
分组查询
可以将查询的结果,按照某一个字段进行分组,当这个字段的值相同的时候,这些数据视为一个分组。
给t_score表添加一个字段 group
alter table t_score add `group` int;
查询每一个分组中有多少人
select `group`,count(`name`)from t_score group by `group`;
查询1组中有多少人
select `group`, count(`name`) from t_score where `group`=1 group by`group` ;
# 需求2: 查询每一个分组的java平均值
select `group`,avg(java)from t_score broup by `group`
# 需求4: 计算每一个分组中,分别有多少人的java不及格
select `group`, count(`name`) from t_score where java < 60 group by `group`;
# 需求5: 计算每一个分组的人数、java平均成绩和linux总成绩
select `group`, count(`name`), avg(java), sum(linux) from t_score group by `group`;
having
和where是比较相似的。都是做的条件过滤。
having和where的区别: 1. where要写到分组之前,过滤是发生在分组前的。having要写在分组之后,对分组后的数据进行过滤的。
2where子句中不允许使用聚合函数。having后是可以使用聚合函数的
需求: 查询所有的java平均分小于80分的分组id和java平均分
select `group`, avg(java) from t_score group by `group` having avg(java) < 80;
分页 可以将查询到的数据分成若干页。
limit limit需要两个参数: 第一个参数,代表从第几个数据开始查询 第二个参数,代表每一页要查询多少个数据
select * from t_score limit 3, 2;
# 分页,可以分为真分页和假分页。
# 真分页: 从数据库中查询数据的时候,将数据分段读取。又叫做物理分页。
# 假分页: 直接从数据库中查询到所有的数据,在程序中进行逻辑处理。又叫做逻辑分页。
# 假分页优点: 效率高。
# 假分页缺点: 如果数据量过大,会出现内存溢出。