(三)sql语句中需要注意的小细节

本文总结了SQL编程中常见的效率问题,如select*与指定列名的差异,算术运算符优先级,空值处理,随机数生成,以及复杂的连接与分组函数使用场景。深入探讨了MySQL特有的错误处理,如不能在同一表中查询并更新数据,以及视图修改限制。通过实例讲解,帮助读者理解和避免SQL编程中的常见误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(三)sql中所遇到的小问题总结

1. select * 和 select 所有列名 那个效率更高?
select 所有列名 效率更快;select * 需要先查询表元的列名,一定程度上加大了数据库的负担。
但在平时练习时,可以直接写*。但是在以后写项目时就要写上具体列名。

2. 算术运算符优先级
/ * 大于 ± ,优先级相同,从左到右依次计算。加上括号提高优先级和可读性。

3. 空值运算
与null运算都为null

4. 列别名的as可以写也可以不写

5. describe 简写为desc 可以查看表的结构;desc student

6. 什么时候用逻辑运算符 and/or/not,以及他们的优先级?
当有条件语句的时候可以使用 逻辑运算符,且 and的优先级高于 or/not

7. 随机数的生成
rand()的范围是0-1之间的小数
当需要取区间在(x,y)之间的随机数时。可以使用如下公式:
rand()*(y-x)+x 即可;如取区间(2,100) 的一个随机数,Y=rand()*98 +2 。

8. mysql中出现’1093 - You can’t specify target table ‘emp’ for update in FROM clause’错误?
原因:mysql中不能将同一表中查询的数据 更新到 同一张表中。只有在mysql中才会出现的问题。(该问题只在mysql中出现,Oracle不会出现此问题)
解决方法:,利用别名来“忽悠”,即新建一张临时表。例子如下;求出emp表的平均工资,将他付给emp表中sal字段为空的记录。
UPDATE EMP SET SAL =(
SELECT a.AVGSALE
SELECT AVG( IFNULL(SAL,0) AS AVGSALE FROM EMP ) a

WHERE SAL IS NULL
)

9. 常用关键词的优先级如何?
from>where>group by>having>select>order by

10. 连接中join on 条件 和join where条件的区别?
先总结一句话,on先选在生成。where是先生成再选。不准确的一句话: on的优先级比where还要高!
意思就是:A join B on A.id=B.id 是一体的。join连接是生成一个临时表。该临时表生成的条件就是A.id=B.id。即先做条件运算,再生成临时表。
而A join B where A.id=B.id 是分开的。先做A join B 连接之后生成了一张临时表,然后在这张临时表上,再进行where A.id=B.id 条件筛选
on是筛选条件后生成临时表。where是生成临时表后在选条件。次序不同。

11. mysql中不能嵌套分组函数!如avg(count(xxx))是不被允许的。而在Oracle中就可以(但是最多可以嵌套2层)。

12. 分组函数的使用场合? 能在那些关键词后面使用?
分组函数(max,min,avg,sum,count)只能使用在select,group by和having子句后面!!!
而在WHRER 后面是无法使用的!!!。切记!

13. 视图修改出现1288:The target table xxxx of the UPDATE is not updatable错误?什么情况下可以对使视图进行修改?
一一对应的情况下可以对视图进行更新,但视图子句中包含一下条件时,就无法更新。含有聚合函数,group by子句having子句,位于选择列表中的子查询等条件。

14. 有外键关联的删除?
方法一:先删除原有外键,在添加约束,添加约束的时候,添加级联删除。
alter table 表名 drop foreign key 外键名
alter table 表名 add constrinct 外键名 foreign key (列名) references 主表(列名) on delete caseade
方法二:挨个表删除,注意删除顺序。

体会:总而言之,这些小问题都比较容易忘记,以上的几个知识点的关键是在于把 sql语句的执行顺序。理解他的执行顺序就会好很多。
PS:这些小问题都是我在写的时候遇到的,以前也遇到,但总是没有习惯把它们记录下来,看过就忘记了。现在把他记录下来,要多回顾回顾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值