SQL --数据查询功能 数据更改功能

数据查询

 

1. 查询语句的基本结构

 

select子句 和 from子句 是不可缺少的 其他子句都是可选的

 

2. 单表查询

1. 选择表中若干列

(1) 查询指定的列

 

(2) 查询全部列

 

(3) 查询经过计算的列

 

(4) 常量列

' '代表常量

(5) 添加列名 为列起别名 -- 列别名 AS

 

AS可以省略

 

2. 选择表中若干元组

(1) 消除取值相同的行 distinct

 

 

(2) 查询满足条件的元组

常用where子句实现,where从查询条件如下:

 

1)比较大小

 

2)确定范围

 

 

3)确定集合

 

 

 

4)字符串匹配

 

 

 

 

 

注意: sname 列 定义的是 非Unicode定长,即char(10) ,因此可以分配10个字节的空间,不足的部分用空格补齐。即对'王敏'实际存储的是'王敏'后边加6个空格---称为尾随空格。

在进行like 字符串匹配的时候,系统并不会自动去掉尾随空格,空格是一个字符,也满足_通配符,因此会出现二个字的情况

解决方法:可以使用函数 RTRIM

RTRIM(列名)

其功能是去掉指定列中尾随的空格,返回没有尾随空格的数据。例如,将例子中的语句改为:

sleelct Sname from Student where RTRIM(Sname) like '王__'

 

5)判断空值 是否为空

 

 

6)多重条件的查询 AND OR

 

 

 

 

上面那个

 

这里要用括号的原因是AND 的优先级高于 OR

 

3. 排序 ORDER BY ---ASC DESC

 

 

 

4. 使用计算函数汇总数据

 

 

例如:查询年龄最大的学生姓名,如下的写法是错误的

SELECT Sname FROM Student WHERE Sage =MAX(Sage)

正确的写法为后面的 子查询:SELECT Sname FROM Student where Sage=(select MAX(Sage) from Student)

 

5. 对查询结果进行分组统计 GROUP BY

1) 使用group by 语句

 

 

 

 

2) 使用where子句

where子句的优先级比group by 高

 

 

多列分组

 

3) 使用having 语句

主要用于对分组后的结果进行筛选,作用于组而不是单个记录 having一般与group by 一起使用

 

 

 

 

 

 

 

意思是having 条件多了费资源 where好点 不能无脑having

 

 

 

第二种写法比第一种写法执行效率高,因为where子句在group by 子句之前执行,因此参与的分组的数据较少。

 

6 多表连接查询

1. 内连接

 

 

 

就是把表之间连接起来

 

 

但是为啥会有二个重复的列, Sno

如何去掉重复的sno

 

 

 

再举个例子:

 

这里用表 别名

 

注意:当表取了别名后,在其他用到表名的地方都要用到别名,而不能再使用原表名

例如上面的S.Sno

 

涉及多张表的:

 

 

 

有分组 group by 的多表查询

 

 

 

有分组 group by,有where选择条件 的多表查询

 

 

2. 自连接

从意思上来看就是自己表连接自己,但在逻辑上看作二张表

注意实现方式:必须为表取别名

 

 

 

 

 

这里没有去掉数据结构这个数据

要去掉可以模仿例48 ---- and C1.Cname !='数据结构'

 

3. 外连接

 

注意:左外连接的含义是 限制表2中的数据必须满足条件,而不管表1中的数据是否满足连接条件,均输出表1中的内容

右外连接的含义是 限制表1中的数据必须满足条件,而不管表2中的数据是否满足连接条件,均输出表2中的内容

 

 

 

图中圈起来的二个学生,明明没选课,他们不满足连接条件,但是是左连接student表可以不用满足条件,全列出来

这样就可以看出来谁选课了,谁没选课

 

 

 

7 使用TOP限制结果集

在查询时候,有时候只希望列出结果集中的前几行结果,而不是全部结果,比如竞赛的成绩前三名

 

select top

如果有 distinct的话 ,则在distinct之后,查询列表的前面select distinct top 3 数据

一般要排序后才知道数据顺序

 

如果有并列的话

 

 

 

 

8 子查询

还记得上面讲到where后面不能跟计算函数SUM COUNT 等的问题吗?可以使用()子查询来实现

 

  1. 使用子查询进行基于集合的测试

 

 

举个例子

 

 

 

 

 

 

 

也可以通过上回学的自连接查询

 

一般都可以使用多表查询代替,但是查询需要分步的时候不许替代

 

 

 

 

 

  1. 使用子查询进行比较测试

 

 

 

 

  1. 使用子查询进行存在性测试

 

 

 

 

 

 

 

上面的查询语句可以换成

 

由此也可以看到,同一个查询可以用不同的方式来实现。总体来说,多表连接查询的效率比子查询的效率要高(因为查询优化器可以对多表连接查询进行更多的优化)。

 

下面在举一个例子总结下:

 

 

 

 

 

 

 

 

 

数据更改

增删改

INSERT DELETE UPDATE

 

插入数据

 

 

 

更新数据

 

无条件更新

 

有条件更新

 

 

删除数据

 

 

 

 

 

 

 

 

posted @ 2021-11-08 17:13  halfup  阅读(256)  评论(1编辑  收藏  举报