问题:查询借阅了机械工业出版社出版的书名中含有数‘据库书’三个字的图书但没有借阅了科学出版社出版的书名中含有数‘据库书’三个字的图书的读者姓名、书名。 
(个人理解:说明查询到的读者一定借阅了机械工业出版社的含有数据库三字的图书,但是该读者可能借阅了科学出版社出版的书名中不含数据库三字的图书,也可能没有借阅一本科学出版社出版的图书。但是该读者如果借阅了科学出版社出版的书名中含有数据库三个字的图书的话,则不符合要求)   以下是我sqlplus中写代码:
(有三个表:book,reader,borrow。borrow表是book表与reader表的父表)
(我的理解是先写出想要查询的列:读者姓名和图书书名,然后将这三个表做连接。再根据条件选出借阅了机械工业出版社出版的书名中含有数据库三个字的图书,然后将他们按借阅者的姓名分组,再从分组中选择满足条件的人。但是为啥不对?还有就是group by后面一定要跟select语句后面所跟的列名么??????)

解决方案 »

  1.   

    group by后面一定要跟select语句后面所跟的列名么??????select 后面的 非聚合列,必须都放在 group by 后面。
      

  2.   


    Oracle是这样,Mysql就不用。
      

  3.   

    放在后面的having子句中不可以么?那如果必须放在group by子句后面的话就与题意不符了
    还有就是分组后再having是对该组进行操作么?比如说有一个人借阅了两本书,一本是机械工业出版社出版的含有数据库三个字的书,另一本是科学出版社出版的也含有数据库三个字的书(那么这个人在查询结果中应该有两行数据,但是现在按读者名分组,是不是就代表这两行是一组数据,如果这个人满足题意则被筛选出来,如果不满足题意这两行都不会被筛选出来???)我迷惑在这儿
      

  4.   

    having 后面,要写聚合函的逻辑运算。
      

  5.   


    Oracle是这样,Mysql就不用。嗯,mysql 支持这样的语法,如果用 mysql 时间长了,突然换成 oracle 或 mssql ,都会有这样的疑问:“我的语句好好的,怎么就报错了呢。” 
      

  6.   

    建议把having后面的条件放在where子句中,因为having子句是对分组条件的筛选,而group by前面的where才是对查询结果的筛选。简单点来说,就是having后面的条件只能限制reader.姓名、book.书名,不能对其他字段进行限制。所以楼主的语句发生了错误。
      

  7.   

    试试这样呢SELECT T.姓名, T.书名
      FROM (SELECT READER.姓名, BOOK.书名, BOOK.出版社
              FROM BOOK, READER, BORROW
             WHERE READER.读者号 = BORROW.读者号
               AND BOOK.图书号 = BORROW.图书号
               AND BOOK.书名 LIKE '%数据库%'
               AND BOOK.出版社 <> '科学出版社') T
     WHERE T.出版社 = '机械工业出版社'
     GROUP BY T.姓名, T.书名
      

  8.   


    上面那个好像不对,可以这样CREATE VIEW v_jyts AS (SELECT READER.姓名, BOOK.书名, BOOK.出版社
              FROM BOOK, READER, BORROW
             WHERE READER.读者号 = BORROW.读者号
               AND BOOK.图书号 = BORROW.图书号
               AND BOOK.书名 LIKE '%数据库%');
    SELECT 姓名,书名  FROM v_jyts WHERE 姓名 IN(SELECT 姓名  FROM v_jyts WHERE 出版社 = '机械工业出版社')
    AND 姓名 NOT IN (SELECT 姓名  FROM v_jyts WHERE 出版社 = '科学出版社')
    GROUP BY 姓名,书名