mysql 学习笔记

---恢复内容开始---

 

 

1  把列看成变量来使用。(查询模型)

---恢复内容结束---

where 查询 模型(很重要)

    理解 列就是变量 在每一行上,列的值都在变化 where 条件是表达式。在

    哪一行上表达式为 真,哪一行就可以取出来 。

 

2 group 与统计函数

count 函数

select count(*) from t  查询的是绝对的行数,哪怕某一行字段全部为null

而 select count(列名) from t  查询的是该列不为null的所有行数。

那么用count(1) 和count(*) 那个更好些呢?

  其实对于 myisam 引擎的表来说没有区别,这种引擎内部有一个计数器维护着行数

Innodb的表,用count(*) 直接读取行数效率很低,因为Innodb真的去要数一遍。

count函数要与分组函数合用功能更多。

3 group 分组函数 分完组后在统计

      下列 sql语句

      select goods_id sum(goods_number) from goods; 在mysql的低版本中是可以查询出结果的在高版本中会报错的

对于sql标准来说这是一个错误的语句不能执行的,

思考问题:

       全班同学排队,校长对老师说要统计同学的姓名和平均年龄 只能返回一行数据,这句话是有问题的

       1。只返回一行数据,要把谁的名字和平均年龄一起返回呢?

        在myslq的低版本中是把查到的第一条数据的姓名返回的。出于可移植性的考虑不建议这样写,

严格的讲 group by a,b,c 为列 则select 的列 只能在a,b,c 里选择,语义上才没有矛盾。

        2  group by 默认 取出 在分组后每一组的第一条信息,因此,如果我们要的数据不是第一条数据,需要用到子查询语句。

4     where 子句的 having 子句 可以对结果集再次筛选,排序等,,排序是针对最终的结果集,            所 以          order by 要放在 where/group by/having 的后面,顺序不能乱。排序 关键字 asc ,desc

5 limit 关键字 有两个参数,(offset,N)---offset表示从哪一行开始,N表示要取出的行数,如果offset

为0 的话可以省略...

  6 mysql 的子查询。

          where 型子查询: 指的是把内层查询的结果作为外层查询的比较条件

                    典型题: 如 查询最大的商品,最贵的商品.

             如果 where 列=(内层sql) 则内层sql返回的必须是单行单列单个值

             如果  where 列 in (内层 sql) 则内层sql只返回单列,可以多个行。

    注: 查询的结果集可以再作为一张表来对待。

         from 子查询: 即 ,内层sql的查询结果当成是临时表,供外层sql再次查询

            典型题 :查询每个栏目下的最新/最贵的商品

         Exists子查询:把外层的查询结果,拿到内层,看内层的查询是否成立,

            典型题:查询有商品的栏目。

7 为什么建表时加 not null default ''/ default 0? 因为不想列的值为 null

     null 是空类型,null的比较需要用 is null ,is not null ,碰到其他运算符一律返回null

    效率不高,影响效果,因此在建表时避免字段为null

   

------------------------------------------------------2019-04-28------------------------------------------------------------------------------------------

8 集合的知识

     高中学过的集合知识

      集合的特性

        1 无序性,

        2 唯一性。

,    3 集合的运算,求并集,交集,笛卡尔积(不是数学中的相乘)

一道数学题  集合A 有M个元素,集合B 有N个元素,

  那么 A*B有几个元素,答:有 N * M个元素。

 ----------------------------------------------------

  表与集合的关系 ,一张表就是一个集合,每一行就是一个元素,

  疑问?集合不能有重复数据,但是在表中可以有重复的数据。(错误,因为数据库中有默认的rowid)

  注:在数据

库中如何完成集合相乘的效果,答:直接用“,”隔开表名查询即可。

9. 两表做相乘,

       从行的角度说就是2表的每一行两两组和,

       从列的角度来看,结果集中的列是两表的列名的相加。

       两张表相乘在数据库中比如 a表 10000行,b表10000行,做全相乘的话

       10000 * 10000 会在数据库服务器端生成一张很大的临时表,占用了很大的内存,极大的影响了数据库的效率。l另外,没有利用索引,效率很低的。

10 左连接的语法:

         假设A表在左,B表在A表的右边互动,A表与B表通过一个关系来筛选B表的行。

      语法: A表 left join B on 条件 如果条件为真,则B 表对应的行取出

       那么  A表 left join B on  条件 查询的结果集可以看成是一张表 ,设为C,既如此,可以多C表进行查询,where group by having order by limit 等,都是可以使用的。

        问: C表的列有哪些呢? 答 :A,B表的列都可以查询到。

11 .左右连接和内连接的区别?

       left join on  /   right join on 没有太大的区别。

       内连接的特点:内连接是左右连接的交集。

       在mysql中不支持 外连接。。。

12 Union :联合 合并2条或多条数据。sql1 union sql2;

     能否把两张表使用Union ? 可以的。

     列的名称不一样能不能使用Union ? 可以的 查询结果以第一个sql的列名为主。

     不能使用Union的条件? 当两个查询列的数量不一致时。

     列的类型也可以不一样。

     Union后的结果集能否在排序? 可以的。注意 order by 是针对最后的结果集排序。

     外层语句还要对最终的结果再次排序,因此内层的语句的排序就没有意义了,

      内层的order by A语句单独使用不会影响结果集,仅排序在执行期间就被Mysql的代码分析器给优化掉了,内层的order by 必须能够影响结果时才有意义,比如配合 limit使用。

     Union 会默认去重复的数据,如果不想去掉重复的数据 使用 Union all

 

13  一个面试题目

    

需要查询出如下图结果

     

参考答案,select id , sum(num) from (select a.* from a union all select b.* from b ) temp group by id .这里使用了 sum函数和union all

  

 

原文地址:https://www.cnblogs.com/wjgbok/p/10776387.html