前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL从入门到入魔(03)

MySQL从入门到入魔(03)

作者头像
海拥
发布2021-08-23 15:08:18
4320
发布2021-08-23 15:08:18
举报
文章被收录于专栏:全栈技术全栈技术

子查询(嵌套查询)

  1. 查询工资高于1号部门平均工资的员工信息
代码语言:javascript
复制
	select avg(sal) from emp where deptno=1;
	select * from emp where sal>2325;
  • 把上面两条合并成一条
代码语言:javascript
复制
	select * from emp where sal>(select avg(sal) from emp where deptno=1);
  1. 查询拿最高工资的员工信息
代码语言:javascript
复制
	select * from emp where sal=(select max(sal) from emp);
  1. 查询工资高于2号部门最低工资的员工信息
代码语言:javascript
复制
	select * from emp where sal>(select min(sal) from emp where deptno=2);
  1. 查询和孙悟空相同工作的其他员工信息
代码语言:javascript
复制
	select * from emp where job=(select job from emp where ename='孙悟空') 
	and ename!='孙悟空';
  1. 查询拿最低工资员工的同事们的信息(同事指同一部门的员工)
代码语言:javascript
复制
	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);
  1. 查询白骨精的部门信息(需要用到dept部门表)
代码语言:javascript
复制
	select deptno from emp where ename='白骨精';
	select * from dept where deptno=(select deptno from emp where ename='白骨精');
  1. 查询所有员工的部门信息(部门只有1,2,3但是部门表里面有1,2,3,4 只根据员工表中出现的部门编号去查询部门信息)
    • 先查询员工表中出现的部门编号
代码语言:javascript
复制
	select distinct deptno from emp;
代码语言:javascript
复制
- 通过查询到的部门编号查询部门信息
代码语言:javascript
复制
	select * from dept where deptno in(select distinct deptno from emp);

关联关系

  • 创建表时,表与表之间存在的业务关系称为关联关系
  • 外键: 用于建立关系的字段称为外键
  • 有哪些关系:
  1. 一对一:有AB两张表,A表中1条数据对应B表中的1条数据,同时B表中1条数据也对应A表中的一条数据.称为一对一关系
  • 应用场景: 将原属于一张表的数据拆分成两张表进行数据保存时,使用1对1的关系.
  • 如何建立一对一的关系? (将一张表拆成两张表(主表和从表)) 在从表中添加外键指向主表的主键
  1. 一对多:有AB两张表,A表中1条数据对应B表中的多条数据,同时B表中1条数据对应A表中的一条数据.称为一对多关系
  • 应用场景: 比如员工表和部门表的关系
  • 如何建立关系? 一对多关系中存在两张表,一个表是1(部门表),一个表是多(员工表),在多的表中添加外键指向另外一张表的主键
  1. 多对多:有AB两张表,A表中1条数据对应B表中的多条数据,同时B表中1条数据也对应A表中的多条数据.称为多对多关系
  • 应用场景: 比如老师表和学生表
  • 如何建立关系? 需要通过一个中间关系表建立关系,在关系表中添加两个外键分别指向两个主表的主键

关联查询

  • 关联查询是查询存在关联关系多张表的查询方式
  • 三种关联查询的方式: 1. 等值连接 2.内连接 3.外连接
  • 关联查询必须写关联关系,如果不写会得到两个表结果的乘积,这个乘积称为笛卡尔积,笛卡尔积是一个错误的查询结果,由于工作中数据量巨大笛卡尔积有可能会导致内存溢出.
  1. 等值连接
  • 格式: select 字段信息 from A,B where 关联关系 and 其它条件
  • 举例:
  1. 查询工资高于2000的员工的姓名,工资和对应的部门名
代码语言:javascript
复制
	select e.ename,e.sal,d.dname
	from emp e,dept d
	where e.deptno=d.deptno 
	and e.sal>2000;
代码语言:javascript
复制
2. 查询不是程序员的员工姓名,工作和部门所在地
代码语言:javascript
复制
	select e.ename,e.job,d.loc
	from emp e,dept d
	where e.deptno=d.deptno
	and e.job!='程序员';
  1. 内连接
  • 格式: select 字段信息 from A join B on 关联关系 where 其它条件
  • 举例:
  1. 查询工资高于2000的员工的姓名,工资和对应的部门名
代码语言:javascript
复制
	select e.ename,e.sal,d.dname
	from emp e join dept d
	on e.deptno=d.deptno
	where e.sal>2000;
代码语言:javascript
复制
2. 查询不是程序员的员工姓名,工作和部门所在地
代码语言:javascript
复制
	select e.ename,e.job,d.loc
	from emp e join dept d
	on e.deptno=d.deptno
	where e.job!='程序员';
  • 等值连接和内连接查询到的都是两张表的交集数据,但是内连接代码结构更直观推荐使用
  1. 外连接
  • 外连接查询的是一张表的全部和另外一张表的交集数据
  • 格式: select 字段信息 from A left/right join B on 关联关系 where 其它条件
  • 举例:
  1. 查询所有部门名和对应的员工姓名
代码语言:javascript
复制
	select d.dname,e.ename
	from emp e join dept d
	on e.deptno=d.deptno;
  1. 查询所有员工的姓名和部门所在地
  • 由于员工表里面全部是交集数据所以先插入一条数据
代码语言:javascript
复制
	insert into emp(empno,ename) values(20,'灭霸');
	select e.ename,d.dname
	from emp e left join dept d
	on e.deptno=d.deptno;

JDBC

  • JavaDataBaseConnectivity Java数据库连接,JDBC是sun公司提供的一套通过Java语言和数据库进行连接的相关API(Application Program Interface)
  • 为什么使用JDBC: 在工作中Java语言有可能连接多种不同的数据库,为了避免Java程序员每一种数据库都学习套新的方法,Sun公司定了一套方法的声明(JDBC),各个数据库厂商根据此接口写实现类(驱动),这样Java程序员只需要学习JDBC中方法的调用即可访问任何数据库,如果严格按照JDBC标准所写的代码就算将来换数据库,代码不需要改变.

###如何使用JDBC

  1. 创建maven工程
  2. 在pom.xml中添加以下mysql的相关坐标
代码语言:javascript
复制
<!-- 连接MySQL数据库的依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.15</version>
		</dependency>
  1. 创建Demo01.java添加以下代码
代码语言:javascript
复制
//1. 注册驱动 通知编译器使用的是什么数据库 抛出异常
		//Class.forName("com.mysql.cj.jdbc.Driver");
		//2. 获取数据库连接 参数介绍:1.url连接地址 2.用户名  3.密码(自己mysql密码)
		Connection conn = DriverManager.getConnection(
				"jdbc:mysql://localhost:3306/newdb3?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true", "root", "root");
		System.out.println(conn);
		//3. 创建SQL语句执行对象
		Statement s = conn.createStatement();
		//4. 执行SQL语句 
		String sql = "create table jdbct2(name varchar(10),age int)";
		s.execute(sql);//执行SQL
		System.out.println("执行成功!");
		//5. 关闭资源
		conn.close();

Statement执行SQL语句的对象

  • execute(sql) 用于执行数据库相关和表相关的操作
  • executeUpdate(sql) 用于执行增删改
  • executeQuery(sql) 用于执行查询
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 子查询(嵌套查询)
  • 关联关系
  • 关联查询
  • JDBC
  • Statement执行SQL语句的对象
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档