SQL中的多表查询

1、笛卡尔积:举例

2、根据连接条件的不同:

*)等值连接

*)不等值连接

*)外连接

*)自连接

二、多表查询:等值连接

查询员工信息:部门名称   员工姓名

select d.dname,e.ename

from emp e,dept d

where e.deptno=d.deptno;

三、多表查询:自连接:就是通过表的别名,将同一张表视为多张表

查询员工信息:老板姓名  员工姓名

条件:员工的老板号 === 老板的员工号

select b.ename,e.ename

from emp e,emp b

where e.mgr=b.empno;

===========================================================

import java.io.IOException;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;


public class SelfJoinMapper extends Mapper<LongWritable, Text, LongWritable, Text> {


@Override
protected void map(LongWritable key1, Text value1, Context context)
throws IOException, InterruptedException {
// 数据:7698,BLAKE,MANAGER,7839,1981/5/1,2850,,30
String data = value1.toString();

//分词
String[] words = data.split(",");

//输出
//1、作为老板表
context.write(new LongWritable(Long.parseLong(words[0])), new Text("*"+words[1]));

//2、作为员工表
try{
context.write(new LongWritable(Long.parseLong(words[3])), new Text(words[1]));
}catch(Exception ex){
//如果产生例外,表示:大老板
context.write(new LongWritable(-1), new Text(words[1]));
}
}


}

-----------------------------------------------------------------------------------------------------------

import java.io.IOException;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;


public class SelfJoinReducer extends Reducer<LongWritable, Text, Text, Text> {


@Override
protected void reduce(LongWritable k3, Iterable<Text> v3, Context context)
throws IOException, InterruptedException {
// 定义变量:老板姓名  员工姓名
String bossName = "";
String empNameList = "";

for(Text v:v3){
String str = v.toString();

//判断是否存在*号
int index = str.indexOf("*");
if(index >=0){
//代表老板姓名
bossName = str.substring(1);
}else{
//代表员工姓名
empNameList = str + ";" + empNameList;
}
}

//输出
//判断:如果存在老板姓名和员工姓名,才输出
if(bossName.length() > 0 && empNameList.length() > 0)
context.write(new Text(bossName), new Text("("+empNameList+")"));
}
}


---------------------------------------------------------------------------------------

package demp.selfjoin;


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class SelfJoinMain {


public static void main(String[] args) throws Exception {
//创建一个job = mapper + reducer
Job job = Job.getInstance(new Configuration());
//指定job的入口
job.setJarByClass(SelfJoinMain.class);

//指定任务的mapper和输出数据类型
job.setMapperClass(SelfJoinMapper.class);
job.setMapOutputKeyClass(LongWritable.class); //指定k2的类型
job.setMapOutputValueClass(Text.class);//指定v2的数据类型


//指定任务的reducer和输出数据类型
job.setReducerClass(SelfJoinReducer.class);
job.setOutputKeyClass(Text.class);//指定k4的类型
job.setOutputValueClass(Text.class);//指定v4的类型

//指定输入的路径和输出的路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

//执行任务
job.waitForCompletion(true);


}


}

===============================================================


package demp.mutiltable;


import java.io.IOException;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;


public class MutilTableQueryMapper extends Mapper<LongWritable, Text, LongWritable,Text> {


@Override
protected void map(LongWritable key1, Text value1, Context context)
throws IOException, InterruptedException {
String data = value1.toString();

//分词
String[] words = data.split(",");

//判断数组的长度
if(words.length == 3){
//部门表:部门号  部门名称
context.write(new LongWritable(Long.parseLong(words[0])), new Text("*"+words[1]));
}else{
//员工表: 员工的部门号  员工姓名
context.write(new LongWritable(Long.parseLong(words[7])), new Text(words[1]));
}
}


}

-------------------------------------------------------------------------------------------------------

ackage demp.mutiltable;


import java.io.IOException;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;


public class MutilTableQueryReducer extends Reducer<LongWritable,Text, Text, Text> {


@Override
protected void reduce(LongWritable k3, Iterable<Text> v3, Context context)
throws IOException, InterruptedException {
//定义变量保存部门名称、员工姓名
String dname = "";
String empNameList = "";

for(Text t:v3){
String str = t.toString();

//找到*号的位置
int index = str.indexOf("*");
if(index >=0){
//代表部门名称
dname = str.substring(1);
}else{
//代表员工姓名
empNameList = str + ";"+empNameList;
}
}

//输出
context.write(new Text(dname), new Text(empNameList));
}
}

---------------------------------------------------------------------------------------------

package demp.mutiltable;


import java.io.IOException;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class MutilTableQueryMain {


public static void main(String[] args) throws Exception {
//创建一个job = mapper + reducer
Job job = Job.getInstance(new Configuration());
//指定job的入口
job.setJarByClass(MutilTableQueryMain.class);

//指定任务的mapper和输出数据类型
job.setMapperClass(MutilTableQueryMapper.class);
job.setMapOutputKeyClass(LongWritable.class); //指定k2的类型
job.setMapOutputValueClass(Text.class);//指定v2的数据类型


//指定任务的reducer和输出数据类型
job.setReducerClass(MutilTableQueryReducer.class);
job.setOutputKeyClass(Text.class);//指定k4的类型
job.setOutputValueClass(Text.class);//指定v4的类型

//指定输入的路径和输出的路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));

//执行任务
job.waitForCompletion(true);


}


}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server 2012是一种关系型数据库管理系统,支持多表查询多表查询是指在一个SQL语句同时查询多个表,以获取更丰富的数据信息。在SQL Server 2012,可以使用JOIN语句来实现多表查询。 以下是一些常用的多表查询方法: 1. 内连接(INNER JOIN):内连接返回两个表满足连接条件的行。语法如下: ``` SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列; ``` 相关问题: 1. 什么是内连接? 2. 如何使用内连接进行多表查询? 2. 左连接(LEFT JOIN):左连接返回左表的所有行,以及满足连接条件的右表的匹配行。如果右表没有匹配的行,则返回NULL值。语法如下: ``` SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列 = 表2.列; ``` 相关问题: 1. 什么是左连接? 2. 如何使用左连接进行多表查询? 3. 右连接(RIGHT JOIN):右连接返回右表的所有行,以及满足连接条件的左表的匹配行。如果左表没有匹配的行,则返回NULL值。语法如下: ``` SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列 = 表2.列; ``` 相关问题: 1. 什么是右连接? 2. 如何使用右连接进行多表查询? 4. 全连接(FULL JOIN):全连接返回左表和右表的所有行,如果某个表没有匹配的行,则返回NULL值。语法如下: ``` SELECT 列名 FROM 表1 FULL JOIN 表2 ON 表1.列 = 表2.列; ``` 相关问题: 1. 什么是全连接? 2. 如何使用全连接进行多表查询? 这些是SQL Server 2012常用的多表查询方法,通过合理使用这些方法,可以根据需要从多个表获取所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值