mysql多表子查询


SELECT * FROM stu;

#添加多行数据
INSERT INTO stu VALUES(1,'aaa'),(2,'ccc'),(3,'小明');
DROP TABLE stu_temp;
CREATE TABLE stu_temp
(
    sid INT PRIMARY KEY,
    NAME VARCHAR(200)
)
SELECT * FROM stu_temp;
#1:stu_temp表 不能存在的
#2:一边取数据一边创建数据表
#3:stu_temp 约束(主键)是从stu中拿不出来的
CREATE TABLE stu_temp(SELECT * FROM stu);
SELECT * FROM info;
#4:只需要某些数据表的基本结构,不需要数据!
# 查询过程中 where条件不成立,查询的就是结构,否则就是数据+结构
CREATE TABLE info_temp(SELECT * FROM info WHERE 1=2);

SELECT * FROM info WHERE 1=1;

SELECT * FROM info_temp;

CREATE TABLE info_temp3(SELECT id,age FROM info);

SELECT * FROM info_temp3;

DELETE FROM info_temp3;

SELECT * FROM info;

#通过age排序 1:升序 2:降序
#1:升序  从小到大  asc :不写的情况,默认就升序
SELECT * FROM info ORDER BY age ASC;
#2:降序  从大到小  desc
SELECT * FROM info ORDER BY age DESC;
#select 字段  表名  where 过滤条件  order by 排序;
SELECT * FROM info WHERE age>18 ORDER BY age DESC;


SELECT t.`id` AS 编号,t.`name` 姓名,t.`age` 年龄 FROM info t;
# 只要出现+,会发生两个字段之间的运算
SELECT t.id+'.'+t.`age` AS 连接后 FROM info t;

#null:空对象  而不是空白字符串
SELECT * FROM borrow WHERE returndate IS NULL;
#not : 不是的
SELECT * FROM borrow WHERE returndate IS NOT NULL;


#聚合函数
SELECT * FROM score;
#最高分 max()
SELECT MAX(t.`sexam`) AS 最高分 FROM score t;
#最低分 min()
SELECT MIN(t.`sexam`) AS 最低分 FROM score t;
#平均分 avg()
SELECT AVG(t.`sexam`) AS 平均分 FROM score t;
#总行数
SELECT COUNT(*) AS 行数 FROM score;
#总和
SELECT SUM(t.`sexam`) AS 总分成绩 FROM score t;

#字符串函数
#1:拼接字符串函数
SELECT CONCAT('jack','and','rose','一起吃个饭!') AS 字符串;

SELECT * FROM student;
#数据表中,是不区分大小写
SELECT CONCAT(t.`StudentName`,t.`LoginPwd`,t.`Address`) 字符串 FROM student t;

SELECT * FROM student;
#select 都是虚拟结果,不会对原始数据表产生影响
#2:insert函数 替换
SELECT INSERT(t.`Address`,2,3,'abc') AS 替换 FROM student t;


#3:大小写转换
SELECT UPPER(LOWER(UPPER(t.`Email`))) 转换 FROM student t;

#4:截取字符串
SELECT SUBSTRING('abcefghgk',2);
SELECT SUBSTRING('abcefghgk',2,3);

#日期函数
#1:当前日期
SELECT CURDATE();

#2:当前时间
SELECT CURTIME();

#3:当前日期和时间
SELECT NOW();

#4:一年中的第几周
SELECT WEEK(NOW());

#5:年份
SELECT YEAR(NOW());

#6:月份
SELECT MONTH(NOW());
SELECT * FROM student;

SELECT YEAR(t.`BornDate`) AS 年份,MONTH(t.`BornDate`) AS 月份 FROM student t;


#7:差值  datediff: 天数
SELECT DATEDIFF(NOW(),'2002-02-02');

#数据表中计算年龄
SELECT DATEDIFF(NOW(),a.`BornDate`)/365 AS 生日 FROM student a;

SELECT FLOOR(DATEDIFF(NOW(),a.`BornDate`)/365) AS 生日 FROM student a;

#8:计算日期增量
SELECT ADDDATE(NOW(),50000);

SELECT ADDDATE(NOW(),500000);

#数学函数
#向上取整
SELECT CEIL(RAND()*10);
#向下取整
SELECT FLOOR(RAND()*10);

#limit:分页
SELECT * FROM student;
/*
    分页
    每页显示3条数据,分3页
    公式:(当前页-1)*每页显示条数
    select * from 表名 limit 公式,每页显示的条数;
    limit:限制行数
*/
#显示第1页
SELECT * FROM student LIMIT 0,3;
#显示第2页?(当前页-1)*每页显示条数
SELECT * FROM student LIMIT 3,3;

SELECT * FROM student LIMIT 6,3;

#查询比“谢挺疯”年龄大的学生信息
#用一个sql查询出来,需要子查询
#子查询执行的原理:
#先执行子语句,执行完成后,把查询的结果给父查询
#从上往下写,先要结果,后要过程
SELECT * FROM student t WHERE t.`BornDate`<(
    SELECT borndate FROM student WHERE studentname='谢挺疯'
);

SELECT * FROM student;
SELECT * FROM score;
SELECT * FROM SUBJECT;

/*
查询参加最近一次Logic Java考试成绩的学生的最高分和最低分
1:最近
2:Logic Java
100  22
*/
SELECT MAX(sexam) 最高分,MIN(sexam) 最低分 FROM score WHERE subjectno=(
    SELECT subjectno FROM SUBJECT WHERE subjectname='Logic Java')
AND sdate =(
    SELECT MAX(sdate) FROM score WHERE subjectno=(
        SELECT subjectno FROM SUBJECT WHERE subjectname='Logic Java')
);
#优化后:数据库性能优化
SELECT MAX(sexam) 最高分,MIN(sexam) 最低分 FROM score WHERE sdate =(
    SELECT MAX(sdate) FROM score WHERE subjectno=(#根据Logic java查询
        SELECT subjectno FROM SUBJECT WHERE subjectname='Logic Java')
);
SELECT * FROM student;
SELECT * FROM score;
SELECT * FROM SUBJECT;
#查询“Logic Java”课程考试成绩为60分的学生名单
#in多个结果返回给父级查询
SELECT * FROM student WHERE studentno IN (
    SELECT studentno FROM score WHERE subjectno IN(
        SELECT subjectno FROM SUBJECT WHERE subjectname='Logic Java'
    ) AND sexam=60
)
#not:取反
SELECT * FROM student WHERE studentno NOT IN (
    SELECT studentno FROM score WHERE subjectno IN(
        SELECT subjectno FROM SUBJECT WHERE subjectname='Logic Java'
    ) AND sexam=60
)

#查询参加“Logic Java”课程最近一次考试的在读学生名单
SELECT * FROM student WHERE studentno IN(
    SELECT studentno FROM score WHERE subjectno IN(
        SELECT subjectno FROM SUBJECT WHERE subjectname = 'Logic Java'
    ) AND sexam=(
        SELECT MAX(sexam) FROM score WHERE subjectno IN(
            SELECT subjectno FROM SUBJECT WHERE subjectname = 'Logic Java'
        )
    )
)

SELECT * FROM student WHERE studentno NOT IN(
    SELECT studentno FROM score WHERE subjectno IN(
        SELECT subjectno FROM SUBJECT WHERE subjectname = 'Logic Java'
    ) AND sexam=(
        SELECT MAX(sexam) FROM score WHERE subjectno IN(
            SELECT subjectno FROM SUBJECT WHERE subjectname = 'Logic Java'
        )
    )

)





#房屋所在区县、 街道为至少有2个街道有房屋
SELECT a.`SID`,b.`SDID`,COUNT(*) AS num FROM hos_house a
INNER JOIN hos_street b ON a.`SID`=b.`SID`
GROUP BY a.`SID`,b.`SDID`;

#显示:户型,姓名,区县,街道
SELECT (SELECT htname FROM hos_type WHERE htid=t.`HTID` ) AS 户型,
(SELECT uname FROM sys_user WHERE uid=t.`UID`) AS 姓名,
(SELECT dname FROM hos_district WHERE did=(SELECT sdid FROM hos_street WHERE t.`SID`=sid)) AS 区县,
(SELECT sname FROM hos_street WHERE t.`SID`=sid) AS 街道 FROM hos_house t
WHERE t.`SID` IN(
    SELECT sid FROM hos_street WHERE sdid IN(
        SELECT m.sdid FROM (
            SELECT a.`SID`,b.`SDID` AS sdid,COUNT(*) AS num FROM hos_house a
            INNER JOIN hos_street b ON a.`SID`=b.`SID`
            GROUP BY a.`SID`,b.`SDID`
        ) m
        GROUP BY m.sdid
        HAVING COUNT(*)>1
    )
);




#1:每一个统计 季度  区县  街道  户型 算出房屋的数量
#2:按照区县小计
#3:按照季度合计
SELECT QUARTER(a.`HTIME`) AS 季度,
d.`DName` AS 区县,
b.`SName` AS 街道,
c.`HTName` AS 户型,COUNT(*) AS 数量 FROM hos_house a
INNER JOIN hos_street b ON a.`SID`=b.`SID`
INNER JOIN hos_type c ON a.`HTID`=c.`HTID`
INNER JOIN hos_district d ON b.`SDID`=d.`DID`
GROUP BY QUARTER(a.`HTIME`),d.`DName`,b.`SName`,c.`HTName`
UNION
SELECT QUARTER(a.`HTIME`) AS 季度,
d.`DName` AS 区县,
' 小计','',COUNT(*) AS 数量 FROM hos_house a
INNER JOIN hos_street b ON a.`SID`=b.`SID`
INNER JOIN hos_type c ON a.`HTID`=c.`HTID`
INNER JOIN hos_district d ON b.`SDID`=d.`DID`
GROUP BY QUARTER(a.`HTIME`),d.`DName`
UNION
SELECT QUARTER(a.`HTIME`) AS 季度,
' 合计','','',COUNT(*) AS 数量 FROM hos_house a
INNER JOIN hos_street b ON a.`SID`=b.`SID`
INNER JOIN hos_type c ON a.`HTID`=c.`HTID`
INNER JOIN hos_district d ON b.`SDID`=d.`DID`
GROUP BY QUARTER(a.`HTIME`)
ORDER BY 1,2,3,4;

猜你喜欢

转载自blog.csdn.net/brid_fly/article/details/80671659