杂文之mysql


用法

1.mysql中case的使用:


文章地址:

case使用文章地址

2.in的一些用法

当where后面有子表的查询中,当这个表的返回值有多个的时候不能用=,要用in;

在使用中,应该尽量避免使用in,单值的话尽量使用=;
其可参考文章:
单值应该使用=

3.转义的一些写法:

一些转义符号

4.这个问题一开始是来自于大学数据库课本的题目。。。。

参考了文章:
文章1

文章2

设有三个关系:

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 =2AND NOT EXISTS	(学生SCX没有选)

        	(SELECT *

         	FROM SC SCZ  
					(学生SCX选了)  (一门课程为SCY)
         	WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))

5.sql的top子句的用法

以下是用法详情文章:

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

分组查询文章2

重点:
分组查询中,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、《中华人民共和国刑法》第九十九条:本法所称以上、以下、以内,包括本数。

3、对文中“以上”“以下”的语义范围进行总括说明,例如:本办法所称“不足”“不超过”“不满”均不含本级,“以上”均含本级。

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的各种引擎

未完待续。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值