MySQL数据库多表查询,子查询

写博客的第四天,今天来点数据库的操作,温故而知新,在前进的路上,多看看自己曾经走过的路,不要忘了自己是怎么一步一步走过来的,对于前方未知的道路,不要轻言放弃.

今天的内容全部是MySQL里面的语句,基本都是查询语句,当时为了学习这些语句,可是费了不少脑袋,一条SQL语句能写的比孙悟空的金箍棒还长,哈哈哈,来,上才艺:


-- 查询student表的所有记录
SELECT COUNT(*) FROM student

count(*):表示查询数据表中总共有多少条数据.

-- 查询student表第2条到第4条
SELECT id,NAME,sex,birthday,department,address FROM student LIMIT 1,4

limit:行数限定,分页操作最多,后面跟着的可以理解为起始位置,或者是在索引1的位置上,向后裁取4条数据

-- 从student表中查询计算机系和英语系的学生的信息
SELECT id,NAME,sex,birthday,department,address FROM student WHERE department='计算机系' OR department='英语系'
-- 从score表中查询每个科目的最高分
SELECT c_name,MAX(grade) FROM score WHERE c_name='计算机'
SELECT c_name,MAX(grade) FROM score WHERE c_name='英语'
SELECT c_name,MAX(grade) FROM score WHERE c_name='中文'

max:表示取最大值.

-- 查询李四的考试科目和考试成绩
SELECT s.id,s.name,s.department,sc.c_name,sc.grade FROM student s,score sc WHERE s.name='李四' AND s.id=sc.stu_id

多表查询,from后面是数据表,跟着的是对该表起的别名,这里要注意笛卡尔积.

笛卡尔积是指在数学中,两个集合XY的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员.

解决的方法是,表明1.列名1=表明2.列名2;

-- 计算每个考试科目的平均成绩
SELECT sc.c_name,AVG(sc.grade) FROM score sc GROUP BY sc.c_name

AVG:函数表示取平均值.                       group by:表示根据什么进行分组.

-- 查询同时参加计算机和英语考试的学生信息
SELECT sc.stu_id,s.name,s.sex,s.birthday,s.department,s.address,sc.c_name,b.c_name FROM (SELECT sc.stu_id,sc.c_name FROM score sc WHERE sc.c_name='计算机') sc,(SELECT sc.stu_id,sc.c_name FROM score sc WHERE sc.c_name='英语') b,student s WHERE b.stu_id=sc.stu_id AND s.id=b.stu_id

这里用到了子查询,子查询就是以查询出来的数据当做值或条件,或者以查询出来的数据当做临时表

-- 将计算机考试成绩按从高到低进行排序
SELECT sc.stu_id,sc.c_name,sc.grade FROM score sc WHERE sc.c_name='计算机' ORDER BY grade DESC 

order by:以什么为主进行排序.                             desc:降序            asc:升序

-- 查询姓张或者姓王的同学的姓名、院系和考试科目及成绩
SELECT s.name,s.department,sc.c_name,sc.grade FROM student s,score sc WHERE s.id=sc.stu_id AND s.name LIKE'张%' OR s.name LIKE'王%' 

模糊查询:like '%张%':like是语法,后面跟着的是以什么为条件进行查询,只要包括这个字体就返回,百分号%表示多个占位,比如在不知道该物的名称是多少字的时候,就可以在前后加上%,下划线_表示一个占位,比如两位数的名称就可以写一个条件字再加一个下划线,比如'张_'.

-- 计算每个学生的总成绩
SELECT s.id,s.name,s.sex,s.department,scc.总成绩 FROM (SELECT sc.stu_id,SUM(sc.grade)总成绩 FROM score sc GROUP BY sc.stu_id) scc,student s WHERE s.id=scc.stu_id

sum函数:求和.

这里因为我们使用的是来自子查询的表,所以在我们想显示子查询的内容时,应当以子查询中的查询显示为列名,不然会找不到,比如我在子查询中用了sum(sc.grade)总成绩,我后面跟的总成绩就是要去显示的列名,你在调用我时,不能调用我之前定义的列名,应调用子查询中被你定义的列名.


总结:数据库中查询是最复杂多样的,也是最容易被使用的,而且面试时多为多表查询用法,这一章好像全是查询内容吧,做了一个小时,其实查询的话,只要你思路清晰,逻辑合适,那么查询就很简单,如果有哪里的思路不清晰了,连查询出来的结果都不能在脑子中推算出来的话,那么查询简直就像地狱,因为你根本就不知道查询出什么东西,就没有办法去构思,在查询.一定要想好自己写出的代码是什么作用,写下之后会运行什么结果,那么你的思路就会出奇的清晰.那今天就到这里了,有哪里做的不好,或者有什么更好的建议,欢迎留言吐槽,有哪里不懂的可以留言给我,我会一一答复,源码私信找我拿,感谢耐心观看,明天再见!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道而起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值