(三)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:这些小问题都是我在写的时候遇到的,以前也遇到,但总是没有习惯把它们记录下来,看过就忘记了。现在把他记录下来,要多回顾回顾。