• 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;

     输出

  • 相关阅读:
    mybatis做like模糊查询
    mysql带有子查询的like查询
    form表单提交,后台怎么获取select的值?后台直接获取即可,和input方式一样。
    Spring MVC 向页面传值-Map、Model和ModelMap
    JavaWeb登录、注销、退出、记住用户名和密码
    EL表达式多条件或判断用法
    三级分销会员一次查询出来的SQL语句
    mysql 中合并查询结果union用法 or、in与union all 的查询效率
    关于取List中的指定几条数据以及注意事项
    BoxedApp Packer 将您的原始应用“打包”成单个完全的可执行二进制文件
  • 原文地址:https://www.cnblogs.com/holoyong/p/7527187.html
Copyright © 2020-2023  润新知