mysql-基础语法

distinct

distinct只能放在select首位,比如select distinct name, age from user;(不能select age, distinct name from user;),

并且distinct是针对select所有字段的,而不仅仅是首个字段,比如:

select distinct name, id from A

 执行结果

和count结合使用

select count(distinct name) from A;//输出3

count(*)、count(1)、count(列名)

count(列名)会计算该列非null值的数量,如果该列有索引就会走索引,如果没有则会全表扫描;

count(1)和count(*)在数据库中会做相应的优化,二者可能会优先选择PK索引进行计数,如果没有PK则找not null列索引,如果仍然没有则会全表扫描。

join

join表示连接,分为内连接和外连接,外连接又分为左(外)连接、右(外)连接和全(外)连接(mysql没有全外连接)。

内连接类似where条件过滤,比如select * from student s join course c on s.id=c.sid;等价于select * from student s, course c where s.id=c.sid;,如果不设置连接条件,二者就等同于笛卡尔积;

左连接表示以左表的所有行去尝试与右表连接,即使连接不到也不会影响左表的显示;

右连接与左连接一致;

外连接会显示左右表的所有数据,以on条件进行连接,如果不存在on条件,则与笛卡尔积一致。

group by和having

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。

要说group by就必须说明sql语句的执行顺序

(8)SELECT (9)DISTINCT  (11)<Top Num> <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)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

前面的序号就表示其在执行中的顺序,on、where、group by的字段均可以不在select中,having如果不是聚合函数而是一个字段,则该字段必须在select中,order by的字段可以不在select中。

下面有三张表,分别为student、class、teacher

 

例一

//不会报错,输出a1,可以看做是将整个表分为了一个大组,然后对该组进行having筛选
SELECT s.name FROM student s HAVING COUNT(age)>6;
//Unknown column 's.age' in 'having clause'
SELECT s.name sname FROM student s HAVING s.age>11;

//从输出看,having相当于where
SELECT s.name sname, s.age sage FROM student s HAVING sage>11;

由上两例可知,如果having后面的条件不是一个聚合函数,则条件字段必须在select中

having还可以向下面这样用,与第一句的不同的地方在于二者的执行顺序,第一句先执行count(age)>6后执行select s.name,下面这句先执行select s.name, count(age) scount后执行having scount>6

SELECT s.name, COUNT(age) scount FROM student s HAVING scount>6;

例二

SELECT * FROM student GROUP BY cid;

输出:

从例二可以看出mysql中,group by对于组内多行输出的情况,最终只会输出首行。

例三

SELECT name FROM student GROUP BY cid HAVING COUNT(id)>3;

输出a1,通过前两例可以猜测该句的执行逻辑是,先构造分好组的临时表,然后对每个组进行count(id)>3条件过滤,最终输出name列。

例四

现在需要输出班级、班长、班级人数信息

SELECT cts.id, cts.cname cname, cts.sname sname, cts.tname tname, total FROM 
//子表cts
(SELECT c.id, c.name cname, t.name tname, s.name sname FROM class c LEFT JOIN teacher t ON c.tid=t.`id` LEFT JOIN student s ON c.id=s.cid AND s.duty LIKE 'master') cts LEFT JOIN
//子表s
(SELECT cid id, COUNT(*) total FROM student s GROUP BY cid) s ON cts.id=s.id;

 输出

原文地址:https://www.cnblogs.com/holoyong/p/7527187.html