Java学习路线-42:SQL进阶:约束、关系、连接

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Java学习路线-42:SQL进阶:约束、关系、连接

SQL进阶:约束、关系、连接

课时1 1.单表的查询练习

可视化客户端 SQLyog


-- 查询部门编号为30的所有员工
select * from emp where deptno=30;
-- 查询所有销售员的姓名、编号和部门编号
select ename, empno, deptno from emp where job='销售员'
-- 查询奖金高于工资的员工
select * from emp where comm > sal;
-- 查询奖金高于工资60%的员工
select * from emp where comm > sal * 0.6;
-- 查询部门编号为10中所有经理,和部门编号编号为20中所有销售员的详细资料
select * from emp 
where (deptno=10 and job='经理')
or (deptno=20 and job='销售员');
-- 查询部门编号为10中所有经理,和部门编号编号为20中所有销售员,
-- 还有既不是经理又不是销售员但工资大于等于20000的所有员工详细资料
select * from emp 
where (deptno=10 and job='经理')
or (deptno=20 and job='销售员')
or (job not in ('经理', '销售员') and sal >= 2000);
-- 无奖金或奖金低于1000的员工
select * from emp where comm is null or comm < 1000;
-- 查询名字由3个字组成的员工(3个下划线)
select * from emp where ename like '___';
-- 查询2000年入职的员工
select * from emp where hiredate like '2000-%';
-- 查询所有员工,用编号升序排序
select * from emp order by empno asc;
-- 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序
select * from emp order by sal desc, hiredate asc;
-- 查询每个部门的平均工资
select deptno, avg(sal) from emp group by deptno;
-- 查询每个部门雇员数量
select deptno, count(*) from emp group by deptno;
-- 查询每种工作的最高工资,最低工资,人数
select job, max(sal), min(sal), count(*) from emp group by job;

课时2 2.mysql编码问题

-- 查看MySQL的数据库编码
show variables like 'char%';
-- 临时设置变量
set character_set_client=utf8
set character_set_results=utf8

永久设置:

my.ini中配置


课时3 3.mysql备份与恢复数据库

1、备份:数据库->SQL语句


$ mysqldump -u用户名 -p密码 数据库名 > 要生成的SQL脚本路径

2、恢复:SQL语句->数据库


$ mysql -u用户名 -p密码 数据库名 < 要生成的SQL脚本路径
# 或者
> source 要生成的SQL脚本路径

课时4 4.约束之主键约束

特点:唯一,非空,被引用


指定id列为主键列


-- 1、创建表时指定主键
create table stu(
    id int primary key,
    name varchar(20)
)
-- 或者
create table stu(
    id int,
    name varchar(20),
    primary key(id)
)
-- 2、已存在表添加主键
alter table stu add primary key(id);
-- 3、删除主键
alter table stu drop primary key;

课时5 5.主键自增长

保证插入数据时主键唯一非空


-- 1、创建表时指定主键自增长

create table stu(
    id int primary key auto_increment,
    name varchar(20)
)
-- 设置字段自增长
alter table stu change id id int auto_increment;
-- 删除自增长
alter table stu change id id int;

uuid作为主键

课时6 6.非空和唯一约束

非空约束:不能为null
not null
唯一约束:不能重复
unique
create table stu(
    id int primary key auto_increment,
    name varchar(20) not null unique 
)

课时7 7.概述模型、对象模型、关系模型

1、对象模型

is a 继承

has a 关联 1对1 1对多 多对多

use a


2、关系模型

数据库中的表


代码实现


// 一对一关系 丈夫-妻子
class  Husband{
    private Wife wife;
}
class Wife{
    private Husband husband;
}
// 一对多关系 部门-员工
class Employee{
    private Department department;
}
class Department{
    private List<Employee> employee;
}
// 多对多关系 老师-学生
class Student{
    private List<Teacher> teachers
}
class Teacher{
    private List<Student> students
}

外键约束

外键引用主键,必须引用另一张表主键

外键可以重复

外键可以为空

一张表中可以有多个外键


课时8 8.外键约束

create table dept(
    deptno int primary key auto_increment,
    dname varchar(50)
)
insert into dept values(10, '人力部');
insert into dept values(20, '研发部');
insert into dept values(30, '财务部');
-- 创建表时添加外键约束
create table emp(
    empno int primary key auto_increment,
    ename varchar(50),
    dno int,
    constraint fk_emp_dept foreign key(dno) references dept(deptno)
)
-- 添加外键约束
alter table emp add constraint fk_emp_dept foreign key(dno) references dept(deptno)
insert into emp(ename) values('张三');
insert into emp(ename, dno) values('李四', 10);
insert into emp(ename, dno) values('王五', 20);

课时9 9.一对一关系

从表的主键就是外键

create table husband(
    hid int primary key auto_increment,
    hname varchar(50)
)
insert into husband(hname) values ('刘备'), ('关羽'), ('张飞')
create table wife(
    wid int primary key auto_increment,
    wname varchar(50),
    constraint fk_wife_husband foreign key(wid) references husband(hid)
)
-- wid 非空,唯一,引用hid
insert into wife(wid, wname) values(1, '杨贵妃');
insert into wife(wid, wname) values(2, '西施');

课时10 10.多对多关系

create table student(
    sid int primary key auto_increment,
    sname varchar(50)
)
create table teacher(
    tid int primary key auto_increment,
    tname varchar(50)
)
create table stu_tea(
    sid int,
    tid int,
    constraint fk_student foreign key(sid) references student(sid),
    constraint fk_teacher foreign key(tid) references teacher(tid)
)
insert into student(sname) values('段誉');
insert into student(sname) values('乔峰');
insert into student(sname) values('虚竹');
insert into teacher(tname) values('黄老师');
insert into teacher(tname) values('刘老师');
insert into teacher(tname) values('李老师');
insert into stu_tea(sid, tid) values(1, 1);
insert into stu_tea(sid, tid) values(2, 1);
insert into stu_tea(sid, tid) values(3, 1);
insert into stu_tea(sid, tid) values(1, 2);
insert into stu_tea(sid, tid) values(3, 2);
insert into stu_tea(sid, tid) values(1, 3);
insert into stu_tea(sid, tid) values(2, 3);

课时11 11.合并结果集

要合并的结果集表结构一样(列数, 列类型)


create table tb_a(id int, a_name varchar(50));
insert into tb_a(id, a_name) values(1, '1');
insert into tb_a(id, a_name) values(2, '2');
insert into tb_a(id, a_name) values(3, '3');
create table tb_b(id int, b_name varchar(50));
insert into tb_b(id, b_name) values(3, '3');
insert into tb_b(id, b_name) values(4, '4');
insert into tb_b(id, b_name) values(5, '5');
-- 不合并重复行
select * from tb_a union all select * from tb_b;
-- 合并重复行
select * from tb_a union select * from tb_b;

课时12 12.连接查询之内连接(方言)

-- 方言
select * from 表1 别名1, 表2 别名2 where 别名1.xx = 别名2.xx;
-- 标准 (推荐)
select * from 表1 别名1 inner join 表2 别名2 on 别名1.xx = 别名2.xx;
-- 自然
select * from 表1 别名1 natural join 表2 别名2

笛卡尔积:

(a, b, c) X (1, 2)
-> 
a1, a2, b1, b2, c1, c2
-- 笛卡尔积
select * from emp, dept
-- 员工对应部门信息
select * from emp, dept where emp.dno=dept.deptno;
-- 打印所有员工的姓名,部门名称, 取别名
select e.ename, d.dname
from emp e, dept d
where e.dno=d.deptno;

课时13 13.连接查询之内连接(标签和自然)

-- 标准推荐
select * from emp inner join dept on emp.dno=dept.deptno;
-- 自动加where条件
select * from emp natural join dept

课时14 14.连接查询之外连接

主表中所有记录都会打印, 副表没有null补位


-- 左外连接, 左表为主
select e.ename, ifnull(d.dname, '无部门') as dname
from emp e left outer join dept d
on e.dno=d.deptno;
-- 右外连接, 右表为主
select e.ename, d.dname
from emp e right outer join dept d
on e.dno=d.deptno;
-- 全外连接
select e.ename, d.dname
from emp e left outer join dept d
on e.dno=d.deptno;
union
select e.ename, d.dname
from emp e right outer join dept d
on e.dno=d.deptno;

课时15 15.子查询

查询中有查询


-- 查询本公司工资最高的员工详细信息
select * from emp where sal=(select max(sal) from emp);

子查询出现的位置


from 后作为表存在(多行多列)
where 后作为条件存在

条件


-- 单行单列 
select * from 表1 别名1 where 列1[=, >, <, >=, <=, !=]
(select 列 from 表2 别名2 where 条件)
-- 多行单列
select * from 表1 别名1 where 列1[in, all, any]
(select 列 from 表2 别名2 where 条件)
-- 单行多列(一个对象)
select * from 表1 别名1 where (列1, 列2) in
(select 列1, 列2 from 表2 别名2 where 条件)
-- 多行多列
select * from 表1 别名1, 
(select ...) 别名2 where 条件

eg:


-- 工资高于平均工资的员工
select * from emp where sal > (select avg(sal) from emp);
-- 大于30部门所有人的工资的员工
select * from emp where sal > all(select sal from emp where deptno=30);
-- 和李白岗位部门都相同的员工
select * from emp where (job, deptno) in (select jobm, deptno from emp where ename ='李白');

课时16 16.多表查询练习第1题

查询至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数


-- 部门编号,部门名称,部门位置
select * from dept;
-- 部门人数
select deptno, count(*) from emp group by deptno
-- 整合
select d.* e1.cnt from dept d inner join 
(select deptno, count(*) cnt from emp group by deptno) as e1
on d.deptno=e1.deptno

课时17 17.多表查询练习第2题

列出所有员工的姓名及其直接上级的姓名


select e.ename, m.ename
from emp e left outer join emp m
on e.mgr=m.empno;

课时18 18.多表查询练习第4题

列出受雇日期早于直接上级的所有员工编号,姓名,部门名称


-- 1、先查询员工
select e.empno, e.ename, e.deptno
from emp e, emp m
where e.mgr=m.empno and e.hiredate<m.hiredate
-- 2、查询部门名称
select e.empno, e.ename, d.dname
from emp e, emp m, dept d
where e.mgr=m.empno 
and e.hiredate<m.hiredate 
and e.deptno=d.deptno

课时19 19.多表查询练习第5题

列出部门名称和这些部门的员工信息,同时列出哪些没有员工的部门


select *
from emp e right outer join dept d
on e.deptno=d.deptno;

课时20 20.多表查询练习第7题

列出最低薪金大于15000的各种工作及从事此工作的员工人数


select job, count(*)
from emp e
group by job
having min(sal) > 15000

课时21 21.多表查询练习第8题

列出在销售部工作的员工姓名,假定不知道销售部的部门编号


select ename
from emp e
where e.deptno = (select deptno from dept where dname='销售部')

课时22 22.多表查询练习第9题

列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级


-- 薪金高于公司平均薪金的所有员工信息
select * from emp where e.sal>(select avg(sal) from emp)
select e.*, d.dname, m.ename, s.grade 
from 
    emp e left outer join dept d on e.deptno=d.deptno
          left outer join emp m on e.mgr=m.empno
          left outer join salgrade s on e.sal between s.losal and s.hisal
where e.sal>(select avg(sal) from emp)

课时23 23.多表查询练习第10题

列出与庞统从事相同工作的所有员工及部门名称


select e.*, d.dname
from emp e left outer join dept d
on e.deptno=d.deptno
where e.job=(select job from emp where ename='庞统')

课时24 24.多表查询练习第11题

列出薪金高于部门30工作的所有员工的薪金的员工姓名和薪金,部门名称


select e.ename, e.sal, d.dname
from ename e left outer join deptno d
on e.deptno=d.deptno
where e.sal>(select max(sal) from emp where deptno=30)

课时25 24.多表查询练习第13题

查出年份,利润,年度增长比


select * from tb_year
year  zz
2000  100
2001  150
2002  250
2003  300
select y1.* ifnull(concat((y1.zz-y2.zz)/y2.zz * 100, '%'), '0%') 增长比
from tb_year y1 left outer join tb_year y2
on y1.year=y2.year+1

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
137 3
|
20天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
31 2
|
22天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
17 2
|
23天前
|
SQL 数据库 索引
SQL语句实现投影连接:方法与技巧详解
在SQL数据库查询中,投影和连接是两个核心概念
|
30天前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
72 5
|
1月前
|
SQL 数据库 决策智能
SQL语句实现投影连接详解
在SQL中,投影(Projection)和连接(Join)是数据查询和处理中非常重要的两个操作
|
1月前
|
SQL 存储 数据可视化
SQL 数据库大揭秘:连接数字世界的魔法桥梁
在数字化时代,数据如繁星般璀璨,而 SQL 数据库则像强大的引力场,有序汇聚、整理和分析这些数据。SQL 数据库是一个巨大的数字宝库,装满各行各业的“宝藏”。本文将带你探索 SQL 数据库在电商、金融、医疗和教育等领域的应用。例如,在电商中,它能精准推荐商品;在金融中,它是安全卫士,防范欺诈;在医疗中,它是健康管家,管理病历;在教育中,则是智慧导师,个性化教学。此外,还将介绍如何利用板栗看板等工具实现数据可视化,提升决策效率。
|
1月前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
52 3
|
1月前
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
31 3
|
23天前
|
SQL 数据库 索引
SQL语句实现投影连接:技巧与方法详解
在SQL数据库操作中,投影连接(Projection Join)是一种常见的数据查询技术,它结合了投影(Projection)和连接(Join)两种操作
下一篇
无影云桌面