那些日走过的数据之路.第三章.表的连接查询 , 连接数据库和JRE
多表查询
1.合并查询( 把两张表的记录合并到一起显示 ) 关键词: union 注意: 两张表的字段名和数据类型要相同 如果在关键词后面添加all,就显示两张表全部记录
select * from 表1 union select * from 表2 // 举例 insert into A values('a',10),('b',20),('c',30); insert into B values('a',10),('b',20),('d',40); SELECT * FROM A UNION SELECT * FROM B;
合并查询结果
2.两张表一起查询 SELECT * FROM A,B; 出现大量重复数据 出现笛卡尔积(就是表A中每一个值和表B中每一个值 组合成 一条数据) A(a,b,c) B(1,2,3) (a,1)(a,2)(a,3) (b,1)(b,2)(b,3) (c,1)(c,2)(c,3)
学生表
分数表
课程表
// 2.1 去除重复数据(99查询法: 通过两张表关联的字段相等 来去除重复)
两张表一起查询( 去除重复数据 )
SELECT * FROM student,score
WHERE student.stuid=score.stuid;
两张表查询部分字段
查询学生编号和学生的分数(利用学生表和分数表)
SELECT student.stuname,score.score FROM student,score
WHERE student.stuid=score.stuid;
2.2 起别名 查询时,不一定要有外键
SELECT s.stuname,sc.score FROM student s,score sc
WHERE s.stuid=sc.stuid;
2.3 带条件的多表查询
查询表中80分以上学生的 姓名 分数 科目信息
SELECT s.stuname,sc.score,c.cname FROM student s,score sc,course c
WHERE s.stuid=sc.stuid
AND
sc.courseid=c.courseid
AND
sc.score>80;
连接查询
内连接
形式: 表1名 (inner) join 表2名 on 去除重复条件
帮助理解: join相当于多表查询中 ‘,’ on 相当于 where,但是on后面只能跟去重条件
// 第一种 SELECT * FROM student s JOIN score sc ON s.stuid=sc.stuid JOIN course c ON sc.courseid=c.courseid; // 第二种 SELECT * FROM student s JOIN score sc JOIN course c ON s.stuid=sc.stuid AND sc.courseid=c.courseid; // 带条件的内连接查询 SELECT * FROM student s JOIN score sc ON s.stuid=sc.stuid JOIN course c ON sc.courseid=c.courseid WHERE sc.score>80;
外连接: 左外连接 , 右外连接
左外连接: 以左边那张表为主,输出字段的全部数据
形式: 表1名 left (outer) join 表2名 on 去除重复条件
右外连接: 以右边那张表为主,输出字段的全部数据
形式: 表1名 left (outer) join 表2名 on 去除重复条件
// 举例 SELECT * FROM student s LEFT JOIN score sc ON s.stuid=sc.stuid;
自然连接(不是自连接)
形式: 表1名 natural join 表2名
特点:系统自动执行去重条件
SELECT * FROM student NATURAL JOIN score;
子连接(嵌套查询)
方法:
第一步. 先找出判断条件 所依赖的表信息
第二步. 将上面找出的表信息 带入判断条件
// 例一.查询工资高于JONES的员工信息 // 第一步.先查JONES的工资 select sal from emp WHERE ename='JONES'; // 第二步.用第一步当条件,查询工资高于他的员工信息 SELECT * FROM emp WHERE sal > ( SELECT sal FROM emp WHERE ename = 'JONES' );
// 例二.查询与SCOTT同一个部门的员工。 // 第一步.查询scott所在部门 SELECT deptno FROM emp WHERE ename='SCOTT'; // 第二步 SELECT * FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='SCOTT');
// 例三.查询工作和工资与MARTIN(马丁)完全相同的员工信息 SELECT job FROM emp WHERE ename='MARTIN'; SELECT sal FROM emp WHERE ename='MARTIN'; SELECT * FROM emp WHERE job=(SELECT job FROM emp WHERE ename='MARTIN') AND sal=(SELECT sal FROM emp WHERE ename='MARTIN');
// 例四.查询有2个以上直接下属的员工信息 // 按照领导分类,并统计该分组的领导出现次数超过2 SELECT mgr FROM emp GROUP BY mgr HAVING count(mgr)>=2; // 第二步 SELECT * FROM emp WHERE empno IN (SELECT mgr FROM emp GROUP BY mgr HAVING count(mgr)>=2);
自连接
使用情况: 在查询到某个数据的基础上,再查询本表另一个数据
将自己当成一张新表
通过查询条件
查询多条信息
// 求7369员工编号、姓名、经理编号和经理姓名 SELECT e1.empno,e1.ename,e1.mgr,e2.ename FROM emp e1,emp e2 WHERE e1.empno=7369 AND e1.mgr=e2.empno;
数据库的连接(在JRE上)
步骤: 1.加载驱动(或者说:注册驱动类) 通过反射的形式 Class.forName("com.mysql.jdbc.Driver"); 2.获取数据库连接对象 String url = "jdbc:数据库软件名://localhost:数据库端口号/数据库名"; String user = "root"; String password = "连接密码"; Connection connection = DriverManager.getConnection(url, user, password); 3.获取SQL执行对象(通过数据库连接对象) Statement statement = connection.createStatement(); 4.使用sql执行对象,执行SQL语句 String sql = "select sname,sid from sort"; // statement.executeUpdate(sql); 执行DDL DML语句 // statement.executeQuery(sql); 执行DQL语句 5.处理结果集 接受执行sql时 , 返回的值 // statement.executeUpdate(sql); 返回int值(改变数据行数) // statement.executeQuery(sql); // 使用*查找列的索引 是数据库表字段的顺序 // 默认 列索引下标从1开始 // 如果没有使用*,而是手写字段 // 那么列索引顺序就是你手写顺序 // 一.通过列索引 获取值 // int sid = resultSet.getInt(2); // String sname = resultSet.getString(1); // 二.通过字段名 获取值 // int sid = resultSet.getInt("sid"); // String sname = resultSet.getString("sname"); 6.关闭资源 connection.close(); // 关闭数据库连接对象 statement.close(); // 关闭SQL执行对象 resultSet.close(); // 如果有结果集,要关闭
第二种连接方式(常用): 目的是: 解决 输入执行SQL语句时 发生的输入错误 第三步时:用占位符替代输入字符, 连接对象.prepareStatement(sql) 并对占位符赋值, 参数1是?的索引 从1开始 , statement.setObject(1, myName); 第四步时: 直接执行,不用在输入sql语句了 // 1.加载驱动类 Class.forName("com.mysql.jdbc.Driver"); // 2.建立连接 String url = "jdbc:mysql://localhost:3306/myjdbc01"; String user = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, user, password); // 3.获得sql执行对象 // prepareStatement 对sql语句进行预编译 // sql语句需要使用占位符 ? 来替换传入的值 String sql = "select * from users where username=? and password=?"; PreparedStatement statement = connection.prepareStatement(sql); // 给占位符赋值 // 参数1是?的索引 从1开始 statement.setObject(1, myName); statement.setObject(2, myPassword); // 4.执行sql查询 ResultSet resultSet = statement.executeQuery(); // 5.处理结果集 while (resultSet.next()) { System.out.println(resultSet.getInt("id")); System.out.println(resultSet.getString("username")); System.out.println(resultSet.getString("password")); } // 6.关闭资源 connection.close(); statement.close(); resultSet.close();阅读更多
- orcle 远程连接其他数据库 进行查询数据
- php连接数据库查询数据(方式二)
- 简单数据库操作,连接数据库,查询数据
- Android连接服务器数据库查询+Gson解析(List和Map)格式json数据(一)
- ADO连接数据库的那些常用数据类型
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
- 数据查询基础和C#连接数据库语句
- SQL语句远程连接其他数据库查询表数据
- java JDBC 连接数据库查询数据与直接使用sql的疑问
- java使用JDBC连接数据库,提高查询大量数据速度
- Android连接服务器数据库查询+Gson解析(List和Map)格式json数据(二)
- ADO连接数据库的那些常用数据类型
- 数据库连接测试及数据的查询
- Excel在统计分析中的应用—第三章—数据库统计函数与数据透视表-Part1-(数据查询与筛选、分类汇总)
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- JDBC 数据库连接 创建表格、插入、查询、删除、修改数据 基本操作
- 多线程连接数据库查询数据
- java JDBC 连接数据库查询数据与直接使用sql的疑问
- 面面观 | 使用python 连接数据库,插入并查询数据--link
- JDBC连接数据库方法的封装,以及查询数据方法的封装(精华)