文章目录
用法
1.mysql中case的使用:
文章地址:
2.in的一些用法
当where后面有子表的查询中,当这个表的返回值有多个的时候不能用=,要用in;在使用中,应该尽量避免使用in,单值的话尽量使用=;
其可参考文章:
单值应该使用=
3.转义的一些写法:
4.这个问题一开始是来自于大学数据库课本的题目。。。。
参考了文章:
文章1
设有三个关系:
S(SNO, SNAME, AGE, SEX,Sdept) 学生表
SC(SNO, CNO, GRADE) 成绩表
C(CNO, CNAME, TEACHER) 课程表
问题是:
找出至少选修了2号学生选修过的全部课程的学生
条件一:
选修了2号学生选修过的全部课程
条件二:
至少
也就是说找出这样一个学生:
除了2号学生选修的全部课程之外,还选修了其它课程的
学生
假设所有的课程是:
x,a,b,c
假设2号学生选修的全部课程为x,还有其它的课程是a,b,c
那么我们就要找出a,b,c课程来
如果学号为2的学生选的一门课程SCY,学生SCX没有选,那么我们就筛除这个课程SCY,得到的是学号为2的学生没有选的课程;然后得到这个课程的学生;选出这样的学生SCX, 不存在这样一门课SCY, 学生2选了而学生SCX没有选
SELECT DISTINCT SCX.Sno (选出这样一个学生SCX)
FROM SC as SCX (对于学生SCX来说)
WHERE NOT EXISTS (不存在)
(SELECT *
FROM SC as SCY (这样一门课SCY)
(学生2选了)
WHERE SCY.Sno =‘2’AND NOT EXISTS (学生SCX没有选)
(SELECT *
FROM SC SCZ
(学生SCX选了) (一门课程为SCY)
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))
5.sql的top子句的用法
以下是用法详情文章:
TOP 子句用于规定要返回的记录的数目。
6.分组查询
有表如下:
S(SNO, SNAME, AGE, SEX,Sdept) 学生表 主键
SC(SNO, CNO, GRADE) 成绩表 两个外键
C(CNO, CNAME, TEACHER) 课程表 主键
问题如下:
查询至今没有考试不及格的学生学号?
分析:
查询出所有考试都及格的学号——>
也就是说我们要查询每个课程的成绩都大于等于60的学号;
一开始我是使用分组查询:
select sno,cno
from sc
group by cno
having grade>=60
这个做法是错误的!!!
这个做法是错误的!!!
这个做法是错误的!!!
默认情况下,
分组的select后面只能跟分组的列和聚合函数,以及主键
正确写法如下:
select sno
from sc
group by sno
having min(grade)>=60
还可以使用逆向思维,既然是每个课程的成绩都大于等于60的学号,那么我们先查询出:
课程成绩小于60的学号
select sno
from sc
where grade<60
然后再查询出不包括
课程成绩小于60的学号:
select distnict sno
from sc
where sno not in(
select sno
from sc
where grade<60
)
这样得到的学号就是没有课程成绩小于60的学号
以下结论参考了文章:
分组查询文章1
分组查询中,select 后面**只能**出现分组的列和聚合函数以及主键;
对于列来说:
group by后面的多个列,select可以出现零个,一个或者多个;这是单向关系,要是select出现的多个列,其group by 必须要有!!!
注意1以下两个分组语句:
select sno
from sc
group by sno
having grade>90
这个会报错
因为在having后面跟着的,必须是聚合函数的形式,
因为having是分组后的条件,条件必然是组信息!!!
2.找出各个成绩都大于90分的学生编号
select sno
from sc
group by sno
having min(grade)>90
注意2:
多个分组条件,直接在group by后面添加分组的列即可,用逗号隔开
如下:
15、找出各个系科男女学生的平均年龄和人数。
Select sdept,sex,avg(sage),count(*)
from s
group by sdept,ssex
7.count函数和sum函数的区别
参考文章:
count和sum区别
区别如下:
COUNT:是对记录进行汇总,即计数
SUM:是对符合条件的数值列字段进行求和
8.连接查询和子查询的效率问题
参考文章:
连接查询和子查询效率问题
引用总结:
测试总结:
1:查询的结果是一致的,如果没有加去重的话,两个sql语句,连接查询效率相对高一些 2:现在两个查询语句都使用了去重,连接查询效率却比子查询效率低得多 分析:个人认为这是由于去重的原因,连接查询去重机制是将两张表中符合条件的数据先筛选出来,然后再去重;但是子查询相当于去重了两遍,副表中筛选了一次以后,数据量小了很多,这时候再去跟主表中的数据匹配,再去重,工作量小了很多,
所以查询效率高了很多
总结: 1:在正常情况下,我还是坚持认为连接查询较好,子查询首先可读性就比较差,维护成本比较高,同时子查询也会建立临时表浪费资源 2:像上面的那种情况确实给我们启示,某些特殊情况下,子查询确实有用武之地,也不应该一味排斥 3:像上面的那种查询需求,其实在设计之初如果能够考虑到这种应用场景的话,不至于像现在这样难办,所以表设计还是核心
一般情况下,连接查询要比子查询效率高,因为子查询要建立一张临时表,再去比较;而连接查询不需要;
9.SQL和mysql的语句执行顺序
参考文章:
mysql语句执行顺序
总结:
(8) SELECT
(9) DISTINCT <select_list>
(6) 聚合函数(select_column)
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition> (关联条件)
(4) WHERE <where_condition> (过滤条件)
(5) GROUP BY <group_by_list> (分组条件)
(7) HAVING <having_condition> (分组过滤条件)
(10) ORDER BY <order_by_condition> (排序条件)
(11) LIMIT <limit_number>
其顺序为:
1.from
2.on
3.join
4.where
5.group by
6.聚合函数(column)
7.having
8.select
9.distinct
10.order
11.limit
10.常用查询语句界定问题
1、《民法通则》第一百五十五条规定: 民法所称的“以上”、“以下”、“以内”、“届满”,包括本数;所称的“不满”、“以外”,不包括本数;2、《中华人民共和国刑法》第九十九条:本法所称以上、以下、以内,包括本数。
4、《中华人民共和国刑法》第九十九条:本法所称以上、以下、以内,包括本数。比如“两年以上”中的“两年”即为本数。本数,就是所称之数,本位之数,参照之数,如:1000元以上,其中1000即是本位之数,所称之数,是参照之数。
总结:
以上,以下,以内,届满 都是包括本数
不足,不超过,不满,以外 都不包括本数
11.mysql创建视图
create view
视图名
as
select语句
举例:
CREATE VIEW
view_students_info
AS
SELECT * FROM tb_students_info;
12.where后面可以用的运算符
注意了,where后面不能跟聚合函数!!!
注意了,where后面不能跟聚合函数!!!
注意了,where后面不能跟聚合函数!!!
= 等于
<> 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
IN 指定针对某个列的多个可能值
13.mysql的各种引擎
参考文章:
mysql的各种引擎
未完待续。。。。。。