mysql 必知必会的多表联结问题?

amiwrong123:在书中 15.2.3 中,让查询订单编号为 20005 的订单中的物品信息。

由于查询列来自三个表,所以书中连接了三个表。

select prod_name, vend_name, prod_price, quantity 
from orderitems, products, vendors 
where products.vend_id = vendors.vend_id and orderitems.prod_id = products.prod_id and order_num = 20005;

我合计改一下,是不是能更高效,改完查到的东西也一样,但改完就没法查 quantity 列了(来自 orderitems )

SELECT 
prod_name, 
prod_price, 
(SELECT vend_name FROM vendors WHERE vendors.vend_id = products.vend_id) AS vend_id
FROM products WHERE prod_id IN 
    (SELECT prod_id FROM orderitems WHERE order_num = 20005)
  1. 我这样改,效率有变好吗?或者能更好吗?
  2. 怎么才能让我这种改法,能查到 quantity 列?

表信息:

CREATE TABLE orderitems
(
  order_num  int          NOT NULL ,#订单号
  order_item int          NOT NULL ,
  prod_id    char(10)     NOT NULL ,#产品 id
  quantity   int          NOT NULL ,#产品数量
  item_price decimal(8,2) NOT NULL ,
  PRIMARY KEY (order_num, order_item)
) ENGINE=InnoDB;

CREATE TABLE products
(
  prod_id    char(10)      NOT NULL,#产品 id
  vend_id    int           NOT NULL ,#供应商 id
  prod_name  char(255)     NOT NULL ,#产品姓名
  prod_price decimal(8,2)  NOT NULL ,#产品价格
  prod_desc  text          NULL ,
  PRIMARY KEY(prod_id)
) ENGINE=InnoDB;

CREATE TABLE vendors
(
  vend_id      int      NOT NULL AUTO_INCREMENT,#供应商 id
  vend_name    char(50) NOT NULL ,#供应商姓名
  vend_address char(50) NULL ,
  vend_city    char(50) NULL ,
  vend_state   char(5)  NULL ,
  vend_zip     char(10) NULL ,
  vend_country char(50) NULL ,
  PRIMARY KEY (vend_id)
) ENGINE=InnoDB;

我把有用的信息都标注出来了。

mysql 查询

shimingzhoudf:A 表有 1,2,3,4 个字段 我现在查询结果需要是这样 表名 中文名 1 2 3 4 数据 x x x x x ... ... .. .. .. .. 其实中文名就是 4 字段的值 我看别人这样写过: select 4 中文名, * where 表名; 但我自己用老报语法错误shimingzhoudf:语法是这样 select…

与Spring和Hibernate长期交易? - java

我要解决的根本问题是运行一个任务,该任务在MySQL中生成多个临时表,这些临时表需要保留足够长的时间,以便在创建Java之后从Java中获取结果。由于涉及的数据量很大,因此必须分批完成任务。每个批处理都是对通过JDBC调用的存储过程的调用。对于大型数据集,整个过程可能需要半小时或更长时间。为了确保对临时表的访问,我在一个带有TransactionCallba…

比较MySQL中的字符串是否容易受到定时攻击? - php

我正在为用户密码部署经典的哈希保护。登录时提交的密码先进行加盐,散列,然后与数据库中已存储的散列进行比较。但不是使用PHP函数调用来比较现在散列的用户输入和存储的散列,而是在数据库中进行比较-更精确地,使用WHERE子句(注意:由于各种原因,盐已经被人们所知此比较开始,但密码不是)。由于用户名是唯一的,因此以下查询有效地告诉用户名和密码对是否匹配:SELEC…

python从mysql获取用户并在linux上创建用户 - python

我正在尝试在mysql中添加用户,然后在我的Linux系统上使用python脚本创建用户。with dbcon: cur = dbcon.cursor() cur.execute("SELECT * FROM user") result = cur.fetchall() c = csv.writer(open("users.cs…

石英和mysql的自动模式创建失败,并带有MySQLSyntaxException - java

我有一个运行mysql数据库的Spring Boot 2应用程序,想要添加Quartz Scheduler。组态:spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.datasource.url=jdbc:mysql://localhost:…