MySQL數據庫05(高級查詢練習)

高級查詢練習

(添加一些練習數據)

我的租房網

客戶信息表

 
CREATE TABLE `sys_user` (
  `UID` INT(4) NOT NULL AUTO_INCREMENT,
  `uName` VARCHAR(10) NOT NULL,
  `uPassWord` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`UID`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT  INTO `sys_user`(`UID`,`uName`,`uPassWord`) VALUES (1,'張三','11111');

執行命令得


區縣信息表

 
DROP TABLE IF EXISTS `hos_district`;

CREATE TABLE `hos_district` (
  `DID` INT(4) NOT NULL AUTO_INCREMENT,
  `dName` VARCHAR(4) NOT NULL,
  PRIMARY KEY (`DID`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT  INTO `hos_district`(`DID`,`dName`) VALUES (1,'海淀'),(2,'朝陽'),(3,'豐臺');

執行命令得


街道信息表

 
DROP TABLE IF EXISTS `hos_street`;

CREATE TABLE `hos_street` (
  `SID` INT(4) NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(50) NOT NULL,
  `sDID` INT(4) NOT NULL,
  PRIMARY KEY (`SID`),
  KEY `fk_street_district` (`sDID`),
  CONSTRAINT `fk_street_district` FOREIGN KEY (`sDID`) REFERENCES `hos_district` (`DID`)
) ENGINE=INNODB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

/*Data for the table `hos_street` */

INSERT  INTO `hos_street`(`SID`,`sName`,`sDID`) VALUES (1,'萬泉莊',1),(2,'蘇州街',1),(3,'中關村',1),(4,'東四',2),(5,'三里屯',2),(6,'望京',2);

執行命令得

房屋類型表

 
DROP TABLE IF EXISTS `hos_type`;

CREATE TABLE `hos_type` (
  `hTID` INT(4) NOT NULL AUTO_INCREMENT,
  `hTName` VARCHAR(10) NOT NULL,
  PRIMARY KEY (`hTID`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Data for the table `hos_type` */

INSERT  INTO `hos_type`(`hTID`,`hTName`) VALUES (1,'一室一廳'),(2,'兩室一廳'),(3,'三室一廳');

執行命令得


出租房屋信息表

 
DROP TABLE IF EXISTS `hos_house`;

CREATE TABLE `hos_house` (
  `hMID` INT(4) NOT NULL AUTO_INCREMENT,
  `UID` INT(4) NOT NULL,
  `SID` INT(4) NOT NULL,
  `hTID` INT(4) NOT NULL,
  `price` DECIMAL(10,2) DEFAULT '0.00',
  `topic` VARCHAR(50) NOT NULL,
  `contents` VARCHAR(255) NOT NULL,
  `hTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `copy` VARCHAR(500) DEFAULT NULL,
  PRIMARY KEY (`hMID`),
  KEY `fk_house_district` (`UID`),
  KEY `fk_house_street` (`SID`),
  KEY `fk_house_type` (`hTID`),
  CONSTRAINT `fk_house_district` FOREIGN KEY (`UID`) REFERENCES `sys_user` (`UID`),
  CONSTRAINT `fk_house_street` FOREIGN KEY (`SID`) REFERENCES `hos_street` (`SID`),
  CONSTRAINT `fk_house_type` FOREIGN KEY (`hTID`) REFERENCES `hos_type` (`hTID`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

/*Data for the table `hos_house` */

INSERT  INTO `hos_house`(`hMID`,`UID`,`SID`,`hTID`,`price`,`topic`,`contents`,`hTime`,`copy`) VALUES (1,1,1,1,'800.00','萬泉莊','萬泉莊一號','2016-12-14 17:03:55',NULL),(2,1,1,2,'800.00','萬泉莊','萬泉莊二號','2016-04-14 17:03:55',NULL),(3,1,2,1,'800.00','蘇州街','蘇州街一號','2016-01-14 17:03:55',NULL),(4,1,2,3,'800.00','蘇州街','蘇州街二號','2016-09-14 17:03:55',NULL),(5,1,3,1,'800.00','中關村','中關村一號','2016-10-14 17:03:55',NULL),(6,1,3,3,'800.00','中關村','中關村二號','2016-03-14 17:03:55',NULL),(7,1,4,2,'800.00','東四','東四二號','2016-09-14 17:03:55',NULL),(8,1,4,1,'800.00','東四','東四一號','2016-11-14 17:03:55',NULL),(9,1,4,3,'800.00','東四','東四三號','2016-09-14 17:03:55',NULL);

執行命令得


1.臨時表

MySQL臨時表在我們需要保存一些臨時數據時是非常有用的.臨時表只在當前連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間.

語法:

CREATE TEMPORARY TABLE 表名(

    ....)

例:使用LIMIT關鍵字實現查詢數據分頁顯示

使用臨時表保存臨時的查詢結果

查詢輸出第6條~第10條出尊房屋信息

 
CREATE TEMPORARY TABLE lin(#創建一個臨時表lin
	SELECT * FROM hos_house#獲取hos_house表的全部信息
	LIMIT 5,5#顯示第6條~第10條
)

SELECT * FROM lin

當使用SHOW TABLES命令顯示數據表列表時,你將無法看到lin表.如果推出MySQL會話,再使用select命令來讀取原先創建的臨時表數據,會發現數據庫中沒有該表存在,因爲退出時該臨時表已經被銷燬了

2.查詢指定客戶發佈的出租房屋信息

需求說明:查詢張三發佈的所有出租房屋信息,並顯示房屋分佈的街道和區縣

提示:結果數據來源於出租房屋信息表  客戶信息表 區縣信息表 街道信息表

使用連接查詢和子查詢兩種方式關聯多表數據實現

 
#連接查詢
SELECT `dName`,`sName`,h.*#獲取出租房屋所有信息  街道和區縣信息
FROM `hos_house` AS h
INNER JOIN `sys_user` AS u ON u.UID=h.UID
INNER JOIN `hos_street` AS s ON s.SID=h.SID
INNER JOIN `hos_district` AS d ON d.DID=s.`sDID`#通過內連接4表連查分別將關聯字段匹配
WHERE u.`uName`='張三'#條件爲張三發佈

#子查詢
SELECT (SELECT `dName` FROM `hos_district` AS d WHERE d.`DID`=s.`sDID` ),
`sName`, h.*
FROM `hos_house` AS h
INNER JOIN `hos_street` AS s ON s.`SID`=h.`SID`
WHERE h.`UID`=(
	SELECT `UID` FROM `sys_user` WHERE `uName`='張三'
)

執行命令得


3.按曲線製作房屋出租清單

需求說明 :

根據戶型和房屋所在區縣和街道,爲至少有兩個街道有出租房屋的區縣製作出租房屋清單

提示

先用HAVING子句篩選出接到數量大於1的區縣

 
SELECT `hTName`,`uName`,`dName`,`sName`#獲取租房信息
FROM `hos_house` AS h
INNER JOIN `hos_type` AS t ON t.`hTID`=h.`hTID`
INNER JOIN `hos_street` AS s ON s.`SID`=h.`SID`
INNER JOIN `hos_district` AS d ON d.`DID`=s.`sDID`
INNER JOIN `sys_user` AS u ON u.uid=h.`UID`#四表連查關係匹配
WHERE d.`DID` IN (
	SELECT sDID FROM `hos_street`#獲取所有街道所在區縣
	WHERE SID IN( #條件 這些街道均在出租房屋信息中存在
		SELECT SID
		FROM `hos_house`
		GROUP BY `SID`#
	)
	GROUP BY sdid
	HAVING COUNT(*)>1#至少有兩個街道
)

解釋:

步驟1:列出大框架四表內連接

步驟2:先獲取所有街道均屬於哪個區 結果爲 :1區3條街道  2區 3條街道

步驟3:通過子查詢獲取出租房屋信息中存在哪些街道,結果爲:(1,2,3,4號街道)

步驟4:篩選插入自查詢和having語句  一區1,2,3號街道均有出租房 二區4號街道有出租房5,6接到沒有不符合題意至少兩條街道有出租房所以排除 答案只有一區

執行命令得


4.按季度統計本年發佈的房屋出租數量

需求說明:

按季度統計出本年各區縣各街道各種戶型房屋出租數量

輸出2016年從1月1日起至今的全部出租房屋數量,各區縣出租房屋數量及各街道 戶型出租房屋數量

 
	SELECT QUARTER(`hTime`) AS 季度,' 合計'AS 區縣,'' AS 街道,'' AS 戶型,COUNT(*) AS 出租數量
	FROM `hos_house`
	GROUP BY 季度
UNION
	SELECT QUARTER(`hTime`) AS 季度,dname AS 區縣,' 小計' AS 街道,'' AS 戶型,COUNT(*) AS 出租數量
	FROM `hos_house` AS h
	INNER JOIN hos_street AS s ON s.sid =h.sid
	INNER JOIN hos_district AS d ON  d.did=s.sdid
	GROUP BY 季度,d.did
UNION 
	SELECT QUARTER(`hTime`) AS 季度,dname AS 區縣,sname AS 街道,htname AS 戶型,COUNT(*) AS 出租數量
	FROM `hos_house` AS h
	INNER JOIN hos_street AS s ON s.sid =h.sid
	INNER JOIN hos_district AS d ON  d.did=s.sdid
	INNER JOIN hos_type AS t ON t.htid=h.htid
	GROUP BY 季度,d.did,s.sid,t.htid
ORDER BY 1,2,3,4

執行命令得




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章