数据库的操作
创建一个数据库设置字符集
create database 数据库名 character set utf8;
查询所有的数据库
show databases;
使用指定的数据库
use 数据库名;
查询数据库的详情
show create 数据库名;
删除数据库
drop database 数据库名;
创建数据库中的表
创建表
create table 表名 (字段1名 类型,字段2名 类型) character =uft8/gbk;
查询所有表
show datables;
查看表详情
show create table 表名;
查看表字段
desc 表名;
删除表
drop table 表名;
修改表名
rename table 原名 to 新名;
添加表字段
alter 表名 add 表字段 字段类型 first/after xxx;
默认添加最后面
id int first 添加到最前面
salary int after name 添加到名字后面
删除表字段
alter table 表名 drop 字段名;
修改表字段
alter table 表名 change 原名 新名 新类型
数据库的使用(更新数据)
插入数据
全表插入格式:
insert into 表名 values (值1, 值2);
指定插入格式:
insert into 表名 (字段名1,字段名2) values (值1, 值2);
批量插入格式:
insert into 表名 values (值1, 值2),(值1, 值2),(值1, 值2);
insert into person values('Tom',18);
insert into person(name)values('Jerry');
insert into person values('Lucy',58),('Lily',59);
insert into person(name) values('LiLei'),('Hanmeimei');
简单查询
select 字段信息 from 表名 where 条件
select * from person; 查询表中所有的数据
select name from person; 查询所有的名字
select * from person where age >50; 查询年龄大于50岁的信息
修改数据
update 表名 set xxx=xxx where name ='jerry';
update person set age =30 where name ='Jerry';
update person set age =20 where age is null;
删除数据
delete from 表名 where 条件;
delete from person where age =20;
delete from person where name ='Tom';
delete from person;
数据类型与约束
数据类型 int和bigint(long) zerofill数据长度不足时用0补位
create table t1(
name varchar(10),
age int(10) zerofill
);
zerofill表示这个列的数据长度不足时前面用0补位
insert into t1 values('aaa',18);
数据库约束
- 什么是主键:表示数据唯一性的字段称为主键
- 什么是约束:创建表时,给表字段添加的限制条件
主键约束效果就是当前列的数据在表中唯一且非空
create table t2(
int int primary key,
name varchar(10)
);
insert into t2 values(1,'aaa'); //成功
insert into t2 values(1,'bbb'); //报错,不能重复
insert into t2 values(null,'ccc'); //报错 不能为null
主键约束加自增
自增规则:从历史最大值+1,只增不减
create table t3(
int int primary key auto_increment,
name varchar(10)
);
insert into t3 values(null,'aaa'); //1
insert into t3 values(null,'bbb'); //2
insert into t3 values(10,'ccc'); //10
insert into t3 values(null,'ddd'); //11
delete from t3 where id >=10;
insert into t3 values(null,'eee'); //12
非空约束
被设置非空约束的列的数据不能为空
create table t4(
int int primary key auto_increment,
name varchar(10) not null,
addr varchar(30)
);
insert into t4 values(null,'aaa',null); //ok
insert into t4 values(null,null,'beijing'); //fail
insert into t4 values(null,'','shanghai'); //ok
唯一约束
被设置唯一约束的列数据不能出现重复的值
create table t5(
int int primary key auto_increment,
name varchar(10) not null,
phone varchar(11) unique
);
insert into t4 values(null,'aaa',null); //ok
insert into t4 values(null,'bbb','123'); //ok
insert into t4 values(null,'ccc','234'); //ok
insert into t4 values(null,'eee','123'); //fail
一个列可以同时设置非空约束和唯一约束,但是这样修饰的列并不是主键
数据查询
source 数据导入=>数据库上运行
linux上运行:source /home/emp.sql
windows上运行:source d:/emp.sql
判断null:(is null 和 is not null)
查询没有上级领导的员工信息
select * from emp where mgr is null;
查询有上级领导的员工姓名
select ename from emp where mgr is not null;
关系运算符:>, <, >=, <=, =, !=和<>
查询员工工资小于等于3000的姓名和工资
select ename,sal from emp where sal <=3000;
查询工作不是程序员的员工姓名和工作
select ename,job from emp where job !='程序员'; select ename,job from emp where job <>'程序员';
逻辑运算符:and 和 or 类似java中的&& 和 ||
查询1号部门工资高于2000的员工信息
select * from emp where deptno =1 and sal >2000;
查询工作是人事或工资大于3000的员工姓名,工资,工作
select ename,sal,job from emp where job ='人事' or sal >3000;
between关键字:between x and y(查询x和y直接,包含x和y)
查询工资在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关键字:in(x,y,z)
查询员工工资为3000,1500,5000的员工姓名和工资
select ename,sal from emp where sal =3000 or sal =1500 or sal =5000;
select ename,sal from emp where sal in(3000,1500,5000);
数据查询-模糊查询
1.通配符%:代表0个或多个任意字符
2.通配符_:代表1个任意字符
1.以x开头:'x%' //单引号,百分号
2.以x结尾:'%x'
3.包含x: '%x%'
4.第二个字符是x: '_x%'
5.倒数第三个字符是x: '%x__'
6.以x开头倒数第二个是y: 'x%y_'
查询姓孙的员工信息
select * from emp where ename like '孙%';
查询工作中包含销售的员工姓名和工作
select ename,job from emp where job like '%销售%';
查询名字中以精结尾的员工姓名
select ename from emp where ename like '%精';
数据查询
排序查询:order by 字段名 asc/desc
- 格式select 条件 from 表名 升序降序
- 当查询某个东西的大体信息前面用*,后面用where查询+排序+查什么
- 查询详细信息 select +要查什么+在哪里查+排序+根据什么查+倒序还是正序
查询员工姓名和工资按照工资降序排序
select ename,sal from emp order by sal desc;
查询1号部门的员工信息,按照工资升序排序
select * from emp where deptno =1 order by sal;
有时需依靠多个字段进行排序
格式:order by 字段1 asc/desc;
查询员工姓名,工资和部门编号,按照部门编号升序排序,如果部门编号一致则按照工资降序排序
select ename,sal,deptno from emp order by deptno,sal desc;
分页查询
limit x,y => x跳过的页数 y请求的条数
select * from emp order by sal limit 0,5 分页查询写到最后面'
数据查询(数值计算和聚合函数)
数值计算:可在出现数据的位置进行计算,包括且不限于+-*/等运算符,使用非常灵活
查询每个员工的姓名,工资及年终奖(5个月的工资)
select ename,sal,5*sal 年终奖 from emp;
查询每个员工的姓名,工资及涨薪5块钱之后的工资
select ename,sal,sal+5 涨薪后 from emp;
聚合函数
1.求和-sum:查询2号部门的工资总和
select sum(sal) from emp where deptno =2;
2.计数-count:查询工资大于2000块钱的员工数
select count(*) from emp where sal >2000;
3.平均值-avg:查询2号部门的平均工资
select avg(sal) from emp where deptno =2;
查询销售的平均工资
select avg(sal) from emp where job ='销售';
4.最大值-max:查询员工表中工资最大值
select ename,max(sal) from emp;
查询1号部门的最大奖金comm是多少
select max(comm) from emp where deptno =1;
最小值-min:查询1号部门的最低工资
select min(sal) from emp where deptno =1;
分组查询
1.group by关键字
在需求中出现每个或每种这样的关键字时使用分组查询
查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
2.having 关键字
- where后面只能写普通字段的条件不能写聚合函数的条件
- having结合分组查询group by使用,在having后面写聚合函数的条件
查询每个部门的平均工资只查询平均工资大于2000的
select ename,avg(sal) as tt from emp group by deptno having tt >2000;
几个关键字的总结
使用查询语句时应注意这些关键字的含义和顺序
select 字段信息
from 表名
where 条件
group by 字段
having 聚合条件
order by 排序字段
limit 跳过几条,查询几条
子查询(嵌套查询)
1.定义:在一条sql语句中,出现表达式的位置又编写了另一条sql语句
就是一个sql语句中嵌套了另一个sql查询语句
2.为何需要:一般情况下适用于比较复杂的查询需求
如我们至今为止学习到的sql查询语句只能针对一张数据表,如果需要多张数据表就可能需要子查询
3.使用:可通过下面的查询需求,理解子查询的使用和意义:
查询工资高于1号部门平均工资的员工信息
select avg(sal) from emp where deptno =1
select * from emp where sal >(select avg(sal) from emp where deptno =1)
查询工资最高的员工信息
select max(sal) from emp;
select * from emp where sal =(select max(sal) from emp);
查询工资高于2号部门最低工资的员工信息
select min(sal) from emp where deptno =2;
select * from emp where sal >(select min(sal) from emp where deptno =2);
关联查询
- 定义:同时查询多张表数据的查询
- 查询方式:等值连接,内连接,外连接
1.等值连接
- 格式:select 字段信息 from A,B where 关联关系 and 其他条件
- 关联查询必须写关联关系,若不写会得到2张表结果的乘积,这个乘积称为'笛卡尔积',这是一个错误的查询结果,工作中切记不要出现。
查询每个员工的姓名和对应的部门名
select e.ename,d.dname from emp e,dept d where e.deptno =d.deptno;
查询工资高于2000的员工姓名,工资和部门所在地
select e.ename,e.sal,d.loc from emp e,dept d where e.deptno =d.deptno and e.sal >2000;
2.内连接:查询结果跟等值连接查询的结果一样,建议使用内连接
- 格式:select 字段信息 from A join B on 关联条件 where 其他条件
查询每个员工的姓名和对应的部门名
select e.ename,d.dname from emp e join dept d on e.deptno =d.deptno;
查询1号部门的员工的姓名,工作,部门名和部门所在地
select e.ename,e.job,d.dname,d.loc from emp e join dept d on e.deptno =d.deptno where e.deptno =1;
3.外连接:等值连接和内连接查询到的是2张表的交集数据
- 外连接查询1张表的全部数据以及另外1张表的交集数据
- 格式:select 字段信息 from A left/right join B on 关联条件 where 其他条件
查询所有部门名以及部门对应的员工姓名
select d.dname,e.ename from emp e join dept d on e.deptno =d.deptno;
查询所有员工姓名和对应的部门信息
select e.ename,d.* from emp e left join dept d on e.deptno =d.deptno;
4.关联查询总结
-
3种查询方式(等值连接,内连接,外连接)
-
若查询的是2张表的交集数据则使用等值连接或内连接(推荐)
-
若查询的是1张表的全部和另外1张表的交集数据则使用外连接