您的位置:首页 > 数据库

那些日走过的数据之路.第三章.表的连接查询 , 连接数据库和JRE

2018-09-28 20:39 429 查看

多表查询

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();
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: