根本应用
数据库DataBase
- 学习数据库次要学习的就是如何对数据进行增删改查操作
- 平时所提到的数据库(DBMS数据库管理系统)实际上就是款软件, 电脑上装置了这个软件,电脑就能够成为数据库服务器
常见的DBMS(数据库软件):
- MySQL: Oracle公司产品, MySQL在08年被Sun公司收买,09年Sun公司被Oracle收买, 目前市占率第一, 开源软件, 原MySQL创始人从Oracle到职开办MariaDB
- Oracle: Oracle公司产品,闭源, 性能最强价格最贵, 市占率第二 , 拉里埃里森
- SQLServer: 微软公司产品, 市占率第三 , 闭源 . 次要利用在微软的整套解决方案中(开发网站须要用到的所有= 编程语言+web服务软件+操作系统+数据库软件)
- DB2: IBM公司产品,闭源 次要利用在IBM的整套解决方案中
- SQLite: 轻量级数据库, 安装包只有几十k, 性能只具备最根底的增删改查 .
开源和闭源
- 开源: 凋谢源代码, 有技术大拿无偿保护降级, 产品收费 靠卖服务盈利
- 闭源: 不凋谢源代码, 有黑客或技术大拿攻打,然而闭源公司有钱 雇人保护降级, 靠卖产品和卖服务盈利
- 学习数据库次要是学习一门语言: SQL(Structured Query Language) 结构化查询语言 , 用于程序员和数据库软件之间进行交换
执行SQL语句须要先连贯数据库软件
- window: 开始->所有程序->MySQL或MariaDB->MySQL Client 点击 运行输出明码后回车
- Linux零碎: 在桌面上右键 关上终端, 输出 mysql -uroot -p 回车 输出明码再回车.
如何查看MySQL服务是否开启?
在我的电脑上右键->治理->服务->MySQL 查看是否启动 如果没有,右键启动
SQL语句分类:
- DDL: 数据定义语言,
- DML: 数据操作语言
- DQL: 数据查询语言
- TCL: 事务管制语言
- DCL: 数据管制语言
DDL数据定义语言
- 包含数据库相干和表相干的SQL语句
- 应用数据库软件保留数据须要先建库再建表
数据库相干的SQL
查问所有数据库
- 格局: show databases;
创立数据库
- 格局: create database 数据库名;
举例:
create database db1;
create database db2 character set utf8;
create database db3 character set gbk;
查询数据库详情
- 格局: show create database 数据库名;
举例:
show create database db1;
删除数据库
- 格局: drop database 数据库名;
举例:
drop database db3;
应用数据库
- 格局: use 数据库名;
举例:
use db1;
数据库相干回顾
- 查问所有 show databases;
- 创立 create database db1 character set utf8/gbk;
- 查问详情 show create database db1;
- 删除数据库 drop database db1;
- 应用数据库 use db1;
数据库相干练习
别离创立mydb1和mydb2数据库 字符集第一个是utf8第二个是gbk
create database mydb1;
create database mydb2 character set gbk;
查问所有数据库查看是否创立胜利
show databases;
别离查问两个数据库的字符集 查看是否胜利
show create database mydb1;
show create database mydb2;
先应用mydb1再应用mydb2
use mydb1;
use mydb2;
删除两个数据库
drop database mydb1;
drop database mydb2;
表相干的SQL
- 操作表相干的SQL语句肯定要保障应用了某个数据库, 不然会报错
创立表
- 格局: create table 表名(字段1名 类型,字段2名 类型);
- 格局: create table 表名(字段1名 类型,字段2名 类型) charset=utf8/gbk;
举例:
create table student(name varchar(20),age int);
create table hero(name varchar(20),type varchar(20), money int)charset=gbk;
查问所有表
- 格局: show tables;
查问表详情
- 格局: show create table 表名;
- 举例: show create table hero;
查问表字段
- 格局: desc 表名;
删除表
- 格局: drop table 表名;
批改表名
格局: rename table 原名 to 新名;
rename table student to stu;
练习题
创立数据库db5 字符集为gbk 并应用
create database db5 character set gbk;
use db5;
创立表t_hero英雄表 有名字和年龄字段 默认字符集
create table t_hero(name varchar(20),age int);
批改表名为 hero
rename table t_hero to hero;
查问表字段
desc hero;
- 删除表 drop table hero;
- 删除数据库 drop database db5;
表相干续
给表增加字段
- 最初面增加格局: alter table 表名 add 字段名 类型;
- 最后面增加格局: alter table 表名 add 字段名 类型 first;
- 在xxx字段前面增加格局: alter table 表名 add 字段名 类型 after xxx;
举例:
create table emp(name varchar(20));
alter table emp add age int;
alter table emp add id int first;
alter table emp add gender varchar(10) after name;
删除表字段
格局: alter table 表名 drop 字段名;
alter table emp drop gender;
批改表字段
- 格局: alter table 表名 change 原名 新名 新类型;
- 举例: alter table emp change age salary int;
表相干回顾
- 创立表 create table t1(name varchar(20),age int)charset=utf8/gbk;
- 查问所有表 show tables;
- 查问表字段 desc t1;
- 查问表详情 show create table t1;
- 删除表 drop table t1;
- 批改表名 rename table t1 to t2;
- 增加表字段 alter table t1 add age int first/after xxx;
- 删除表字段 alter table t1 drop age;
- 批改表字段 alter table t1 change 原名 新名 新类型;
DML数组操作语言
- 包含对数据的增删改查
create database db4 character set utf8;use db4;create table person(name varchar(20),age int)charset=utf8;
插入数据
- 全表插入格局: insert into 表名 values(值1,值2,值3);
- 指定字段插入格局: inert into 表名(字段1名,字段2名) values(值1,值2);
举例:
insert into person values("Tom",18);
insert into person(name) values("Jerry");
批量插入格局: insert into 表名 values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
insert into person values("Lucy",20),("Lily",21);
insert into person(name) values("Lilei"),("Hanmeimei");
插入中文数据:
insert into person values("传奇哥",18);
如果执行带有中文的SQL语句报以下谬误, 解决方案: set names gbk;
查问
- 格局: select 字段信息 from 表名 where 条件;
举例:
select name from person;
select name,age from person;
select * from person;
select * from person where age=18;
select * from person where name="Lucy";
批改
- 格局: update 表名 set 字段1名=值,字段2名=值 where 条件;
举例:
update person set age=50 where name='Jerry';
把Tom名字改成汤姆年龄改成50
update person set age=50,name="汤姆" where name="Tom";
删除
- 格局: delete from 表名 where 条件;
举例:
delete from person where name="Lucy";
delete from person where age<50;
delete from person;
数据相干SQL回顾
- 插入数据: insert into t1(字段1名,字段2名) values(值1,值2),(值1,值2);
- 查问数据: select 字段信息 from t1 where 条件;
- 批改数据: update t1 set xxx=xxx,xxx=xxx where 条件;
- 删除数据: delete from t1 where 条件;
综合练习
1. 创立数据库mydb3 字符集utf8 并应用create database mydb3 character set utf8;use mydb3;2. 创立hero表 字段:id,name,type varchar(10)create table hero(id int,name varchar(10),type varchar(10));3. 表中插入以下数据: insert into hero values (1, '李白', '刺客'),(2, '诸葛亮' , '法师'), (3, '刘备', '兵士'), (4, '孙尚香', '射手'), (5, '关羽', '兵士'), (6, '刘禅', '辅助');4. 批改李白的type为诗人 update hero set type='诗人' where name='李白';5. 给表增加money字段 alter table hero add money int;6. 批改id小于5的money为6888 update hero set money=6888 where id<5; 7. 批改诗人为打野 update hero set type="打野" where type="诗人"; 8. 批改刘禅名字为阿斗价格为50 update hero set name="阿斗",money=50 where name="刘禅";9. 删除id大于5的数据 delete from hero where id>5;10. 批改所有英雄的价格为13888 update hero set money=13888;11. 批改表名为heros rename table hero to heros; 12. 删除money字段 alter table heros drop money;13. 删除所有数据 delete from heros;14. 删除表 drop table heros; 15. 删除数据库 drop database mydb3;
数据库数据类型
整数: int(m) 和bigint(m) , m代表显示长度, m=10 18 0000000018 , 须要和zerofill关键字联合应用
create table t1 (id int,age int(10) zerofill);
insert into t1 values(1,18);
select * from t1;
- 浮点数: double(m,d) m代表总长度, d代表小数长度 54.234 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 倡议保留长度大于255的数据
短的用varchar长的用text
日期
- 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("2020-10-10",null,null,null);
insert into t_date values(null,"17:12:11","2018-11-12 11:11:11",null);
具体应用
### 主键束缚
- 什么是束缚: 束缚是创立表字段时增加的限度条件
- 什么是主键: 示意数据唯一性的字段称为主键
- 主键束缚: 限度主键的值 惟一且非空
如何应用:
create table t1(id int primary key,name varchar(20)); insert into t1 values(1,'aaa'); //正确 insert into t1 values(1,'bbb'); //报错 Duplicate entry 反复数据 insert into t1 values(null,'ccc'); //报错 Cannot be null 不能为空
自增 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,'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 把文件复制到d盘根目录 其它零碎放到桌面
在终端中执行以下指令 导入emp.sql外面的数据 到MySQL中
source d:/emp.sql;
- 测试: select * from emp; //如果有乱码 执行 set names gbk;
is null 和 is not null
查问字段的值为null时 应用 is null 反之应用 is not null
查问没有上级领导的员工信息
select * from emp where mgr is null;
查问有上级领导的员工信息
select * from emp where mgr is not null;
去重 distinct
查问员工表中呈现的不同的工作
select distinct job from emp;
查问员工表中呈现的部门编号 去掉反复
select distinct deptno from emp;
比拟运算符 > < >= <= = !=和<>
查问工资小于等于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
- and相似Java中的 && ,有多个条件同时满足时应用
- or类型java中的|| , 有多个条件满足一个就行的时候应用
查问1号部门工资小于3000的员工信息
select * from emp where deptno=1 and sal<3000;
查问3号部门或工作是程序员的员工信息
select * from emp where deptno=3 or job='程序员';
查问有上级领导中工资小于2000的员工姓名,工资和领导编号
select ename,sal,mgr from emp where mgr is not null and sal<2000;
in关键字
查问工资值为3000,1500,5000的员工信息
select * from emp where sal=3000 or sal=1500 or sal=5000;
select * from emp where sal in(3000,1500,5000);
查问工作是程序员和CEO的员工姓名和工作
select ename,job from emp where job in("程序员","CEO");
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;
查问工资在1000-2000以外的员工信息
select * from emp where sal not between 1000 and 2000;
综合练习
查问有上级领导并且是3号部门的员工信息
select * from emp where mgr is not null and deptno=3;
查问2号部门工资在1000到2000之间的员工姓名 工资和部门编号
select ename,sal,deptno from emp where deptno=2 and sal between 1000 and 2000;
查问1号部门工资为800和1600的员工信息
select * from emp where deptno=1 and sal in(800,1600);
查问1号和2号部门工资高于2000的员工信息
select * from emp where deptno in(1,2) and sal>2000;
含糊查问 like
- _: 代表1个未知字符
- %:代表0或多个未知字符
举例:
- 以x结尾 x%
- 以x结尾 %x
- 以x结尾y结尾 x%y
- 蕴含x %x%
- 第二个字符是x _x%
- 第二个是x倒数第三个是y x%y_
查问姓孙的员工姓名
select ename from emp where ename like "孙%";
查问工作中第二个字是售 的员工信息
select * from emp where job like "_售%";
查问名字中以精结尾的员工姓名
select ename from emp where ename like "%精";
查问名字蕴含僧字的员工姓名和工资
select ename,sal from emp where ename like "%僧%";
排序 order by
- 格局: order by 字段名 asc升序(默认)/desc降序
查问每个员工的姓名和工资,依照工资升序排序
select ename,sal from emp order by sal;
查问每个员工的姓名和工资,依照工资降序序排序
select ename,sal from emp order by sal desc;
查问3号部门的员工信息 依照工资降序排序
select * from emp where deptno=3 order by sal desc;
查问每个员工的姓名,工资和部门编号依照部门编号升序排序(多字段排序)
select ename,sal,deptno from emp order by deptno,sal desc;
分页查问 limit
- 格局: limit 跳过的条数,申请的条数(每页的条数)
举例: limit (页数-1)*条数,条数
- 申请1页的10条数据 limit 0,10
- 申请第三页的5条数数据 limit 10,5
- 申请第5页的8条数据 limit 32,8
- 申请15页的10条数据 limit 140,10
查问员工表中第一页的5条数据
select * from emp limit 0,5;
查问员工表中第2页的3条数据
select * from emp limit 3,3;
查问员工表中第3页的2条数据
select * from emp limit 4,2;
查问工资高于1000的员工信息 依照工资降序排序查问前三条
select * from emp where sal>1000 order by sal desc limit 0,3;
数值计算 + - * / %
- 对查问的某个字段的值 进行计算
查问每个员工的姓名,工资和年终奖(年终奖=5个月工资)
select ename,sal,sal*5 from emp;
批改1号部门的员工工资 每人涨薪5块钱
update emp set sal=sal+5 where deptno=1;
综合练习
1. 查问有领导并且工资在1000到3000之间的员工信息select * from emp where mgr is not null and sal between 1000 and 3000;2. 查问1号部门有几种不同的工作select distinct job from emp where deptno=1;3. 查问名字中蕴含精或者工作中蕴含序的员工姓名和工作select ename,job from emp where ename like "%精%" or job like "%序%";4. 查问3号部门工资最高的员工姓名和工资select ename,sal from emp where deptno=3 order by sal desc limit 0,1;5. 查问上级领导编号是8工资最高的3集体的信息select * from emp where mgr=8 order by sal desc limit 0,3;6. 查问1号部门和2号部门的员工信息工资升序,查问第3页的2条数据select * from emp where deptno in(1,2) order by sal limit 4,2;
聚合函数
- 聚合函数就是对查问的多条数据进行统计查问
- 统计形式: 1. 平均值 2. 最大值 3. 最小值 4. 求和 5. 计数
平均值avg(字段名)
查问所有员工的平均工资
select avg(sal) from emp;
查问2号部门的平均工资
select avg(sal) from emp where deptno=2;
最大值max(字段名)
查问1号部门的最高工资
select max(sal) from emp where deptno=1;
查问工资高于2000块钱的员工中资格最小的员工是什么时候入职的
select max(hiredate) from emp where sal>2000;
最小值min(字段名)
查问2号部门的最低工资
select min(sal) from emp where deptno=2;
求和sum(字段名)
查问1号部门的工资总和
select sum(sal) from emp where deptno=1;
计数count(字段名)
查问1号部门工资大于2000的员工数量
select count(*) from emp where deptno=1 and sal>2000;
别名
select ename as "姓名" from emp;select ename "姓名" from emp; select ename 姓名 from emp;
查问1号部门的平均工资,最高工资,最低工资,工资总和,人数 起别名
select avg(sal) 平均工资, max(sal) 最高工资,min(sal) 最低工资,sum(sal) 工资总和,count(*) 人数 from emp where deptno=1;
综合练习题
查问员工表中工资高于2000的员工姓名和工资,依照工资升序排序,查问第二页的2条数据(每页2条)
select ename,sal from emp where sal>2000 order by sal limit 2,2;
查问和销售相干工作的工资总和
select sum(sal) from emp where job like "%销售%";
- 查问程序员的人数 select count(*) from emp where job="程序员";
查问1号部门中有领导的员工中的最高工资
select max(sal) from emp where deptno=1 and mgr is not null;
查问2号部门的最高工资和最低工资并起别名
select max(sal) 最高工资,min(sal) 最低工资 from emp where deptno=2;
查问1号部门的外面名字中蕴含空的员工姓名
select ename from emp where deptno=1 and ename like "%空%";
分组查问 group by
- 分组查问能够将某个字段雷同值的数据划分成一组 而后进行统计查问
查问每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;
查问每个部门的最高工资
select deptno,max(sal) from emp group by deptno;
查问每种工作的工资总和
select job,sum(sal) from emp group by job;
查问每个部门工资高于2000的员工人数
select deptno,count(*) from emp where sal>2000 group by deptno;
各个关键字的程序
select * from 表名 where 条件 group by 分组字段名 order by 排序字段 limit 跳过条数,申请条数
查问每个部门工资高于1000的员工人数,依照人数降序排序取前两条数据
select deptno,count(*) from emp where sal>1000 group by deptno order by count(*) desc limit 0,2;
综合练习题
1. 查问没有上级领导的员工编号empno,姓名,工资2. 查问有奖金的员工姓名和奖金3. 查问名字中蕴含精的员工姓名和工资4. 查问名字中第二个字是八的员工信息5. 查问1号部门工资大于2000的员工信息6. 查问2号部门或者工资低于1500的员工信息7. 查问工资为3000,1500,5000的员工信息依照工资升序排序8. 查问3号部门的工资总和9. 查问每个部门工资大于1000的员工人数,依照人数升序排序10. 查问每种工作中有领导的员工人数依照人数降序排序11. 查问所有员工信息,依照部门编号升序排序,如果部门编号统一则工资降序12. 查问有领导的员工,每个部门的编号和最高工资13. 查问有领导的员工,依照工资升序排序,第3页的2条数据14. 查问员工表中工资高于2000的员工姓名和工资,依照工资升序排序,查问第二页的2条数据15. 查问和销售相干的工作的工资总和16. 查问程序员人数 17. 查问1号部门中有领导的员工中的最高工资18. 查问2号部门的最高工资和最低工资 起别名19. 查问1号部门外面名字中蕴含空字的员工姓名20. 查问每个部门工资低于2000的人数
having关键字
- where前面只能写一般字段条件, having前面写聚合函数条件
- having要和group by 联合应用,并且写在group by的前面
查问每个部门的平均工资,要求平均工资大于2000
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
select deptno,avg(sal) a from emp group by deptno having a>2000;
查问每种工作的人数,只查问人数大于1的
select job,count(*) c from emp group by job having c>1;
查问每个部门的工资总和,只查问有领导的员工,并且要求工资总和高于5400
select deptno,sum(sal) s from emp where mgr is not null group by deptno having s>5400;
查问每个部门的平均工资,只查问工资在1000到3000之间的,并且过滤掉平均工资低于2000的部门
select deptno,avg(sal) a from emp
where sal between 1000 and 3000 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;
select * from emp where sal>2330;
合并下面两条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);
查问工资高于2号部门最低工资的员工信息
select * from emp where sal>(select min(sal) from emp where deptno=2);
查问和孙悟空雷同工作的其它员工信息
select job from emp where ename="孙悟空";
select * from emp where job=(select job from emp where ename="孙悟空") and ename!="孙悟空";
查问拿最低工资员工的共事们的信息(共事指雷同部门)
失去最低工资
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);
查问白骨精的部门信息(须要用到部门表dept)
select deptno from emp where ename="白骨精";
select * from dept where deptno=(select deptno from emp where ename="白骨精");
表关系()-关联关系
- 创立表时,表和表之间存在的业务关系
有哪几种关系:
一对一(个别写在一张表,比拟少见): 有AB两张表,A表中一条数据对应B表中的一条数据,同时B表中的一条数据也对应A表中的一条数据.
eg:一个人只有一张身份证,一张身份证只对应一个档案,一份档案只保留一个身份信息
一对多(最常见):有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据.
eg:一个部门有多个员工,一个员工只能属于一个部门
多对多:有AB两张表,A表中一条数据对应B表中的多条数据,同时B表中的一条数据也对应A表中的多条数据.
eg:一个老师教多个学生,一个学生被多个老师教
表和表之间如何建设关系
通过一个独自的字段指向另外一张表(或本人表)的主键, 这个字段称为外键
关联查问
- 同时查问多张存在关联关系的表时 应用的查问形式称为关联查问
- 关联查问的查问形式有三种: 1. 等值连贯 2. 内连贯 3. 外连贯
关联查问之等值连贯
- 格局: select * from A,B where A.x=B.x(关联关系) and A.age>30;
查问每个员工的姓名和对应的部门名
select ename,dname from emp e,dept d where e.deptno=d.deptno;
查问2号部门员工的姓名,工资和部门地址
select ename,sal,loc from emp e, dept d where e.deptno=d.deptno and e.deptno=2;
查问孙悟空和刘备的部门信息
select d.*
from emp e, dept d
where e.deptno=d.deptno
and ename in("孙悟空","刘备");
关联查问之内连贯
- 等值连贯和内连贯的作用是一样的, 查问到的是两个表的交加数据
- 格局: select * from A join B on A.x=B.x(关联关系) where A.age>30;
查问每个员工的姓名和对应的部门名
select ename,dname from emp e join dept d on e.deptno=d.deptno;
查问1号部门有领导的员工姓名,工资,部门名和部门地址
select ename,sal,dname,loc
from emp e join dept d
on e.deptno=d.deptno
where e.deptno=1 and e.mgr is not null;
关联查问之外连贯
- 查问的是一张表的全副和另外一张表的交加
格局: select * from A left/right join B on A.x=B.x(关联关系) where A.age>30;
筹备一个员工表中的交加以外的数据
insert into emp (empno,ename) values(100,'灭霸');
查问所有员工的姓名和对应的部门名
select ename,dname
from emp e left join dept d
on e.deptno=d.deptno;
查问所有部门的名称,地址和对应的员工姓名
select dname,loc,ename
from emp e right join dept d
on e.deptno=d.deptno;
关联查问总结
- 如果查问的数据是两个表的交加数据应用等值连贯或内连贯(举荐)
- 如果查问的是一张表的全副数据和另外一张表的交加数据则应用外连贯