目录
数据库类型
1.整数:
int(m) 和 bigint(m) m代表显示长度(补0) bigint等效java中的long
create table t_int(id int,age int(10) zerofill);
insert into t_int values(1,18);
select * from t_int;
2. 浮点数:
double(m,d) m总长度 d小数长度 double(5,3) 26.378 ,decimal是一个超高精度的浮点数,精度远高于double,只有涉及到超高精度运算时才会使用
3. 字符串:
- char(m)不可变长度 char(5) "abc" 占5 最大字符长度255,
- varchar(m) 可变长度 节省空间 最大字符长度为65535 但是超过255建议使用text
- text可变长度的字符串类型 长度65535
4. 日期类型:
- date: 只能保存年月日
- time: 只能保存时分秒
- datetime: 默认值null 最大值9999-12-31
- timestamp: 时间戳 默认值当前系统时间 2038-1-19
create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);
insert into t_date values("2019-10-12",null,null,null);
insert into t_date values(null,"10:37:20",
"2019-10-11 11:11:11",null);
经常使用的数据库操作
主键约束(primary key)
- 约束: 创建表时给表字段添加的限制条件
- 主键: 表示数据唯一性的字段称为主键
- 主键约束: 唯一且非空
create table t1(id int primary key,name varchar(10));
insert into t1 values(1,'aaa'); //成功
insert into t1 values(2,'aaa'); //成功
insert into t1 values(2,'bbb'); //报错 不能重复
insert into t1 values(null,'ccc');// 报错 不能为空
主键约束+自增(auto_increment)
- 从历史最大值+1 只增不减
create table t2(id int primary key auto_increment,name varchar(10));
insert into t2 values(null,'aaa'); //1
insert into t2 values(null,'bbb'); //2
insert into t2 values(10,'bbb'); //10
insert into t2 values(null,'ccc'); //11
delete from t2 where id>=10;
insert into t2 values(null,'ddd'); //12
注释(comment)
- 创建表时给字段添加的介绍信息
create table t3 (id int comment '这是主键',name varchar(10) comment '这是名字');
show create table t3;
导入*.sql 文件
- linux系统: 把文件放到桌面
source /home/soft01/桌面/xxx.sql;
- windows系统: 把文件放到d盘根目录
source d:/xxx.sql;
- 检查是否成功:
1. show databases; 查看是不是出现了一个newdb3数据库
2. use newdb3; 使用 导入的这个数据库
3. show tables; 查看是否有 emp和dept两个表
4. select * from emp 查看数据 如果出现乱码 执行 set names gbk;后再查询
非空约束(is null 和 is not null)
1. 查询没有上级领导的员工信息
select * from emp where mgr is null;
2. 查询有上级领导的员工信息
select * from emp where mgr is not null;
去重 distinct
1. 查询员工所从事的职业有哪些
select distinct job from emp;
比较运算符 (> < >= <= = !=和<>)
查询工作不是程序员的员工姓名和工作
select ename,job from emp where job!='程序员';
select ename,job from emp where job<>'程序员';
and和or
- and类似java中的 &&
- or类似java中的||
1. 查询1号部门工资低于1500的员工信息
select * from emp where deptno=1 and sal<1500;
2. 查询2号部门员工或工资高于2000的员工姓名,工资和部门编号.
select ename,sal,deptno from emp where deptno=2 or sal>2000;
between x and y 包含x和y
1. 查询工资在2000到3000之间的员工姓名和工资
select ename,sal from emp where sal>=2000 and sal<=3000;
select ename,sal from emp where sal between 2000 and 3000;
in
查询工资等于800,3000,1500的员工信息
select * from emp where sal=800 or sal=3000 or sal=1500;
select * from emp where sal in(800,3000,1500);
综合练习
1. 查询有上级领导并且是1号部门的员工信息
select * from emp where mgr is not null and deptno=1;
2. 查询2号部门中工资在1000到2000之间的员工信息
select * from emp where deptno=2 and sal between 1000 and 2000;
3. 查询1号部门中有哪几种不同的工作
select distinct job from emp where deptno=1;
模糊查询 (like)
- %: 代表0或多个未知字符
- _: 代表一个未知字符
- 举例:
1. 以x开头 x%
2. 以y结尾 %y
3. a开头b结尾 a%b
4. 第二个字符是x _x%
5. 包含x %x%
6. 第三个字符是x倒数第二个字符是y __x%y_
1. 查询名字中以孙开头的员工信息
select * from emp where ename like "孙%";
2. 查询工作中包含销售的员工姓名和工作
select ename,job from emp where job like '%销售%';
排序 order by 字段名
- 格式: order by 字段名 (默认升序 desc降序),字段名
1. 查询每个员工的姓名和工资 按照工资升序
select ename,sal from emp order by sal ;
2. 查询3号部门的员工姓名和工资 按照工资降序排序
select ename,sal from emp where deptno=3 order by sal desc;
3. 查询每个员工的姓名,工资和部门编号 按照部门编号升序,如果部门编号相同则按照工资降序排序
select ename,sal,deptno from emp order by deptno,sal desc;
分页查询 (limit)
- 格式: limit 跳过的条数,请求的条数(每页的条数)
- 公式:limit (页数-1)*条数,条数
1. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询前三条数据
select empno,ename,sal from emp order by sal desc limit 0,3;
2. 查询每个员工的编号,姓名,工资 按照工资降序排序 查询第二页的三条数据
select empno,ename,sal from emp order by sal desc limit 3,3;
3. 查询工资在1000到3000之间的员工信息 按照工资降序排序第3页的2条数据
select * from emp where sal between 1000 and 3000 order by sal desc limit 4,2;
数值计算 (+ - * / %)
1. 查询每个员工的姓名,工资和年终奖(工资*5)
select ename,sal,sal*5 from emp;
别名
- 给查询的字段起一个别的名字
select ename as '名字' from emp;
select ename '名字' from emp;
select ename 名字 from emp;
聚合查询
- 对查询的多条数据进行统计查询
- 平均值 最大值 最小值 求和 计数
1. 平均值 avg(字段)
- 查询1号部门的平均工资
select avg(sal) from emp where deptno=1;
2. 最大值 max(字段)
- 查询1号部门的最高工资
select max(sal) from emp where deptno=1;
3. 最小值 min(字段)
- 查询员工表中的最低工资
select min(sal) from emp;
4. 求和 sum(字段)
- 查询2号部门的工资总和
select sum(sal) from emp where deptno=2;
5. 计数 count(字段)
- 一般场景用count(*) 即可
- 查询2号部门有多少人
select count(*) from emp where deptno=2;
分组查询 group by xxx
- 如果需求中出现每个或每种这样的关键字 则使用分组查询
1. 查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2. 查询每个部门的最高工资
select deptno,max(sal) from emp group by deptno;
3. 查询每种职位的工资总和
select job,sum(sal) from emp group by job;
4. 查询每种职位的员工人数
select job,count(*) from emp group by job;
5. 查询每个部门工资大于1500的员工人数
select deptno,count(*) from emp where sal>1500 group by deptno;
6. 查询1号和3号部门的最低工资
select deptno,min(sal) from emp where deptno in(1,3) group by deptno;
having
- where 后面只能写普通字段的条件,不能写聚合函数条件
- 如果条件是聚合函数的条件 则必须使用having
- having要和group by 结合使用
1. 查询每个部门的平均工资 要求平均工资大于2000;
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
2. 查询每个部门的平均工资,只查询工资在1000-3000之间的员工,并且过滤掉平均工资低于2000的部门
select deptno,avg(sal) from emp where sal between 1000 and 3000 group by deptno having avg(sal)>=2000;
各种关键字的顺序
- select ...... from 表名 where ....group by....having....
order by...... limit ....;
综合练习
1. 查询没有上级领导的员工编号empno,姓名,工资
SELECT EMPNO,ENAME,SAL FROM EMP WHERE MGR IS NULL;
2. 查询有奖金的员工姓名和奖金
SELECT ENAME,COMM FROM EMP WHERE COMM>0;
3. 查询名字中包含精的员工姓名和工资
SELECT ENAME,SAL FROM EMP WHERE ENAME LIKE '%精%';
4. 查询名字中第二个字是八的员工信息
SELECT * FROM EMP WHERE ENAME LIKE '_八%';
5. 查询1号部门工资大于2000的员工信息
SELECT * FROM EMP WHERE DEPTNO=1 AND SAL>2000;
6. 查询2号部门或者工资低于1500的员工信息
SELECT * FROM EMP WHERE DEPTNO=2 OR SAL<1500;
7. 查询工资为3000,1500,5000的员工信息按照工资升序排序
SELECT * FROM EMP WHERE SAL IN(3000,1500,5000) ORDER BY SAL;
8. 查询3号部门的工资总和
SELECT SUM(SAL) FROM EMP WHERE DEPTNO=3;
9. 查询每个部门工资大于1000的员工人数,按照人数升序排序
SELECT DEPTNO,COUNT(*) FROM EMP WHERE SAL>1000 GROUP BY DEPTNO ORDER BY COUNT(*);
10. 查询每种工作中有领导的员工人数按照人数降序排序
SELECT JOB,COUNT(*) C FROM EMP WHERE MGR IS NOT NULL GROUP BY JOB ORDER BY C DESC;
11. 查询所有员工信息,按照部门编号升序排序,如果部门编号一致则工资降序
SELECT * FROM EMP ORDER BY DEPTNO,SAL DESC;
12. 查询有领导的员工,每个部门的编号和最高工资
SELECT DEPTNO,MAX(SAL) FROM EMP WHERE MGR IS NOT NULL GROUP BY DEPTNO;
13. 查询有领导的员工,按照工资升序排序,第3页的2条数据
SELECT * FROM EMP WHERE MGR IS NOT NULL ORDER BY SAL LIMIT 4,2;
14. 查询每个部门的工资总和,只查询有上级领导的员工并且要求工资总和大于5400,最后按照工资总和降序排序,只查询结果中的第一条数据
SELECT DEPTNO,SUM(SAL) S FROM EMP WHERE MGR IS NOT NULL GROUP BY DEPTNO HAVING S>5400 ORDER
BY S DESC LIMIT 0,1;
附上练习操作的数据库
创建数据库
CREATE DATABASE newdb3;
进入数据库
USE newdb3;
创建(dept)表结构
CREATE TABLE `dept` (
`DEPTNO` int(4) NOT NULL,
`DNAME` varchar(14) NOT NULL,
`LOC` varchar(13) DEFAULT NULL,
PRIMARY KEY (`DEPTNO`),
UNIQUE KEY `DNAME` (`DNAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
往表中插入数据
insert into `dept`(`DEPTNO`,`DNAME`,`LOC`) values (1,'神仙','天庭'),(2,'妖怪','盘丝洞'),(3,'普通人','北京'),(4,'赛亚人','外星球');
创建表(emp)结构
CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) NOT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`HIREdate` date DEFAULT NULL,
`SAL` double(7,2) DEFAULT NULL,
`COMM` double(7,2) DEFAULT NULL,
`DEPTNO` int(4) DEFAULT NULL,
PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
往表中添加数据
insert into `emp`(`EMPNO`,`ENAME`,`JOB`,`MGR`,`HIREdate`,`SAL`,`COMM`,`DEPTNO`) values (1,'孙悟空','销售',4,'1980-12-17',800.00,NULL,1),(2,'猪八戒','销售',4,'1981-02-20',1600.00,300.00,1),(3,'沙僧','销售',4,'1981-02-22',1250.00,500.00,1),(4,'唐僧','销售经理',8,'1981-04-02',2975.00,NULL,1),(5,'刘备','项目经理',NULL,'1981-09-28',1250.00,1400.00,3),(6,'关羽','程序员',5,'1981-05-01',2850.00,NULL,3),(7,'张飞','程序员',5,'1981-06-09',2450.00,NULL,3),(8,'观音','CEO',NULL,'1981-11-17',5000.00,NULL,1),(9,'白骨精','人事',8,'1981-09-08',1500.00,0.00,2),(10,'蜘蛛精','人事',8,'1981-12-03',950.00,NULL,2),(11,'黑熊怪','市场',8,'1981-12-03',3000.00,NULL,2);
若出现中文乱码
set names gbk;