关于联合查询

关于联合查询


1:

老师.这种是联合查询吗?

http://img1.sycdn.imooc.com//climg/5cee5a5d0001388810280138.jpg

可以这样去查询的吗?之前课程有教吗?

我记得之前教的联合查询是:

UNION和UNION ALL的呀

例如:

SELECT * FROM tb1 UNION SELECT * FROM tb2

SELECT * FROM tb1 UNION ALL SELECT * FROM tb2


2:

另外,在看课程之后,我也自己尝试自己写代码,我是这样写的

package com.mason.dao.impl;

import com.mason.dao.ProductDao;
import com.mason.domain.Category;
import com.mason.domain.Product;
import com.mason.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class ProductDaoImpl implements ProductDao {
    @Override
    public List<Product> findAll() {
        System.out.println("ProductDao的findAll方法");
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        List<Product> list = null;
        try {
            //获得连接
            conn = JDBCUtils.getConnection();
            //编写SQL
            String sql = "SELECT product.*,category.* FROM product JOIN category ON product.cid=category.cid";
            //预编译SQL
            pstmt = conn.prepareStatement(sql);
            //执行SQL
            rs = pstmt.executeQuery();
            //遍历结果集
            list = new ArrayList();
            while (rs.next()) {
                Product product = new Product();
                product.setPid(rs.getInt("pid"));
                product.setPname(rs.getString("pname"));
                product.setAuthor(rs.getString("author"));
                product.setPrice(rs.getDouble("price"));
                product.setDescription(rs.getString("filename"));
                product.setPath(rs.getString("path"));
                Category category = new Category();
                category.setCid(rs.getInt("cid"));
                category.setCname(rs.getString("cname"));
                category.setCdesc(rs.getString("cdesc"));
                product.setCategory(category);
                list.add(product);
            }
            for (Product p :
                    list) {
                System.out.println("商品ID:"+p.getPid()+"   商品名:"+p.getPname()+"  商品分类名称:"+p.getCategory().getCname());
            }
            return list;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //释放资源
            JDBCUtils.release(rs, pstmt, conn);
        }
        return null;
    }
}

我的查询语句是用了内连接

String sql = "SELECT product.*,category.* FROM product JOIN category ON product.cid=category.cid";

然后遍历结果集以及封装数据是这样

while (rs.next()) {
    Product product = new Product();
    product.setPid(rs.getInt("pid"));
    product.setPname(rs.getString("pname"));
    product.setAuthor(rs.getString("author"));
    product.setPrice(rs.getDouble("price"));
    product.setDescription(rs.getString("filename"));
    product.setPath(rs.getString("path"));
    Category category = new Category();
    category.setCid(rs.getInt("cid"));
    category.setCname(rs.getString("cname"));
    category.setCdesc(rs.getString("cdesc"));
    product.setCategory(category);
    list.add(product);
}

数据库中数据是这样

http://img1.sycdn.imooc.com//climg/5cee5b680001f97809200810.jpg

执行之后是这样的

http://img1.sycdn.imooc.com//climg/5cee5b970001545307840981.jpg

http://img1.sycdn.imooc.com//climg/5cee5ba800011e3c06790499.jpg

老师你觉得我这样做好吗?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,

1、同学里就的联合查询是正确的。

下图方式为“笛卡尔积”,与联合查询不一样,在之前的课程中有讲到哦~

http://img1.sycdn.imooc.com//climg/5cee637e0001de5907540077.jpg

2、同学的代码写的很对,是没有问题的哦~

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • MasonM 提问者 #1
    噢,老师,我说的 UNION和UNION ALL 是不是用在两个同样结构的表上的用来联合查询的? 必须要两个同样结构的表吗?
    2019-05-29 19:03:00
吃吃吃鱼的猫 2019-05-29 19:17:29

同学你好

UNION,UNION ALL操作符用于合并两个或多个 SELECT 语句的结果集。

内部的 SELECT 语句后必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

如下图test表,user表所示:

http://img1.sycdn.imooc.com//climg/5cee69540001599003170183.jpghttp://img1.sycdn.imooc.com//climg/5cee696e000140b005690244.jpg

使用UNION语句,uid列名相同,类型相同,如果选择多个字段查询,select后的字段顺序也要相同。如下所示:

SELECT uid FROM user UNION SELECT uid FROM test

当两个表结构完全相同时,才可以使用select *

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师