DW集训营数据库Mysql梳理(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29027865/article/details/88035432
  1. 导入示例数据库
    首先创建并打开数据库,接着在数据库下执行sql或者将sql语句复制执行sql语句。

  2. SQL是什么?MySQL是什么?
    SQL即结构化查询语言(Structured Query Language),是一种特殊的数据库查询和程序设计语言,用来对数据进行crud。
     MySQL是一个关系型数据库管理系统。

  3. 查询语句 SELECT FROM
    语句解释 :查询表达式
    去重语句:
    select distinct name from A
    前N个语句:
    select column_name(s) from table_name limit number
    CASE…END判断语句:
    使用case…end 实现if条件判断

    SELECT CASE sva 
             WHEN 1 THEN '男' 
             ELSE '女' 
           END AS ssva 
    FROM   taname 
    WHERE  id = '1'
    
  4. 筛选语句 WHERE
    语句解释: where语句进行条件查询
    运算符/通配符/操作符:
    运算符主要有两种–>
    一种是使用比较运算符:
    主要有:=、>、<、>=、<=、<>、!=、<=>

    SELECT goods_name, 
           goods_price 
    FROM   tdb_goods 
    WHERE  goods_cate = '超级本'; 
    

    一种是用ANY、SOME 或ALL 修饰的比较运算符:

    SELECT goods_id, 
           goods_name, 
           goods_price 
    FROM   tdb_goods 
    WHERE  goods_price = any (SELECT goods_price 
                              FROM   tdb_goods 
                              WHERE  goods_cate = '超级本'); 
    
  5. 分组语句 GROUP BY
    聚集函数:
    [GROUP BY {col_name | position}] [ASC | DESC],…]
    语句解释
    查询结果分组,GROUP BY之后加可以加上列名,也可以加上位置参数:

    SELECT sex 
    FROM   users 
    GROUP  BY sex; 
    
    # 不推荐用位置的方式表示参数
    #1不是代表id,是代表SELECT sex....语句中的sex,所以这里的1其实就是sex的意思;
    #如果SELECT后面跟多个字段,比如username,sex两个字段,如果你GROUP BY还是希望用sex字段的话,就要用数字2而不是1了,这是因为sex排在username后面
    SELECT sex 
    FROM users 
    GROUP BY 1;
    

    HAVING子句:对分组附加条件
    分组条件语法结构:[HAVING where_condition]
    比如对年龄大于35岁的用于进行性别分组:

    SELECT sex 
    FROM   users 
    GROUP  BY sex 
    HAVING age > 35; 
    

    但是这样操作会报错,报错的原因是因为HAVING后面的条件只能为聚合函数(比如SUM,MIN,MAX等)或者该条件出现在SELECT中,所以我们可以将SELECT中加入age:

    SELECT sex, age 
    FROM   users 
    GROUP  BY sex 
    HAVING age > 35; 
    

    或者使用聚合函数,在这里表示对id数大于等于2的sex进行分组:

    SELECT sex 
    FROM users 
    GROUP BY sex 
    HAVING count(id) >=2;
    
  6. 排序语句 ORDER BY
    语句解释:order by语句对查询结果排序
    正序、逆序:
    ASC:升序(默认),DESC:降序,
    比如我们按照id降序排序:

    SELECT * 
    FROM users 
    ORDER BY id DESC;
    

    如果对多个字段进行排序时,如果第一个字段可以排出想要的结果,则忽略其他字段,如果不能,则遵守第二个字段,依次类推,比如我们首先按照年龄默认排序,如果其中有同龄的用户,我们可以设置为如果同龄,则按照id降序进行排序:

    扫描二维码关注公众号,回复: 5392118 查看本文章
    SELECT * 
    FROM users 
    ORDER BY age,id DESC;
    
  7. 函数
    时间函数
    NOW():表示当前日期和时间

    SELECT NOW();
    +---------------------+
    | now()               |
    +---------------------+
    | 2019-02-28 17:25:31 |
    +---------------------+
    1 row in set
    

    CURDATE():当前日期

     SElECT CURDATE();
    +------------+
    | CURDATE()  |
    +------------+
    | 2019-02-28 |
    +------------+
    1 row in set
    

    CURTIME():当前时间

    SElECT CURTIME();
    +-----------+
    | CURTIME() |
    +-----------+
    | 17:26:44  |
    +-----------+
    1 row in set
    

    DATE_ADD():日期变化

    SELECT DATE_ADD('2019-2-28',INTERVAL -365 DAY);
    +-----------------------------------------+
    | DATE_ADD('2019-2-28',INTERVAL -365 DAY) |
    +-----------------------------------------+
    | 2018-02-28                              |
    +-----------------------------------------+
    1 row in set
    

    DATEDIFF():日期差值

    SELECT DATEDIFF('2019-3-1','2018-2-28');
    +----------------------------------+
    | DATEDIFF('2019-3-1','2018-2-28') |
    +----------------------------------+
    |                              366 |
    +-----------------------
    

    DATE_FORMAT():日期格式化

    SELECT DATE_FORMAT('2019-2-28\','%m / %d / %Y ');
    +------------------------------------------+
    | DATE_FORMAT('2019-2-28','%m / %d / %Y ') |
    +------------------------------------------+
    | 02 / 28 / 2019                           |
    +------------------------------------------+
    1 row in set
    

    数值函数
    CEIL():进一取整(向上取整)
    DIV:整数除法
    FLOOR():舍一取整(向下取整)
    MOD:取余数(取模) (和%等价,同时可以对整数也可以对浮点型取余)
    POWER():幂运算,比如2的三次方
    ROUND():四舍五入
    TRUNCATE():数字截取(不四舍五入)

    字符串函数
    CONCAT():字符连接
    CONCAT_WS():使用指定的分隔符进行字符连接
    FORMAT():数字格式化
    LOWER():转换成小写字母
    UPPER():转换成大写字母
    LEFT():获取左侧字符,RIGHT():获取右侧字符
    需要两个参数,第一个是从哪个字符串获取,第二个是获取几位:
    LENGTH():获取字符串长度
    TRIM():删除前导和后续空格

    SUBSTRING():字符串截取,一共三个参数,第一个从哪个字符串截取,第二个是从第几个字符开始截取,第三个是截取几位:
    REPLACE():字符串替换

  8. SQL代码规范
    [SQL编程格式的优化建议] SQL编程格式的优化建议 - 知乎

作业
项目一:查找重复的电子邮箱(难度:简单)
表数据为
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+

通过对Email列分组,分组完后,再对其设置条件,如果count>1则认为是重复:

select * 
from email 
group by Email 
having count(Email) > 1;

项目二:
查找大国(难度:简单)
如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
表数据为:

+-------------+-----------+---------+------------+-----------+
| name        | continent | area    | population | gdp       |
+-------------+-----------+---------+------------+-----------+
| Afghanistan | Asia      |  652230 |   25500100 |  20343000 |
| Albania     | Europe    |   28748 |    2831741 |  12960000 |
| Algeria     | Africa    | 2381741 |   37100000 | 188681000 |
| Andorra     | Europe    |     468 |      78115 |   3712000 |
| Angola      | Africa    | 1246700 |   20609294 | 100990000 |
+-------------+-----------+---------+------------+-----------+

输出所有大国的名称,人口和面积,可以先想到select name,population,area;接着再考虑加条件,条件为筛选出大国:

select name,population,area
from world as w
where w.population >25000000
and w.gdp>20000000;

猜你喜欢

转载自blog.csdn.net/qq_29027865/article/details/88035432