1. 整数: int(m) 和 bigint(m), bigint 相当于java中的long, m代表显示长度(m是用来补零的) 补零需要结合zerofifill关键字
create table t3(id int,age int(5) zerofifill);
insert into t3 values(1,18);
select * from t3;
2. 浮点数: double(m,d) m代表总长度, d代表小数长度 23.234 m=5 d=3 , 超高精度浮点数decimal(m,d) 精度远高于double 只有涉及超高进度运算时使用
3. 字符串:
char(m): 固定长度, m代表最大字符长度, m=10存abc 占10 , 好处:执行效率略高,最大长度为255
varchar(m):可变长度, m=10存abc 占3, 好处:节省存储空间 , 最大长度65535 但是建议保存255以内数据, 超过255使用text
text(m):可变长度, 最大长度65535, 建议保存长度大于255的数据
4. 日期
date: 只能保存年月日
time:只能保存时分秒
datetime:保存年月日时分秒, 默认值为null, 最大值9999-12-31
timestamp:保存年月日时分秒, 时间戳(距离1970年1月1日的毫秒数), 默认值为当前的系统时间, 最大值2038-1-19
举例:
create table t_date(t1 date,t2 time,t3 datetime,t4timestamp);
insert into t_date values('2021-3-12',null,null,null);
insert into t_date values(null,'10:50:20','2020-11-20 15:30:25',null);
select * from t_date;
* 语法: * 备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径 * 还原: 1. 登录数据库 2. 创建数据库 3. 使用数据库 4. 执行文件。
通过执行以下指令导入:
格式: source 路径
source e:/emp.sql;
执行select * from emp; 如果显示乱码 执行 setnames gbk;
如果查询某个字段的值为null 不能用= 使用is , 不等于null 则使用 is not null
and 类似Java中的&& , 如果需要同时满足多个条件时使用and
or 类似Java中的|| 如果需要满足多个条件中的某一个条件时使用or
当查询某个字段的值等于多个值时使用
1. 查询工资是3000,1500和5000的员工信息
select * from emp where sal=3000 or sal=1500 or sal=5000;
select * from emp where sal in(3000,1500,5000);
2. 查询工作是销售 人事和程序员的员工信息
select * from emp where job in('销售','人事','程序员');
3. 查询1号和2号部门工资大于2000的员工信息
select * from emp where sal>2000 and deptnoin(1,2);
当查询的字段取值在两个数值之间时使用
1. 查询工资在2000到3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and3000;
_ : 代表1个未知字符
%: 代表0或多个未知字符
举例:
以x开头 x%
以x结尾 %x
包含x %x%
以x开头以y结尾 x%y第二个字符是x _x%
第三个字符是x倒数第二个字符是y _ _ x%y _
1. 排序查询 * 语法:order by 子句 * order by 排序字段1 排序方式1 , 排序字段2 排序方式2... * 排序方式: * ASC:升序,默认的。 * DESC:降序。 * 注意: * 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
格式: limit 跳过的条数, 请求的条数,请求的条数就是每页的条数
公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
举例: (请求页数-1)*条数,条数
请求第一页的5条数据 limit 0,5
请求第二页的5条数据 limit 5,5
请求第8页的6条数据 limit (8-1)*6,6;
请求第6页的7条数据 limit 35,7
1. 按照员工工资升序排序 请求第一页的5条数据
select * from emp order by sal limit 0,5;
2. 查询员工表中工资降序排序 第二页的3条数据
select * from emp order by sal desc limit 3,3;
3. 查询1号部门工资前三的员工信息
select * from emp where deptno=1 order by sal desc limit 0,3;
4. 查询2号部门工资最高的员工姓名和工资
select ename,sal from emp where deptno=2 order by sal desc limit 0,1;
1. 查询每个员工的姓名,工资和年终奖(年终奖=月工资*3)
select ename,sal,sal*3 from emp;
2. 查询2号部门中,每个员工的姓名,工资和涨薪5块钱之后的工资
select ename,sal,sal+5 from emp where deptno=2;
3. 让3号部门的员工每人涨薪5块钱
update emp set sal=sal+5 where deptno=3;
给查询的字段起别名
select ename from emp;select ename as '名字' from emp;
select ename '名字' from emp;
select ename 名字 from emp;
使用聚合函数可以对查询的多条数据进行统计查询
* 注意:聚合函数的计算,排除null值。 解决方案: 1. 选择不包含非空的列进行计算 2. IFNULL函数
查询员工表中的平均工资
select avg(sal) from emp;
查询1号部门的平均工资
select avg(sal) from emp where deptno=1;
查询2号部门的最高工资
select max(sal) from emp where deptno=2;
查询2号部门的最低工资
select min(sal) from emp where deptno=2;
查询1号部门的工资总和
select sum(sal) from emp where deptno=1;
查询2号部门的员工人数
select count(*) from emp where deptno=2;
什么是分组查询: 分组查询可以将某个字段相同值的数据划分为一组,然后以组为单位进行统计查询
格式: group by 字段名;
注意: 1. 分组之后查询的字段:分组字段、聚合函数 2. where 和 having 的区别? 1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来 2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
1. 查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2. 查询每种工作的平均工资
select job,avg(sal) from emp group by job;
3. 查询每种工作的人数
select job,count(*) from emp group by job;
4. 查询每个部门工资高于2000的员工人数
select deptno,count(*) from emp where sal>2000 group by deptno;
5. 查询平均工资最高的部门编号和平均工资
select deptno,avg(sal) from emp group by deptno order by avg(sal) desc limit 0,1 ;
where后面只能写普通字段条件, 不能写聚合函数条件
聚合函数条件需要写在having关键字后面
having关键字需要结合group by分组查询使用
1. 查询每种工作的人数,只查询人数大于1的工作名称和人数.
select job,count() from emp group by job having count()>1;
select job,count(*) c from emp group by job having c>1;
2. 查询每个部门的平均工资,只查询出平均工资高于2000的信息
select deptno,avg(sal) a from emp group by deptno having a>2000;
select deptno,max(sal) from emp group by deptno;
3.查询每个部门的工资总和,只查询有领导的员工,并且要求工资总和高于5400
select deptno,sum(sal) s from emp where mgr is not null group by deptno having s>5400;
4. 查询每个部门的平均工资,只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的部门信息
select deptno,avg(sal) a from emp where salbetween 1000 and 3000 group by deptno having a>=2000;
5. 查询每种工作的人数要求人数大于1个,并且只查询1号部门和2号部门的员工, 按照人数降序排序
select job,count(*) c from emp where deptno in(1,2) group by job having c>1 order by c desc;
1. 查询工资高于1号部门平均工资的员工信息
select avg(sal) from emp where deptno=1;
select * from emp where sal>(select avg(sal) from emp where deptno=1);
2. 查询工资最高的员工信息
select max(sal) from emp;
select * from emp where sal=(select max(sal)from emp);
3. 查询工资高于2号部门最低工资的员工信息
select min(sal) from emp where deptno=2;
select * from emp where sal>(select min(sal) from emp where deptno=2);
4. 查询和孙悟空相同工作的其它员工信息
select job from emp where ename='孙悟空';
select * from emp where job=(select job from emp where ename='孙悟空') and ename!='孙悟空';
5.查询拿最低工资员工的同事们的信息(同事指相同部门)
select min(sal) from emp; //得到最低工资
//得到最低工资的部门编号
select deptno from emp where sal=(select min(sal) from emp)
//通过部门编号查询该部门的员工
select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp) ) and sal!=(select min(sal) from emp);
6. 查询人数最多的部门信息(需要用到dept部门表)
select deptno from emp group by deptno order by count(*) desc limit 0,1;
select * from dept where deptno=(select deptno from emp group by deptno order by count(*) desc limit 0,1)
7. 有的工作只有一个人, 那么查询有哪些人从事了这种只有一个人的工作
select job from emp group by job having count(*)=1;
select * from emp where job in(select job from emp group by job having count(*)=1);
1. 分类: 1. 一对一(了解): * 如:人和身份证 * 分析:一个人只有一个身份证,一个身份证只能对应一个人 2. 一对多(多对一): * 如:部门和员工 * 分析:一个部门有多个员工,一个员工只能对应一个部门 3. 多对多: * 如:学生和课程 * 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择 2. 实现关系: 1. 一对多(多对一): * 如:部门和员工 * 实现方式:在多的一方建立外键,指向一的一方的主键。 2. 多对多: * 如:学生和课程 * 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键 3. 一对一(了解): * 如:人和身份证 * 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
* 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 * 分类: 1. 第一范式(1NF):每一列都是不可分割的原子数据项 2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖) * 几个概念: 1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A 例如:学号-->姓名。 (学号,课程名称) --> 分数 2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。 例如:(学号,课程名称) --> 分数 3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。 例如:(学号,课程名称) -- > 姓名 4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A 例如:学号-->系名,系名-->系主任 5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码 例如:该表中码为:(学号,课程名称) * 主属性:码属性组中的所有属性 * 非主属性:除过码属性组的属性 3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
同时查询多张表数据的查询方式称为关联查询
有几种关联查询方式?
等值连接
内连接
外连接
格式: select * from A,B where A.x=B.x(关联关系) and A.age>30;
1. 查询每个员工的姓名和对应的部门名
select ename,dname from emp e,dept d where e.deptno=d.deptno;
格式: select * from A join B on A.x=B.x(关联关系) where A.age>30;
等值连接和内连接查询到的数据是一样的数据,都是两张表的交集数据
1. 查询每个员工的姓名和对应的部门名
select ename,dname from emp e join dept d on e.deptno=d.deptno;
2. 查询1号部门工资高于2000块钱的员工姓名和对应的部门名,部门地址
select ename,dname,loc from emp e join dept d on e.deptno=d.deptno where e.deptno=1 and sal>2000;
外连接 查询到的是一张表的全部数据和另外一张表的交集数据
格式: select * from A left/right join B on A.x=B.x(关联关系) where A.age>30;
1. 查询所有部门名以及对应的员工名
select dname,ename from emp e right join dept d on e.deptno=d.deptno;
2. 往员工表插入一个Tom工资500, 查询所有员工信息以及所对应的部门名
insert into emp(empno,ename,sal) values(100,'Tom',500);
select e.*,dname from emp e left join dept d on e.deptno=d.deptno;
如果查询的是两个表的交集数据,则使用等值连接或内连接(推荐)
如果查询的数据是一张表的全部和另外一张表的交集则使用外连接
select 列名列表 from 表名列表