Java第十九天:mysql(二)
文章目录
- 0.昨天查询继续
- 1.数据的约束(重点)
- 1.1默认值
- 1.2非空
- 1.3唯一
- 1.4主键[重点]
- 1.5自增长
- 1.6外键约束(开发中不常用)
- 1.7级联操作
- 2.联表查询
- 2.1内连接外连接
- 2.2一对多查询
- 2.3多对多查询
0.昨天查询继续
#select,
#在开发的时候不允许这样写的,会将咱们数据库person表里面所有的数据显示出来,会拖慢咱们数据库的效率
mysql > select * from person;#按照字段查询
msyql > select id, name from person;
mysql > select name, id from person;#按照字段查询,还可以给字段起一个别名
mysql > select id as "编号" , name as "姓名" , info as "信息" from person;#还可以使用最基本的条件进行查询
# > < >= <= != =
mysql > select * from person where id >= 19;#还可以使用逻辑运算符
mysql > select * from person where age > 12 and salary > 10000;
mysql > select * from person where age > 12 or salary > 10000;#排序 order by
mysql > select * from person order by age asc; #升序
mysql > select * from person order by age desc; #降序#按照年龄升序排,年龄相同的再按照salary降序进行排
mysql > select * from person order by age asc, salary desc;#分页查询【重点】limit
mysql > select * from person limit 0,5;#0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
#0-4 limit 0, 5;
#5-9 limit 5,5;
#10-14 limit 10,5;
#pagecount 页码数 length 表示一页显示多少条数据
#limit (pagecount - 1)*length, length;
#第二页 3
#limit 3,3;
#第三页
#limit 6,3;#内置函数(尽量不要用,因为会影响运行的效率)
mysql > select max(age) from person;
mysql > select min(age) from person;
mysql > select avg(age) from person;
mysql > select sum(age) from person;
#统计
mysql > select count(*) from person;--后期有用#模糊查询 _只是占位符而已
mysql > select * from person where name like "骚_";
mysql > select * from person where name like "_骚_";
mysql > select * from person where name like "骚%";
mysql > select * from person where name like "%骚%";#分组 group by
#按照性别分组
mysql > select * from person group by sex;
#按照性别进行分组,统计
mysql > select sex as "性别", count(*) from person group by sex;#按照性别分组,找出人数大于5的那一个组
mysql > select sex, count(*)--查什么
from person --从哪找
group by sex--以sex 分组
having count(*) > 5;--分组之后的条件不能再使用where 使用having#找出年龄大于20的,按照性别分组,找出人数大于3的组
mysql > select sex, count(*)
from person
where age > 20
group by sex
having count(*) > 3;
where order by group by having
1.数据的约束(重点)
1.1默认值
#用户在插入数据的时候没有给当前字段一个数据的话,当前字段会按照给的默认值进行处理mysql > create table person1 (
id int,
name varchar(30),
country char(20) default "PRC");
1.2非空
mysql > create table person2 (
id int not null,
name varchar(30),
info text
);mysql> insert into person2(name, info) values("随便", "太随便了");
ERROR 1364 (HY000): Field 'id' doesn't have a default value
1.3唯一
#要求你字段数据在当前数据表中不能重复
#unique
mysql > create table person3(
id int unique,
name varchar(30) not null,
info text not null
);
mysql> insert into person3(id, name, info) values(1, "浪博", "心浪微博");
Query OK, 1 row affected (0.01 sec)mysql> insert into person3(id, name, info) values(1, "浪博1", "心浪微博1");
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
1.4主键[重点]
#唯一和非空的一种组合方式
#primary key
#主键是该行数据唯一的索引
#一般工作的时候主键都是id 并且是唯一的, 会把和业务无关的字段设置为主键
#性别,年龄,地址,工资 等都不能设置为主键
mysql > create table person4 (
id int primary key,
name varchar(30) not null,
info text not null
);
1.5自增长
#插入数据的时候,有写字段可以自动增加
#auto_increment
#要想使用自增,字段类型必须是整型的数据,另外一个必须是key键 一般是主键
mysql > create table person5 (
id int primary key auto_increment,
name varchar(30) not null,
info text not null
);
注意事项主键是不能重复 自增 1以下的都不行,最好是让他自己增加
1.6外键约束(开发中不常用)
#员工表
mysql > create table employee(
id int primary key auto_increment,
empName varchar(30) not null,
depName varchar(30) not null,
regTime timestamp default current_timestamp
);mysql> select * from employee;
+----+------------+---------+---------------------+
| id | empName | depName | regTime |
+----+------------+---------+---------------------+
| 1 | 骚磊 | 骚 | 2019-11-26 11:28:18 |
| 2 | 骚杰 | 骚 | 2019-11-26 11:28:34 |
| 3 | 王宝强 | 绿 | 2019-11-26 11:29:15 |
| 4 | 贾乃亮 | 绿 | 2019-11-26 11:29:25 |
| 5 | 陈羽凡 | 绿 | 2019-11-26 11:29:59 |
| 6 | 蔡徐坤 | 击 | 2019-11-26 11:30:36 |
| 7 | 蔡徐坤1 | 击 | 2019-11-26 11:31:11 |
+----+------------+---------+---------------------+#分表操作
#上面这个表既有员工名字, 部门的名字
#员工表和部门表mysql > drop table employee;
#部门表
mysql > create table dept(id int primary key auto_increment,deptName varchar(20) not null);
#员工表
mysql > create table employee(id int primary key auto_increment,empName varchar(30) not null,deptId int not null);mysql> select * from dept;
+----+----------+
| id | deptName |
+----+----------+
| 1 | 骚 |
| 2 | 绿 |
| 3 | 击 |
+----+----------+mysql> select * from employee;
+----+-----------+--------+
| id | empName | deptId |
+----+-----------+--------+
| 1 | 骚磊 | 1 |
| 2 | 骚j杰 | 1 |
| 3 | 王宝强 | 2 |
| 4 | 蔡徐坤 | 3 |
| 5 | 贾乃亮 | 2 |
| 6 | 陈羽凡 | 2 |
+----+-----------+--------+
6 rows in set (0.00 sec)#插入一个员工数据,部门不存在,照样可以插入, 不符合真实开发中的业务逻辑
#删除一个数据 ,照样可以删除
mysql> create table dept(-> id int primary key auto_increment,-> deptName varchar(20) not null-> );
Query OK, 0 rows affected (0.03 sec)mysql> create table employee(-> id int primary key auto_increment,-> empName varchar(20) not null,-> deptId int not null,-> regTime timestamp default current_timestamp,#使用了外键约束,让两个表关联起来#fk_emp_dp 外键名字#foreign key 外键#dept(id) 参考一下这个键-> constraint fk_emp_dp foreign key(deptId) references dept(id)-> );
Query OK, 0 rows affected (0.03 sec)
#开始插入数据 部门表
mysql> insert into dept(deptName) values("骚");
Query OK, 1 row affected (0.01 sec)mysql> insert into dept(deptName) values("绿");
Query OK, 1 row affected (0.01 sec)mysql> insert into dept(deptName) values("鸡");
Query OK, 1 row affected (0.00 sec)#开始插入数据 员工表
mysql> insert into employee(empName, deptId) values("骚磊", 1);
Query OK, 1 row affected (0.05 sec)mysql> insert into employee(empName, deptId) values("骚杰", 1);
Query OK, 1 row affected (0.00 sec)mysql> insert into employee(empName, deptId) values("王宝强", 2);
Query OK, 1 row affected (0.03 sec)mysql> insert into employee(empName, deptId) values("蔡徐坤", 3);
Query OK, 1 row affected (0.04 sec)mysql> insert into employee(empName, deptId) values("贾乃亮", 2);
Query OK, 1 row affected (0.03 sec)mysql> insert into employee(empName, deptId) values("陈羽凡", 2);
Query OK, 1 row affected (0.01 sec)#插入的时候有外键的约束,在一个表中插入数据的时候,这个字段和另外一个表中的字段要有对应关系
mysql> insert into employee(empName, deptId) values("李云龙", 4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`laowanmian`.`employee`, CONSTRAINT `fk_emp_dp` FOREIGN KEY (`deptId`) REF
ERENCES `dept` (`id`))#删除
mysql> delete from dept where id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constrai
nt fails (`laowanmian`.`employee`, CONSTRAINT `fk_emp_dp` FOREIGN KEY (`deptId`)REFERENCES `dept` (`id`))#外键约束的特征:(部门表示主表, 员工表是从表)--1.先添加主表,再添加从表,如果添加时从表,直接报错--2.先删除从表, 再删除主表, 如果先删除主表,直接报错--3.先修改从表,再修改主表
1.7级联操作
自己演示:
--在使用外键的时候会出现问题
mysql> create table dept(-> id int primary key auto_increment,-> deptName varchar(20) not null-> );
Query OK, 0 rows affected (0.03 sec)mysql> create table employee(-> id int primary key auto_increment,-> empName varchar(20) not null,-> deptId int not null,-> regTime timestamp default current_timestamp,#使用了外键约束,让两个表关联起来#fk_emp_dp 外键名字#foreign key 外键#dept(id) 参考一下这个键-> constraint fk_emp_dp foreign key(deptId) references dept(id)-> on delete cascade->on update cascade
Query OK, 0 rows affected (0.03 sec)#on delete cascade 级联删除#on update cascade 级联修改
总结:
1.新建两个表 dept (部门表) employee(员工表) 没有加约束关系
2.随便增加 ,随便删除,随便更新 都不会报错但是不符合工作中业务逻辑
3.删除了上面建的两个表,然后有新建了dept (部门表) employee(员工表)加了外键约束
constraint fk_emp_dp foreign key(deptId) references dept(id)
4.删除主表(报错了) , 先删除从表再删除主表没有报错()
5.删除了上面建的两个表,然后有新建了dept (部门表) employee(员工表)加了外键约束和级联删除和更新
6.咋删除都不会报错了
2.联表查询
2.1内连接外连接
--员工表和部门表是有一定关系的,期望查到的数据带有对应部门的员工
--联表查询-- 考虑的内容
--1. 需要查什么?
--2.从哪里查?
--3.查询的条件是什么?--期望获得是员工的id 号,员工的名字,和部门的名字
--第一种写法
select employee.id, employee.empName,dept.deptName
from employee, dept
--where很关键 一对多的关系
where employee.deptId = dept.id;--第二种写法 可以给表名起别名
select e.id, e.empName, d.deptName
from employee e, dept d
where e.deptId = d.id;--第三种写法 可以给字段起别名
select e.id as "编码", e.empName as "姓名", d.deptName as "部门"
from employee e, dept d
where e.deptId = d.id;--可以加一些条件
select e.id as "编码", e.empName as "姓名", d.deptName as "部门"
from employee e, dept d
where e.deptId = d.id
order by e.id desc;--内连接查询(重要)
-- inner join#第四种写法
select e.id as "编号", e.empName as "姓名", d.deptName as "部门"
from employee e --查询数据的某一张表
inner join dept d --使用内连接查询,去连接另外一张表
where e.deptId = d.id;--左外连接 以左边的表为主,意味着左边的额表的数据不能丢失
select e.id as "编号", e.empName as "姓名", d.deptName as "部门"
from dept d
left outer join employee e
on e.deptId = d.id;--右外连接 以右边的表为主,意味着右边的数据不能丢
select e.id as "编号", e.empName as "姓名", d.deptName as "部门"
from dept d
right outer join employee e
on e.deptId = d.id;
一对一:用户表和详细信息表
一对多:一个老师对应多个学生(工作用的最大)
多对多:课程和学生的关系内连接:只连接匹配的项
外连接:没有的话会补上null
(自己打开一个excel)
2.2一对多查询
mysql > create table student(id int primary key auto_increment, -- 学生IDname varchar(20) not null, -- 学生姓名age int not null, -- 学生年龄gender tinyint(1) not null -- 学生性别
);mysql > create table score_record(id int primary key auto_increment, -- 成绩单IdstuId int not null, -- 当前成绩单对应的学生IDjavaScore float(5, 2) not null, -- Java成绩cScore float(5, 2) not null, -- C语言成绩htmlScore float(5, 2) not null -- HTML成绩
);mysql > insert into student(name, age, gender) values("骚磊", 16, 0);
mysql > insert into student(name, age, gender) values("骚杰", 66, 0);
mysql > insert into student(name, age, gender) values("骚很", 56, 0);
mysql > insert into student(name, age, gender) values("林妹妹", 15, 0);
mysql > insert into student(name, age, gender) values("宝哥哥", 18, 0);mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(1, 10.5, 20.5, 35.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(1, 12.5, 22.5, 33.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(1, 13.5, 21.5, 30.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(2, 20.5, 12.5, 30.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(2, 4.5, 51.5, 30.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(2, 20.5, 60.5, 5.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(3, 15.5, 21.5, 56.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(3, 13.5, 20.5, 78.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(4, 50.5, 15.5, 51.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(4, 20.5, 25.5, 53.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(5, 15.5, 76.5, 6.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(5, 12.5, 32.5, 1.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(5, 20.5, 3.5, 63.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(2, 12.5, 5.5, 5.5);
mysql > insert into score_record(stuId, javaScore, cScore, htmlScore) values(3, 15.5, 6.5, 10.5);
2.3多对多查询
mysql > create table user(id int primary key auto_increment,name varchar(20) not null, roleId int not null
);mysql > create table role(id int primary key auto_increment,roleName varchar(20) not null
);mysql > create table privilege(id int primary key auto_increment,pName varchar(20) not null
);mysql > create table role_to_privilege(id int primary key auto_increment,roleId int not null,pId int not null
);mysql > insert into user(name, roleId) values("张三", 1);
mysql > insert into user(name, roleId) values("李四", 2); mysql > insert into role(roleName) values("管理员");
mysql > insert into role(roleName) values("普通用户");mysql > insert into privilege(pName) values("删除用户"); -- 管理
mysql > insert into privilege(pName) values("添加用户"); -- 管理
mysql > insert into privilege(pName) values("修改用户"); -- 管理 用户
mysql > insert into privilege(pName) values("查看指定用户"); -- 管理 用户
mysql > insert into privilege(pName) values("查看所有用户"); -- 管理mysql > insert into role_to_privilege(roleId, pId) values(1, 1);
mysql > insert into role_to_privilege(roleId, pId) values(1, 2);
mysql > insert into role_to_privilege(roleId, pId) values(1, 3);
mysql > insert into role_to_privilege(roleId, pId) values(1, 4);
mysql > insert into role_to_privilege(roleId, pId) values(1, 5);
mysql > insert into role_to_privilege(roleId, pId) values(2, 3);
mysql > insert into role_to_privilege(roleId, pId) values(2, 4);
希望大家关注我一波,防止以后迷路,有需要的可以加我Q讨论互相学习java ,学习路线探讨,经验分享与java Q:2415773436
Java第十九天:mysql(二)相关推荐
- 小白学习Java第二十九天
今日内容 数据库的导入和导出 DQL 基本查询 条件查询 排序查询 函数 分组查询 分页查询 连接查询 一. 导入导出数据库 1.导出数据库 选中要导出的数据库,鼠标右键备份/导出-->备份数据 ...
- 学习Java第十九天(一):1、Java中的网络编程
1.Java中的网络编程 什么是网络? 在计算机领域中网络是信息传输,接收共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 作用:信息传输,资源共享 有点:资源共享免费 O ...
- JAVA面经复习(二十六)面试难度:☆☆☆☆
JAVA面经复习(二十六)面试难度:☆☆☆☆ 面试难度:☆☆☆☆ 推荐指数:☆☆☆☆☆ 推荐原因:总体来说本篇面经难度不高,且基本都是基础知识,不涉及复杂的分布式应用的工具,适合新手复习. 声明:答案 ...
- java从入门到精通二十四(三层架构完成增删改查)
java从入门到精通二十四(三层架构完成增删改查) 前言 环境准备 创建web项目结构 导入依赖和配置文件 创建层次模型 实现查询 实现添加 实现修改 完成删除 做一个用户登录验证 会话技术 cook ...
- MySQL二十八规范数据库设计
MySQL二十八:规范数据库设计 糟糕的数据库设计: ●数据冗余,浪费空间 ●数据库插入和删除都会麻烦.异常[ 屏蔽使用物理外键] ●程序的性能差 良好的数据库设计: ●节省内存空间 ●保证数据库的完 ...
- MySQL二十四:索引
MySQL二十四:索引的介绍与分类 MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构. 提取句子主干,就可以得到索引的本质:索引是数据结构. 在一个表中,主键索引 ...
- springboot毕设项目二手书交易平台95q22(java+VUE+Mybatis+Maven+Mysql)
springboot毕设项目二手书交易平台95q22(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBu ...
- mysql revoke 用法_mysql进阶(二十八)MySQL GRANT REVOKE用法
mysql进阶(二十八)MySQL GRANT REVOKE用法 MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执行查 ...
- Java游戏服务器开发之二十--xml配置文件
Java游戏服务器开发之二十--xml配置文件 游戏中使用的配置文件很多 像游戏中的关卡,英雄等级,装备之类都是使用配置文件(xml等) 比如有一个装备,配置表中有一条记录,数 ...
- java常见面试考点(二十五):CAS是什么
java常见面试考点 往期文章推荐: java常见面试考点(二十):Elasticsearch 和 solr 的区别 java常见面试考点(二十一):单点登录 java常见面试考点(二十二 ...
最新文章
- 哎..前段时间的偷懒..造成今天的被动局面...要检讨深刻教训.
- 清华大学 lt;现代软件工程gt; 项目小组名单
- c语言做一个小程序报告,《C语言程序设计实践》课程报告30个小程序组合成一个大程序.doc...
- 第十四节(接口(行为))
- 生成patch的diff命令是怎么写的?
- jsp 连接sql数据库查询(源代码)
- 图——基本的图算法(四)关键路径
- STAMP:扩增子、宏基因组统计分析神器(中文帮助文档)
- 日活两亿的快手,如何用AI理解视频、做好分发
- 171-路飞12-课程页面和课程数据表构建
- 爆笑校园生活——人在校园的日子
- vip html代码,vip.html
- 从线下走到线上,艺术品能否找到新突破口?
- 正则表达式,终极使用!3个工具,搞定一切
- mysql5.7.19收费》_mysql5.7.19安装
- 多线程5:对象的发布与逸出(线程安全性)
- html怎么设置y轴,Y轴方向跑马灯的实现
- 人生第一次心理咨询逐字稿以及分析
- 【OKR工作方法】““Objectives Key Results目标与关键结果”,怎么学习OKR方法,OKR的优势是什么
- 有关公司类型、部门的英文