cgb2110-day05
文章目录
- 一,使用三种多表联查的方式完成以下练习:
- 练习1:查询research部门的所有员工姓名和工资
- 练习2:查询jack所在的部门信息
- 练习3:查询总监的部门信息
- 练习4:查询李军的平均分
- 练习5:查询陈冰能讲的课程名
- 二,扩展视图
- --1,概述
- --2,测试
- 三,扩展SQL优化
- --1,测试
- --2,简单了解表设计的三范式原则
- 四,JDBC
- --1,概述
- --2,开发步骤
- --3,创建工程
- --4,导入jar包,并编译
- --5,jdbc编程
- 五,练习JDBC
- --1,测试
- 六,优化
- --1,封装重复的代码
- 封装工具类
- 调用工具类
- --2,健壮性
- 七,作业:
- --1,把jdbc的代码每个敲三遍
- --2,模拟用户登录过程
一,使用三种多表联查的方式完成以下练习:
练习1:查询research部门的所有员工姓名和工资
#子查询#第二次:根据部门编号查员工信息
SELECT a.ename,a.sal FROM emp a WHERE a.deptno=(#第一次:根据部门名称查部门编号SELECT deptno FROM dept WHERE dname='research'
)
#笛卡尔积
SELECT a.ename,a.sal FROM emp a,dept b
WHERE a.deptno=b.deptno#表关系
AND b.dname='research'#research部门的
#连接查询
SELECT a.ename,a.sal FROM emp a JOIN dept b
ON a.deptno=b.deptno#表关系
WHERE b.dname='research'#research部门的
练习2:查询jack所在的部门信息
#子查询
SELECT * FROM dept WHERE deptno=(SELECT deptno FROM emp WHERE ename='jack'
)
#笛卡尔积
SELECT b.* FROM emp a,dept b
WHERE a.deptno=b.deptno#表关系
AND a.ename='jack'#查询jack的
#连接查询
SELECT b.* FROM emp a JOIN dept b
ON a.deptno=b.deptno#表关系
WHERE a.ename='jack'#查询jack的
练习3:查询总监的部门信息
#子查询
SELECT * FROM dept WHERE deptno=(SELECT deptno FROM emp WHERE job='总监'
)
#笛卡尔积
SELECT b.* FROM emp a,dept b
WHERE a.deptno=b.deptno
AND a.job='总监'
#连接查询
SELECT b.* FROM emp a JOIN dept b
ON a.deptno=b.deptno
WHERE a.job='总监'
练习4:查询李军的平均分
#子查询
SELECT AVG(degree) FROM scores WHERE sno=(SELECT sno FROM students WHERE sname='李军'
)
#笛卡尔积
SELECT AVG(b.degree) FROM students a,scores b
WHERE a.sno=b.sno
AND a.sname='李军'
#连接查询
SELECT AVG(b.degree) FROM students a JOIN scores b
ON a.sno=b.sno
WHERE a.sname='李军'
练习5:查询陈冰能讲的课程名
#子查询
SELECT cname FROM courses WHERE tno=(SELECT tno FROM teachers WHERE tname='陈冰'
)
#笛卡尔积
SELECT a.cname FROM courses a,teachers b
WHERE a.tno=b.tno
AND b.tname='陈冰'
#连接查询
SELECT a.cname FROM courses a JOIN teachers b
ON a.tno=b.tno
WHERE b.tname='陈冰'
二,扩展视图
–1,概述
缓存了上一次的查询结果,当做一张表来用
select * from 视图名
步骤:1,创建视图 2,使用视图
–2,测试
#视图:优点是避免了次次写复杂的SQL,屏蔽了业务表的复杂性,被所有用户共享#缺点:数据都是重复的,SQL无法被优化
#1.创建视图
#语法:create view 视图名 as SQL语句
#练习:查询名字里包含a的员工信息
CREATE VIEW enama_view AS SELECT * FROM emp WHERE ename LIKE '%a%'
#2.查视图,当做表来查
SELECT * FROM enama_view
三,扩展SQL优化
–1,测试
1, 用字段名称代替*
2, where里,能用=就别用!=,能用and就别用or,用=就比用in
3, 字段的类型,能用varchar就别用char. 字段的值能用数字就别用字符串
4, 索引,单表的索引最多5个.
5, 模糊查询,最好确定以啥开头,高效而且索引会生效
6, 字符串,SQL对于数字不严格,where name=123,应该把123加引号,因为name是把人varchar类型
…
#1.模糊查询的索引失效问题
#创建索引:
CREATE INDEX sname_index ON students(sname)
#查看索引:
SHOW INDEX FROM students
#使用索引:
EXPLAIN SELECT * FROM students WHERE sname LIKE '李%';#索引生效,高效
EXPLAIN SELECT * FROM students WHERE sname LIKE '%李%';#索引失效
EXPLAIN SELECT * FROM students WHERE sname LIKE '%李';#索引失效
#2.字符串的特殊现象
SHOW INDEX FROM dept
EXPLAIN SELECT * FROM dept WHERE dname=123#索引失效
EXPLAIN SELECT * FROM dept WHERE dname='123'#索引生效
#3.批量插入:
#向dept表插入两条数据
INSERT INTO dept VALUES(NULL,'ios','深圳')
#只给指定字段设置值
INSERT INTO dept(dname,loc) VALUES('ios2','深圳2')
INSERT INTO dept(dname) VALUES('ios3')
INSERT INTO dept(dname) VALUES('ios4')
#一次性插入多条数据,优化了事务管理,只需要开启和关闭一次事务
INSERT INTO dept(dname) VALUES('ios13'),('ios14')
–2,简单了解表设计的三范式原则
作用就是用来: 优化表的结构,减少数据的冗余
第一范式1NF: 保证字段的值是最小单位不可再被分割.
第二范式2NF: 必须先保证遵循了第一范式,要求每张表都要有主键/主属性/主字段,
非主属性的值必须围绕主属性展开.
第三范式3NF: 必须先保证遵循了第二范式, 减少字段间的依赖传递.
四,JDBC
–1,概述
专门用 java程序 操作 数据库的 一个技术,是java程序连接数据库的一套标准.
本质上就是一堆的API. 由于操作步骤复杂 , 将来会被框架封装.
–2,开发步骤
1, 创建工程
2, 导入jar包(一堆工具类的压缩包)
3, 在java中,连接数据库:用户名root 密码root 端口号3306
–3,创建工程
File - New - Project - 选择java - next - 输入工程名称 - Finish
–4,导入jar包,并编译
把jar包考到工程里. jar包版本很多,怎么决定用哪个版本的jar包???参考数据库的版本
–5,jdbc编程
package cn.tedu.jdbc;import java.sql.*;//测试 jdbc的入门案例: 通过java程序操作数据库的
public class Test1 {public static void main(String[] args) throws Exception {//1,注册驱动--参数是类的全路径Class.forName("com.mysql.jdbc.Driver");//5版本的jar包的位置//2,获取连接(用户名 密码 端口号)//String url = "协议://IP地址:端口号/数据库的名字";String url = "jdbc:mysql://localhost:3306/cgb211001";Connection c = DriverManager.getConnection(url, "root", "root");//3,获取传输器Statement s = c.createStatement();//4,执行SQL--查询user表的所有数据String sql="select * from user ";//执行查询的SQL语句,并返回结果封装给ResultSet结果集来保存ResultSet r = s.executeQuery(sql);System.out.println("恭喜您,查询成功!");//5,解析结果集while( r.next() ){//next()判断有数据吗,有数据就返回true,没数据返回false//一个一个的获取数据getXxx()可以获取到各种类型的数据int a = r.getInt(1);//获取整数System.out.println(a);String b = r.getString(2);//获取字符串System.out.println(b);String c1 = r.getString(3);//获取字符串System.out.println(c1);Object d = r.getObject(4);//获取啥都行System.out.println(d);}//6,关闭资源r.close();//关闭结果集s.close();//关闭传输器c.close();//关闭连接}
}
五,练习JDBC
–1,测试
package cn.tedu.jdbc;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;//测试
public class Test2 {//单元测试方法 @Test 查询dept表的所有数据@Testpublic void get() throws Exception {//1,注册驱动Class.forName("com.mysql.jdbc.Driver");//2,获取连接String url = "jdbc:mysql://localhost:3306/cgb211001";Connection c = DriverManager.getConnection(url, "root", "root");//3,获取传输器Statement s = c.createStatement();//4,执行SQLString sql ="select * from dept";ResultSet r = s.executeQuery(sql);System.out.println(100);//5,解析结果集while( r.next() ){//判断有数据就返回true,没数据就返回falseObject o = r.getObject("deptno");Object o2 = r.getObject("dname");Object o3 = r.getObject("loc");System.out.println(""+o+o2+o3);}//6,关闭资源r.close();s.close();c.close();}
}
六,优化
–1,封装重复的代码
封装工具类
package cn.tedu.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
//封装了一些常用方法
public class JDBCUtils {/*** 调用者即将得到一个数据库的连接对象Connection* @return 表示了和数据库的连接* @throws Exception*/static public Connection get() throws Exception{//1,注册驱动Class.forName("com.mysql.jdbc.Driver");//2,获取连接String url = "jdbc:mysql://localhost:3306/cgb211001";Connection c = DriverManager.getConnection(url, "root", "root");return c; //交给调用者}
}
调用工具类
package cn.tedu.jdbc;import org.junit.Test;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;//测试
public class Test2 {//单元测试方法 @Test 查询dept表的所有数据@Testpublic void get() throws Exception {//使用工具类封装好的get()来获取连接Connection c = JDBCUtils.get();//3,获取传输器Statement s = c.createStatement();//4,执行SQLString sql ="select * from dept";ResultSet r = s.executeQuery(sql);System.out.println(100);//5,解析结果集while( r.next() ){//判断有数据就返回true,没数据就返回falseObject o = r.getObject("deptno");Object o2 = r.getObject("dname");Object o3 = r.getObject("loc");System.out.println(""+o+o2+o3);}//6,关闭资源r.close();s.close();c.close();}
}
–2,健壮性
七,作业:
–1,把jdbc的代码每个敲三遍
–2,模拟用户登录过程
select * from user where name=‘jack’ and pwd=‘123’
如果查到了数据,就可以登录
如果没查到,就登录失败
cgb2110-day05相关推荐
- Python基础day05 作业解析【10道 函数作业题】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day04[函数(定义与调用.文档说明.传参函数.全局变量.返回值.嵌套调用)] ...
- Python基础day05【函数应用:学生管理系统、拆包、今日总结】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day05[函数(函数传参的两种形式.函数形参).拆包.引用.可变与不可变类型.引 ...
- Python基础day05【函数(局部变量、全局变量、多函数执行流程、函数返回值、函数参数)、拆包、引用、可变与不可变类型、函数注意事项】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day05[函数(函数传参的两种形式.函数形参).拆包.引用.可变与不可变类型.引 ...
- Python菜鸟入门:day05列表
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...
- day05【后台】菜单维护
day05[后台]菜单维护 1.数据库中存储树形结构 1.1.节点类型 1.2.创建菜单表 执行SQL语句创建数据库表 USE project_crowd CREATE TABLE t_menu (i ...
- 20200714:动态规划复习day05
动态规划复习day05 今天继续说股票问题三 题目: 买卖股票的最佳时机Ⅲ 解题思路 同理,我们还是按照老样子走. 先判断状态和选择 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票. 选择: ...
- day05数据类型(上)
day05数据类型(上) 常见的数据类型: int ,整数类型(整型) bool,布尔类型 str,字符串类型 list,列表类型 tuple,元组类型 dict,字典类型 set,集合类型 floa ...
- 小白之路由浅入深之------day05
方法 目录 方法概述 1.1 方法的概念(理解) 方法的定义和调用 2.1 无参数方法定义和调用(掌握) 2.2 方法调用过程图解(理解) 2.3 无参数方法的练习(应用) 带参数方法定义和调用 3. ...
- 微信小程序进阶学习笔记Day05
学习目标:微信小程序基础Day05 今日目标: 能够知道如何安装和配置 vant-weapp 组件库 能够知道如何使用 MobX 实现全局数据共享 能够知道如何对小程序的 API 进行Promise ...
- Java全栈学习day05(面向对象02)
1.继承 继承的概念 实现代码的重用,子类继承父类的一切属性和方法(除了构造方法),父类的私有属性.方法不能直接使用,需要get和set. package com.test;public class ...
最新文章
- 信号量Semaphore一篇文章叫你明白
- 【Flutter】屏幕像素适配方案 ( flutter_screenutil 插件 )
- 基本数据类型和字符串类型的转换
- 多媒体技术创新开启“科技+文化”新“视”界
- matplotlib的基本使用1
- Web 应用程序的自动化测试
- 图书管理系统 java 源码_[源码和文档分享]基于C语言和SQL SERVER数据库实现的图书管理系统...
- 视觉SLAM笔记(32) 2D-2D: 对极几何
- java抽象方法特点_java-抽象类的特点
- Eclipse完美安装Emmet插件
- 专用控制芯片的步进电机运动控制系统的设计理念概括
- 非负矩阵分解与K-means聚类
- jdk1.8的环境配置
- 如何解决克隆虚拟出现的Device eth0 does not seem to be present,delaying initialization错误
- 华为设备配置MSDP实现PIM-SM域间组播
- 一个出生偏远山区挨个饿90后的触景生情
- php 计算工资,php计算税后工资的方法_PHP
- 风控黑名单库的使用与判断指南
- VMware15安装
- Java语言基础(笔记)
热门文章
- C++ 解决rand()函数生成的随机数每次都一样的问题
- table 表格的一些属性
- 吴恩达《机器学习》——SVM支持向量机
- 数据库查询语句遇到:Unknown column ‘XXXX‘ in ‘where clause‘解决方法
- PID 整定方法与原理-说明了“I”的用法
- java在线编译(JAVA编译过程)
- 数据库,表数据的插入
- python极客项目编程pdf微盘下载_《Python极客项目编程 》——2.4 完整代码
- plsql实现1..100累加、奇数之和、偶数之和
- ROS MoveIT1(Noetic)安装总结