1.sql基本知识,联表查询

left join inner join 的区别, rstudio里面用什么包多,对熟悉算法的使用情况,lao1 lao2 区别。 然后 第二个人连线到美国同事面试的,主要是问sql的问题了,例如想找出一个表里email column重复的email怎么写,一些累加的题目,如两个表,部门表与职工表,排出每个部门职工的前五名销售量怎么写sql。 还有bash shell的基本问题,例如vim 或者怎么grep 这些基本功能怎么用。

outjoin innerjoin 的区别

inner join  A 和 B 获得的是A和B的交集(intersect),即韦恩图(venn diagram) 相交的部分.

outer join A和B获得的是A和B的并集(union), 即韦恩图(venn diagram)的所有部分.

左外连接:就是把左边表的数据全部取出来,而右边表的数据有相等的,显示出来,如果没有,显示NULL

右外连接:就是把右边表的数据全部取出来,而左边表的数据有相等的,显示出来,如果没有,显示NULL

 union all  union 有什么区别?哪个性能好?

union 对结果做去重处理。且默认排序

union all 只处理结果,没有去重处理,,不排序

UNION ALL 性能更好更快    

A: union all 不去重, union会去重。Union all性能好,因为无需额外去重

SELECT vehicle_number FROM vehicle WHERE vehicle_number='TV000040'

UNION

SELECT vehicle_number FROM test_process WHERE vehicle_number='TV000040';

SELECT vehicle_number FROM vehicle WHERE vehicle_number='TV000040'

UNION ALL

SELECT vehicle_number FROM test_process WHERE vehicle_number='TV000040';

Q:Count(*)和 count(1)

count(1)的执行过程是怎样的?

举个栗子

select count(1) from table;

因为count()函数的参数是1,不是字段,不会读取记录中的任何字段的值,而是放一个数字“1”进去,判断是不可能为空的,所以将count变量加1。这时候。我们可以对比出来了,count(1)执行得要比count(主键ID)快,因为从InnoDB返回ID会涉及到解析数据行以及拷贝字段值的操作。

数据库中count(*) count(1) 在什么情况下数据不一致

count(*)的执行过程是怎样的?

对于select * 这条语句来说,是查询表中的记录的所有字段值,但是在count(*)中,并不是这个意思。count(*)并不会把所有字段取出来,而是专门做了优化,不取值,count(*)肯定不是null,将count变量加1。count(*)其实可以理解为等于count(0),mysql会将参数 * 转化为参数 0 来进行处理,所以count(*)和count(1)的执行过程是基本一样的,性能上没有什么差异。

查询结果和mysql数据引擎有关

MyISAM 一样

INNODB是不一样的

MyISAM和InnoDB有很多区别,其中有一个关键的区别和我们接下来要介绍的COUNT(*)有关,那就是MyISAM不支持事务,MyISAM中的锁是表级锁;而InnoDB支持事务,并且支持行级锁。

因为MyISAM的锁是表级锁,所以同一张表上面的操作需要串行进行,所以,MyISAM做了一个简单的优化,那就是它可以把表的总行数单独记录下来,如果从一张表中使用COUNT(*)进行查询的时候,可以直接返回这个记录下来的数值就可以了,当然,前提是不能有where条件。

Q: 如何判断一张表里某个字段有重复值?

A: 利用COUNT 加HAVING ,答到这个的一般没问题, 具体如下:

SELECT vehicle_number, COUNT(1) AS CNT FROM test_process GROUP BY 1 HAVING CNT > 1;

重复字段加统计

SELECT vehicle_number FROM test_process GROUP BY vehicle_number HAVING COUNT(vehicle_number) >1;

重复字段没有统计个数

Q: 有一张表有两个字段,分别是商品ID和商品价格,如何取到商品价格是前10 名的所有商品ID?

A: 如果只能想到ORDER BY + LIMIT的,说明SQL 较弱。知道用窗口函数(PARTITION BY)的话,至少说明应该不止做过简单的SELECT * FROMTABLE,但想到用row_number() 的话。。不行, 如果会问价格是否有重复的话,说明对问题考虑得算周全,因为价格通常都会重复,ID是一般唯一的,如果知道rank() , dense_rank()的话基本就没问题了。当然也有不用partition by 的方式,但步骤较多

rank() , 1,2,2,4,5,6 排名不连续

dense_rank(),1,2,2,3,4,5,6 排名连续

good_id price

select good_id, price, rank() over(PARTITION BY good_id ORDER BY price DESC) AS rk from table WHERE rk>=10

sql 查询顺序:

from -> where -> group by ->having -> select -> order by -> limit

二、sql优化常用的几种方法

1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num列设置默认值0,然后通过=等号查询:

select id from t where num=0

4、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

此查询可优化为:select id from t where num=10

union all

select id from t where num=20

sql相关的概念如视图,索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值