数据库Database
学习如何对数据进行增删改查操作平时谈到的数据库指的就是一款软件(DBMSDataBaseManagementSystem), 电脑上安装了这个软件这台电脑就可以称为是数据库服
SQL语言
Structured Query Language 结构化查询语言执行SQL语句需要先连接数据库
windows: 开始菜单中找到MySQL/MariaDB 里面的 MySQL Client 并点击, 输入自己的密码后回车 (学生机无密码直接回车) root
linux/苹果系统: 桌面空白右键 打开终端 输入
mysql -uroot -p 回车 输入密码再回车退出: 关闭窗口 或执行 exit
如何检查MySQL服务是否开启
在我的电脑上右键->管理->服务->MySQL 查看是否启
动 如果没有 ,右键启动
SQL语句分类
● DDL: 数据定义语言, 包括数据库和表相关的SQL语言
● DML:数据操作语言, 包括数据的增删改查相关SQL
● DQL:数据查询语言, 只包括查询SQL
● TCL: 事务控制语言, 包括事务相关的SQL
● DCL: 数据控制语言, 包括权限分配相关SQL
DDL数据定义语言
● 包括数据库和表相关的SQL语句
● 往数据库软件中保存数据 需要先建库 再建表 最后往
表中保存数据
数据库相关SQL
SQL语句注意事项
以分号结尾
不区分大小写
可以有多个换行和空格
- 查询所有数据库
○ 格式: show databases; - 创建数据库
○ 默认字符集格式: create database 数据库名;
○ 指定字符集格式: create database 数据库名character set utf8/gbk;
○ show databases; 检查是否创建成功 - 查询数据库详情
○ 格式: show create database 数据库名; - 删除数据库
○ 格式: drop database 数据库名; - 使用数据库
○ 格式: use 数据库名;
表相关的SQL
操作表和数据必须提前使用了某个数据库 use db1;
- 创建表
○ 默认字符集格式: create table 表名(字段1名 类型,字段2名 类型);
○ 指定字符集格式: create table 表名(字段1名 类型,字段2名 类型) charset=utf/gbk; - 查询所有表
○ 格式: show tables; - 查询表详情
○ 格式: show create table 表名; - 查询表字段
○ 格式: desc 表名; - 删除表
○ 格式: drop table 表名; - 修改表名
格式: rename table 原名 to 新名;
表相关
- 添加表字段
○ 最后面添加格式: alter table 表名 add 字段名 类 型;
○ 最前面添加格式: alter table 表名 add 字段名 类 型 first;
○ 某个字段后面添加格式: alter table 表名 add 字段名 类型 after xxx; - 删除表字段
○ 格式: alter table 表名 drop 字段名; - 修改表字段
○ 格式: alter table 表名 change 原名 新名 新类型;
DML数据操作语言
- 插入数据
○ 全表插入格式: insert into 表名 values(值1,值2);
○指定字段插入格式: insert into 表名(字段1名,字段2名) values(值,值2);
○批量插入格式: insert into 表名 values(值1,值2),(值1,值2),(值1,值2);
insert into person values(‘Lucy’,20),(‘Lily’,18);
insert into person(name) values(‘Lilei’),(‘Hanmeimei’);
中文问题
insert into person values(‘张三’,50);
如果报错 执行 set names gbk; 回车后 再次执行
- 查询数据
○ 格式: select 字段信息 from 表名 where 条件; - 修改数据
○ 格式: update 表名 set 字段1名=值,字段2名=值 where 条件; - 删除数据
格式: delete from 表名 where 条件;
数据类型
● 整数: int(m) 和 bigint(m) , m代表显示长度 m=5 存18 查00018 , 如果使用显示长度需要结合zerofill关键字
● 举例: create table t1(name varchar(10),age int(5) zerofill);
insert into t1 values(‘aaa’,18);
select * from t1;
● 浮点数: double(m,d) m代表总长度,d代表小数长度
23.346 m=5 d=3 , decimal(m,d) 是超高精度浮点数
● 字符串:char(m): 固定长度字符串, m=10 存"abc" 占10,执
行效率略高 ,最大长度255
● varchar(m):可变长度字符串, m=10存"abc" 占3,节
省空间, 最大长度是65535,只建议保存255以内长度的数据
text(m):可变长度字符串,最大长度是65535
日期
date: 保存年月日
time: 保存时分秒
datetime: 保存年月日时分秒, 默认值为null,最大值为9999-12-31
timestamp(时间戳(指举例1970年1月1日0点0分0秒的毫秒数)):保存年月日时分秒, 默认值为当前系统时间, 最大值为2038-1-19
举例:
create table t_date(t1 date,t2 time,t3
datetime,t4 timestamp);
insert into t_date values(‘2020-12-
4’,null,null,null);
insert into t_date values(null,‘20:20:20’,‘2020-
12-20 20:20:20’,null);
主键约束primary key
什么是约束: 创建表时 给表字段添加的限制条件
什么是主键: 表示数据唯一性的字段称为主键
主键约束: 唯一且非空
如何使用:
create table t1(id int primary key,namevarchar(20));
insert into t1 values(1,‘aaa’);
insert into t1 values(1,‘bbb’);
//报 错:Duplicate entry ‘1’ for key ‘PRIMARY’ 主键数据重复
insert into t1 values(null,‘ccc’); //报 错:Column ‘id’ cannot be null
主键约束+自增 primary key auto_increment
自增规则: 从历史最大值+1
create table t2(id int primary key
auto_increment,name varchar(20));
insert into t2 values(null,‘aaa’); 1
insert into t2 values(null,‘bbb’); 2
insert into t2 values(10,‘ccc’); 10
insert into t2 values(null,‘ddd’); 11
delete from t2 where id>=10;
insert into t2 values(null,‘eee’); 12
导入*.sql批处理文件
下载emp.zip解压得到emp.sql 把文件移动到某个盘
的根目录,其他系统放到桌面
在终端中执行以下命令:
source d:/emp.sql;
测试是否成功:
show tables; 会显示2个表 emp和dept
select * from emp ; 如果出现乱码 执行 set names
gbk; 再次查询
is null 和 is not null
查询数据时如果查询值为null 则使用 is null不能写
=null , 不为null 是 is not null 不能是!=null
查询没有上级领导的员工信息
select * from emp where mgr is null;
去重distinct
去掉重复的数据
查询员工表中出现了哪几种不同的工作
select distinct job from emp;
比较运算符 > < >= <= = !=和<>
查询工资小于等于3000的员工姓名和工资
select ename,sal from emp where sal<=3000;
and 和 or
查询数据时多个条件同时满足时使用 and, 只需要满
足一个就可以时使用or
查询1号部门工资小于3000的员工信息
select * from emp where deptno=1 and sal<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);
两者之间between x and y 包含x和 y
- 查询工资在1000到2000之间的员工信息
select * from emp where sal>1000 and sal<2000;
select * from emp where sal between 1000 and
2000;
模糊查询like
● _: 代表1个未知字符
● %: 代表0或多个未知字符
● 举例: 以x开头: x%
● ○ 以x结尾: %x
● ○ 包含x: %x%
● ○ 以x开头y结尾 : x%y
● ○ 第二个字符是x : _x%
● ○ 第二个是x倒数第三个是y : _x%y _ _
查询工作中第二个字是售的员工信息
select * from emp where job like ‘_售%’;
排序 order by
格式: order by 字段名 asc(默认)/desc
- 查询每个员工的姓名和工资 按照工资升序排序
select ename,sal from emp order by sal; 升序
select ename,sal from emp order by sal asc; 升序
select ename,sal from emp order by sal desc; 降序
分页查询 limit
格式: limit 跳过的条数,请求的条数(每页的条数)
举例: limit (请求页数-1)*每页条数,请求条数
○ 请求第一页的10条数据 limit 0,10
○ 请求第3页的8条数据 limit 16,8
○ 请求第2页的10条数据 limit 10,10
○ 请求第8页的5条数据 limit 35,5
- 查询员工表中工资升序第一页的5条数据
select * from emp order by sal limit 0,5; - 查询员工表中工资降序第二页的3条数据
select * from emp order by sal desc limit 3,3;
数值计算 + - * / %
对查询的某个字段的数据可以直接进行运算
- 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)
select ename,sal,5*sal from emp;
别名
select ename from emp;
select ename as ‘姓名’ from emp;
select ename ‘姓名’ from emp;
select ename 姓名 from emp;
聚合函数
使用聚合函数可以对查询的多条数据进行统计查询
统计方式: 1. 平均值 2. 最大值 3. 最小值 4.求和 5.
计数
- 平均值avg(字段名)
○ 查询每一个员工的平均工资
select avg(sal) from emp; - 最大值max(字段名)
○ 查询1号部门的最高工资
select max(sal) from emp where deptno=1;
○ 查询员工表中的最高奖金
select max(comm) from emp; - 最小值min(字段名)
○ 查询1号部门的最低工资
select min(sal) from emp where deptno=1;
○ 查询1号部门最早入职日期
select min(hiredate) from emp where
deptno=1; - 求和sum(字段名)
○ 查询2号部门的工资总和
select sum(sal) from emp where deptno=2; - 计数count(* )
查询2号部门的人数
select count( * ) from emp where deptno=2;
查询程序员的人数
select count( * ) from emp where job=‘程序员’;
查询1号部门的平均工资,最高工资,最低工资,工资总
和,人数 并且起别名
select avg(sal) 平均工资, max(sal) 最高工资,
min(sal) 最低工资,sum(sal) 工资总和, count( * ) 人数
from emp where deptno=1;
分组查询group by
分组查询可以将某个字段相同值的数据划分成一组,然
后进行统计查询
- 查询每个部门的平均工资
select deptno,avg(sal) from emp group by deptno; - 查询每个部门的最高工资
select deptno,max(sal) from emp group by
deptno;
各个关键字的顺序
select 字段信息 from 表名 where 条件 group by 分
组字段名 order by排序字段名 limit 跳过的条数,请求
的条数;
having
where后面只能写普通字段条件
having后面写聚合函数条件,而且having关键字要和
group by结合使用,写在group by的后面
- 查询每个部门的平均工资,要求平均工资大于2000
select deptno,avg(sal) a from emp
group by deptno having a>2000; - 查询每种工作的人数要求人数大于1个,并且只查询1
号部门和2号部门的员工, 按照人数降序排序
select job,count(*) c from emp
where deptno in(1,2) group by job having c>1
order by c desc;
各个关键字的顺序
select 字段信息 from 表名 where 普通字段条件 group
by 排序字段名 having 聚合条件 order by 排序字段名
limit 跳过条数,请求条数;
子查询(嵌套查询)
- 查询工资高于1号部门平均工资的员工信息
select avg(sal) from emp where deptno=1;//查询1
号部门平均工资
//把上面的SQL 嵌入到下面SQL语句中
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); - 有的工作只有一个人, 那么查询有哪些人从事了这种
只有一个人的工作
//查询只有一个人的工作
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);
关联关系
创建表时,表和表之间存在的业务关系
●有哪几种关系:
○ 一对一: 有AB两张表,A表中一条数据对应B表中的
○ 一条,同时B表中的一条数据也对应A表中的一条.
○ 一对多: 有AB两张表,A表中一条数据对应B表中的多条,同时B表中的一条数据对应A表中的一条.
○ 多对多:有AB两张表,A表中一条数据对应B表中的
○ 多条,同时B表中的一条数据也对应A表中的多条.
●如何让表之间建立关系?
& nbsp 外键: 用来建立关系的字段称为外键
关联查询
同时查询多张表数据的查询方式称为 关联查询.
关联查询的方式有三种:
等值连接
内连接
外连接
关联查询之等值连接
格式: select * from A,B where A.x=B.x(关联关系)
and A.age>30;
- 查询1号部门的员工姓名,工资,工作和部门名,部门地
点
select ename,sal,job,dname,loc
from emp e,dept d
where e.deptno=d.deptno and e.deptno=1;
关联查询之内连接
格式: select * from A join B on A.x=B.x(关联关系)
where A.age>18;
等值连接和内连接查询到的数据是一样的,推荐使用内
连接
- 查询每个员工的姓名和对应的部门名
select ename,dname from emp e join dept d on e.deptno=d.deptno;
关联查询之外连接
等值连接和内连接查询到的是两个表的交集shuju,外
连接查询到的是一张表的全部 和另外一张表的交集
格式:select * from A left/right join B on A.x=B.x(关
联关系) where A.age>18;
insert into emp(empno,ename) values(100,‘灭霸’);
- 查询所有员工姓名和对应的部门名
select ename,dname
from emp e left join dept d
on e.deptno=d.deptno;
● 关联查询总结: 如果查询的是两张表的交集数据使用
等值连接或内连接(推荐),如果查询的是一张表的全部
和另外一张表的交集使用外连接.