cgb2110-day05

news/2024/10/25 17:24:06/

文章目录

    • 一,使用三种多表联查的方式完成以下练习:
      • 练习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’
如果查到了数据,就可以登录
如果没查到,就登录失败


http://www.ppmy.cn/news/170897.html

相关文章

cgb2111-day02

文章目录 一,sqlyog工具的使用--1,新建连接--2,数据库--3,表--4,记录--5,练习,创建user表 二,字段约束--1,主键约束 三,基础函数--1,LOWER & UPPER--2,LENGTH & SUBSTR & CONCAT--3,REPLACE & IFNULL & ROUND-4,日期函数 & 转义符号 四,条件查询--1,DI…

rainbow的商店 贪心

描述 Rainbow开了一家商店,在一次进货中获得了N个商品。 已知每个商品的利润和过期时间。 Rainbow每天只能卖一个商品,并且过期商品不能再卖。 Rainbow也可以选择在每天出售哪个商品,并且一定可以卖出。 由于这些限制,Rainbow需要…

cgb2111-day06

文章目录 一,JDBC 练习--1,利用jdbc给user表中,添加一个用户的信息--2,模拟用户登录 二,SQL攻击--1,概述--2,改造用户登录--3,练习: 用新的传输器查询 三,优化: 提供jdbc的工具类--1,创建工具类--2,使用工具类(用新的传输器新增)--3,改造上面的练习(修改资源释放的代码) 四,作业…

cgb2111-day04

文章目录 一,多表联查--1,准备表和数据 二,笛卡尔积--1,概述--2,测试 三,连接查询--1,概述--2,测试 四,子查询--1,概述--2,测试 五,综合练习--1,测试 六,扩展:索引--1,概述--2,测试--3,总结 作业 一,多表联查 –1,准备表和数据 create table courses ( cno varchar(5) not nul…

cgb2110-day03

文章目录 一,练习--1,测试 二,统计案例--1,测试 三,聚合函数--1,测试 四,分组--1,测试--2,分组后的过滤 五,事务--1,概述--2,测试 六,字段约束--1,默认约束--2,检查约束--3,外键约束 一,练习 –1,测试 #练习22:模拟用户登录的过程. #就是拿着用户名和密码 去查库,查到了就登录…

cgb2110-day06

文章目录 一,模拟用户登录过程--1,需求--2,测试--3,程序优化 二,SQL攻击/注入--1,概述--2,解决方案--3,修改代码--4,两种传输器的区别 三,练习新的传输器--1,测试--2,标准的关闭资源--3,优化关闭资源封装工具类,提供close()改造代码 四,Maven--1,概述--2,Maven的四个特性仓库re…

cgb2111-day03

文章目录 一,条件查询--1,order by--2,limit--3,统计 二,聚合函数--1,概述--2,测试 三,分组--1,group by--2,having 四,事务--1,概述--2,事务管理的方式 五,字段约束--1,默认约束--2,检查约束--3,外键约束 一,条件查询 –1,order by #练习:条件查询CRUD #练习1:修改1号部门的…

cgb2110-day07

文章目录 一,HTML--1,概述--2,入门案例 二,HTML的常用标签--1,标题 & 列表 & 图片标签--2,a & input 标签--3,table 标签 三,form 表单标签--1,概述--2,测试--3,添加name,提交数据 一,HTML –1,概述 是超文本标记语言,专门用来完成网页的制作 是由大量的 标记/标…