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相关的概念如视图,索引