發現了一種錶鏈接新的寫法,之前尚未這樣寫過或者見別人寫過。跟同窗聊天他們公司卻不少人這樣寫,看來真的要學學sql了sql
表函數
CREATE TABLE `t_book` ( `FId` int(11) NOT NULL, `FName` varchar(50) DEFAULT NULL, `FYearPublished` int(11) DEFAULT NULL, `FCategoryId` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_book -- ---------------------------- INSERT INTO `t_book` VALUES ('1', 'About J2EE', '2005', '4'); INSERT INTO `t_book` VALUES ('2', 'Learning Hibernate', '2003', '4'); INSERT INTO `t_book` VALUES ('3', 'Two Cites', '1999', '1'); INSERT INTO `t_book` VALUES ('4', 'Jane Eyre', '2001', '1'); INSERT INTO `t_book` VALUES ('5', 'Oliver Twist', '2002', '1'); INSERT INTO `t_book` VALUES ('6', 'History of China', '1982', '2'); INSERT INTO `t_book` VALUES ('7', 'History of England', '1860', '2'); INSERT INTO `t_book` VALUES ('8', 'History of America', '1700', '2'); INSERT INTO `t_book` VALUES ('9', 'History of The World', '2008', '2'); INSERT INTO `t_book` VALUES ('10', 'Atom', '1930', '3'); INSERT INTO `t_book` VALUES ('11', 'RELATIVITY', '1945', '3'); INSERT INTO `t_book` VALUES ('12', 'Computer', '1970', '3'); INSERT INTO `t_book` VALUES ('13', 'Astronomy', '1971', '3'); INSERT INTO `t_book` VALUES ('14', 'How To Singing', '1771', '5'); INSERT INTO `t_book` VALUES ('15', 'DaoDeJing', '2001', '6'); INSERT INTO `t_book` VALUES ('16', 'Obedience to Authority', '1995', '6'); CREATE TABLE `t_category` ( `FId` int(11) NOT NULL, `FName` varchar(50) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of t_category -- ---------------------------- INSERT INTO `t_category` VALUES ('1', 'Story'); INSERT INTO `t_category` VALUES ('2', 'History'); INSERT INTO `t_category` VALUES ('3', 'Theory'); INSERT INTO `t_category` VALUES ('4', 'Technology'); INSERT INTO `t_category` VALUES ('5', 'Art'); INSERT INTO `t_category` VALUES ('6', 'Philosophy');
書表spa
目錄表3d
任務:查詢出每種類目的 類目名稱、類目id,最晚的出版年份code
通常的想法是,將book表經過類目id進行分組,求出max(出版年份),再和類目表進行join便可:blog
select c.*,A.maxPub from t_category c left join ( select b.FCategoryId cid ,max(b.fyearpublished) maxPub from t_book b group by b.FCategoryId)A on c.fid=A.cid
可是看見新的寫法是這樣的:ci
select c.fid,c.FName,(select max(b.FYearPublished) from t_book b where b.FCategoryId=c.FId) maxPub from t_category c
查詢出來結果是同樣的it
這個SELECT語句首先檢索FId、FName兩個字段,而第三個字段不是一個列二是一個子查詢。這個子查詢位於主查詢的內部,它返回一類圖書的最新出版年份。由於聚合函數僅返回一行記錄,因此這知足標量子查詢的條件。經過WHERE語句,這個子查詢也被鏈接到外部的SELECT查詢語句中,由於這個鏈接,MAX(FYearPublished)將返回每類圖書的最新出版年份。class
記錄一下select