博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql面试题
阅读量:2070 次
发布时间:2019-04-29

本文共 2588 字,大约阅读时间需要 8 分钟。

1.sql关键字顺序与解析

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

select  查询结果	from  从哪张表里查找	join     on        联合查询	where  查询条件	group by  分组	having 对分组结果指定条件	order by  对查询结果排序

2.case表达式

使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

select a.课程号,b.课程名称,		sum(case when 成绩 between 85 and 100 then 1 else 0 end) as '[100-85]',		sum(case when 成绩 >=70 and 成绩<85 then 1 else 0 end) as '[85-70]',		sum(case when 成绩>=60 and 成绩<70  then 1 else 0 end) as '[70-60]',		sum(case when 成绩<60 then 1 else 0 end) as '[<60]'		from score as a right join course as b 		on a.课程号=b.课程号		group by a.课程号,b.课程名称;

行列转换

select 学号, 		sum(case when 课程号 = 0001 then 成绩  else 0 end) as 课程号0001,		sum(case when 课程号 = 0002 then 成绩  else 0 end) as 课程号0002,		sum(case when 课程号 = 0003 then 成绩  else 0 end) as 课程号0003		from score		group by 学号

3.插入数据

普通插入

insert into tb(列1, 列2,。。。)values(值1,值2,。。。)

将存在表中的列插入到其它存在表的存在列中去

INSERT INTO 目标表(目标表列名)SELECT 源表列名表FROM 源表

将现有表中的数据插入到新表中

SELECT 源表列名INTO 目标表FROM 源表

合并数据进行多行插入

INSERT INTO 目标表(目标表列名)SELECT 列名表1 UNIONSELECT 列名表2 UNION......SELECT 列名表n

4.更新数据

普通更新

update 表名 set 列名=值  where  筛选条件

运用子查询更新

update device d, (select id from device where id not in(select min(t.id) from device t group by t.device_id)) b set d.scene_id=null where d.id=b.id;

用表b更新表a

update utd_gb_info a,(SELECT DISTINCT gbPn, imgInfo FROM utd_gb_info WHERE imgInfo!='' AND gbPn !='')bset a.imgInfo=b.imgInfowhere a.gbPn=b.gbPn and a.imgInfo = '';

5.查看数据表每个字段的注释

SELECTA.name AS table_name,B.name AS column_name,C.value AS column_descriptionFROM sys.tables AINNER JOIN sys.columns B ON B.object_id = A.object_idLEFT JOIN sys.extended_properties C ON C.major_id = B.object_id AND C.minor_id = B.column_idWHERE A.name = '表名'

6.理论基础

1.为什么要设置主键

给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是「平衡树」结构,换句话说,就是整个表就变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。

2.为什么要设置自增主键

mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低,自增主键会减少产生的碎片

  1. 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页,这样就会形成一个紧凑的索引结构,近似顺序填满

  2. 如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面.

3.为什么索引能加快查询速度

  1. DB在执行一条语句时,默认的方式是根据搜寻条件进行全表扫描,遇到匹配的就加入到搜索结果集合。如果对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
  2. 添加索引的话,首先去索引列表中查询,而我们的索引列表是B类树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。
  3. 索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

转载地址:http://bwjmf.baihongyu.com/

你可能感兴趣的文章
Oracle列转行函数 Listagg() 语法详解及应用实例
查看>>
LISTAGG函数的用法
查看>>
Oracle Spatial操作geometry方法
查看>>
IDEA类和方法注释模板设置(非常详细)
查看>>
Java程序初始化的顺序
查看>>
Dubbo和Spring结合配置文件内容解析为bean的过程
查看>>
fastJson注解@JSONField使用的一个实例
查看>>
fastjson的@JSONField注解的一点问题
查看>>
fastjson使用(三) -- 序列化
查看>>
浅谈使用单元素的枚举类型实现单例模式
查看>>
Java 利用枚举实现单例模式
查看>>
Java 动态代理作用是什么?
查看>>
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) (清晰,浅显)
查看>>
三种线程安全的单例模式
查看>>
Spring AOP 和 动态代理技术
查看>>
从 volatile 说起,可见性和有序性是什么
查看>>
如何开始接手一个项目
查看>>
Netty 5用户指南
查看>>
Java实现简单的RPC框架
查看>>
一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
查看>>