编写MySQL数据库查询的问题

时间:2011-04-17 08:12:49

标签: mysql sql

我的SQL数据库中有两个表:

mysql> select *from crop;
+------+-----------+----------+
| no   | name      | type     |
+------+-----------+----------+
| 1    | pineapple | fruits   |
| 2    | wheat     | mainFood |
| 1    | apple     | fruits   |
| 2    | corn      | main     |
| 3    | rose      | flower   |
| 2    | wheat     | main     |
| 2    | maize     | main     |
| 1    | drydates  | fruits   |
+------+-----------+----------+

mysql> select *from enviornment;
+---------+------------+----------+------+
| climate | irrigation | soil     | no   |
+---------+------------+----------+------+
| humid   | medium     | alluvial | 2    |
| humid   | medium     | black    | 1    |
| humid   | medium     | red      | 1    |
| sunny   | low        | black    | 1    |
| sunny   | medium     | alluvial | 1    |
| wet     | high       | red      | 2    |
| humid   | low        | red      | 3    |
+---------+------------+----------+------+

我希望根据气候,土壤和灌溉从name获取typecrop table字段。

我已按以下方式编写了查询:

mysql> select T.name from((select name from crop)as T and (select no from envior
nment where climate like wet)as U)where T.no=U.no;

但是当我尝试执行它时,我收到以下错误:

  

错误1064(42000):您的SQL语法有错误;查看与你的MySQL服务器版本相对应的手册,以便在'和'附近使用正确的语法(并选择no来自气候如湿的环境)作为U)其中T.no = U.no'在第1行

有人能告诉我如何重写我的查询以避免此错误吗?

5 个答案:

答案 0 :(得分:1)

select T.name 
from (select name from crop) as T 
inner join (select no from enviornment where climate like wet) as U
on T.no = U.no

答案 1 :(得分:1)

您无法使用 AND 构建查询结果,它是logical operator。您可以通过以下方式获取所有名称,类型,气候,土壤和灌溉组合:

select c.name, c.type, e.climate, e.soil, e.irrigation
from crop c, environment e
where c.no = e.no; 

答案 2 :(得分:0)

你可以不使用子选择来做同样的事情,这会更快:

SELECT `T`.`name` 
FROM `enviornment` AS `U` 
    , `crop` AS `T`
WHERE `U`.`climate` LIKE 'wet'
    AND `U`.`no` = `T`.`no`

答案 3 :(得分:0)

您应该在from子句中的表之间使用逗号,而不是and。你忘记了字符串'wet'周围的撇号。

从子选择中选择没有意义,你应该直接从表中选择:

select
  T.name, T.type
from
  crop as T,
  enviornment as U
where
  T.no = U.no and U.climate = 'wet'

现在通常使用join命令进行连接:

select
  T.name, T.type
from
  crop as T,
  inner join enviornment as U on T.no = U.no
where
  U.climate = 'wet'

注意:您的表名enviornment拼写错误,应为environment

答案 4 :(得分:0)

user711934,虽然很高兴有人展示如何重写查询我建议你做一些更多的教程或购买一本关于连接的SQL查询以及学习基础知识的书。 您不应该依赖子查询它们效率较低。

我建议你做这些教程 http://www.sql-tutorial.net/

具体通过这些连接示例 http://www.sql-tutorial.net/SQL-JOIN.asp

http://beginner-sql-tutorial.com/sql-query-tuning.htm

我希望有帮助