【数据库】Mysql常用知识点

常用题型:

子句的执行顺序:

对数据库基本操作是每个程序员基本功,如何理解并快速记住sql执行的顺序呢,其实一条复杂的sql就能搞定:

SELECT DISTINCT <select_list>
FROM <left_table><join_type> 
JOIN <right_table>ON <join_condition>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>
执行顺序:

1

2

3

4

5

6

7

8

9

10

(7)     SELECT

(8)     DISTINCT <select_list>

(1)     FROM <left_table>

(3)     <join_type> JOIN <right_table>

(2)     ON <join_condition>

(4)     WHERE <where_condition>

(5)     GROUP BY <group_by_list>

(6)     HAVING <having_condition>

(9)     ORDER BY <order_by_condition>

(10)     LIMIT <limit_number>

mysql中的where和having子句的区别

mysql中的where和having子句都可以实现过滤记录的功能,但他们的用法还是有一些区别的,看一例子:
用group by和having子句联合来查出不重复的记录,sql如下:
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
然后看这个,就容易理解了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
先用group by 对email进行分组,在用having来过滤大于1的,这样查找出来的就是重复的记录了.

 

利用Distinct 和 group by锁定数据的时候:

唯一性:distinct,但是大表一般用distinct效率不高,大数据量的时候都禁止用distinct,建议用group by解决重复问题。

即:数据量小的时候用distinct,数据量大的时候用group by 效率更高。distinct可以放在COUNT内表示重复的不计数

where之后不可以跟Count()函数

例题:从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

 

此题应注意以下三点:

1、先用GROUP BY title将表格以title分组,再用COUNT(DISTINCT emp_no)可以统计同一title值且不包含重复emp_no值的记录条数

2、根据题意,输出每个title的个数为t,故用AS语句将COUNT(DISTINCT emp_no)的值转换为t

3、由于WHERE后不可跟COUNT()函数,故用HAVING语句来限定t>=2的条件

1

2

SELECT title, COUNT(DISTINCT emp_no) AS t FROM titles

GROUP BY title HAVING t >= 2

猜你喜欢

转载自blog.csdn.net/weixin_38035852/article/details/81748810
今日推荐