MySQL学习笔记(五)

学习地址 p15-p22

表修改之列的增删改

  1. 增加列:Alter table 表名 add 列名 列类型 列参数;[默认加在表末尾]
    加在指定列后面:Alter table 表名 add 列名 列类型 列参数 after 指定列名;
    加在最前面:Alter table 表名 add 列名 列类型 列参数 first;
  2. 删除列:Alter table 表名 drop 列名;
  3. 修改列类型:Alter table 表名 modify 列名 新类型 新参数;
  4. 修改列名及列类型:Alter table 表名 change 旧列名 新列名 新类型 新参数
question:如果列类型改了导致数据存不下?

比如 int 改成smallint列,如果不匹配数据将会丢失

表的查询

select 5种子句

  • where 条件查询
  • group by 分组查询
  • having 筛选
  • order by 排序
  • limit 限制结果条数
where 常用运算符

比较运算符 + 逻辑运算符

  1. 比较运算符:<<=>>==!=<>in在某集合内、between在某范围内
  2. 逻辑运算符:NOT!OR||AND&&
    注意优先级问题,和C语言类似
where 匹配

like 模糊匹配

  1. %通配任意字符
  2. _匹配单一字符

SQL查询模型

  • 列看成变量,查询时哪一行符合条件就取出哪一行
  • 既然是变量,就支持运算。
  • 列之间运算结果叫“广义投影”,列的运算结果可以当成列看,还可以起列别名:() as column_name
  • where是对表中的数据发挥作用,where发挥作用时表上实际并没有别名列,发挥完作用形成的结果里才有别名列。
  • 如果想在结果列(别名列)再进行筛选,得用having

一道面试题:一个num整数列,用一条语句把[20,29]的数改为20且把[30,39]之间的数改为30:update test set num=floor(num/10)*10 where num bwtween 20 and 39;

大胆把列当成变量看!

group分组及统计函数详解

  • 查询最贵的商品价格:select max(shop_price) from goods;
  • 查询商品库存总量:select sum(goods_num) from goods;
  • 查询所所有商品的平均价格:select avg(shop_price) from goods;
  • 统计有多少种商品:select count(*) from goods
    • select count(*) from table_name 查询的是绝对行数,不管是否NULL
    • select count(列名) from table_name 查询的是该列不为null的行数
  • 一次计算完每个栏目下的库存量之和:select sum(goods_number) from goods group by cat_id;

having 筛选

在结果集中筛选。

  • 查询栏目的积压货款,且筛选出积压金额>20000的栏目:

    1
    2
    3
    select cat_id,sum(goods_number*shop_price) as tot 
    group by cat_id
    having tot>20000
  • 查询比市场价省的钱,且省的钱>200的商品
    where实现:

    1
    2
    3
    select goods_id,market_price,shop_price,market_price-shop_price as discount 
    from goods
    where market_price-shop_price>200

    having 实现:

    select goods_id,market_price,shop_price,market_price-shop_price as discount 
    from goods
    having discount>200
    

综合练习

  1. 查询所有同学平均分:select name,avg(score) from result group by name;
  2. 查询挂科两门以上的同学:select name from result having count(score<60)>=2;
  3. 查询每个人的平均分及挂科数:select name,avg(score),sum(score<60) from result group by name;
  4. 查询挂科数2门以上的同学及平均分:select name,avg(score) sum(score<60) as gks from result group by name having gks>=2;
  5. count的缺陷:count原理根据列的某一行是否为null计数的,而不是逻辑判断结果计数!!!
  6. 正向思维是先查出谁的挂科数>=2,找到人再查这些人的平均分。逆向思维是先查所有人的平均分再筛选,上述就是用的逆向思维,正向比较麻烦要用子查询嵌套,一定要搞清楚查询逻辑模型。

Order by 与 limit详解

最终结果集出来后可以再排序,也就是排序针对最终结果集。即order by要放在where/group/having后面。

  • 按字段排序:order by 列名 desc/asc
  • 多字段排序:order by 列1 desc/asc,列2 desc/asc,...

limit在语句的最后,起限制条目的作用:limit [offset,] N

  • offset:偏移量,从第几条开始
  • N:取出条目
  • offset,如果不写则相当于limit 0,N