暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(十三)数据库 | MySQL实用技术合集1

统计美学 2021-09-17
279


点击上方蓝字关注我们


MySQL中的函数和关键字是个庞大的族群,还有很多非常实用的技术,我们将在本篇推送中以实例的方式逐步更新~~在第5期和第9期我们分别梳理了数据处理函数、排名窗口函数、自定义函数和一些高级函数,简单回忆一下:

文本函数:Concat(), Length(), Trim(), Soundex()

日期函数:DateDiff(), Date(), Time()

数值函数:Mod(), Sqrt(), Pi(), Rand()

聚集函数:Sum(), COUNT(), Avg()

排名函数:Rank(), Dense_rank()

其他函数:IF(), IFNULL(), ISNULL(), User()

自定义:CREATE FUNCTION f_n(para) return_type

1

小数函数


    -- round(), truncate(), format()
    USE crashcourse;
    SELECT order_num, prod_id, quantity, item_price,
    item_price*quantity AS total_price,
    round(item_price*quantity, 1) AS total_price1,
    truncate(item_price*quantity, 1) AS total_price2,
    format(item_price*quantity, 1) AS total_price3
    FROM orderitems
    WHERE order_num = 20005;
    复制

    Note:format()函数返回值的数据类型是字符型!



    2

    窗口函数


      -- lag(), lead(), rank(), sum()...
      SELECT sales_employee, fiscal_year, sale AS 'this_year_sale'
      lag(sale, 1, 0) over(partition by sales_employee order by fiscal_year) AS 'last_year_sale',
      lead(sale, 1, 0) over(partition by sales_employee order by fiscal_year) AS 'next_year_sale',
      Rank() Over(partition by fiscal_year order by sale desc) AS 'ranking_year',
      sum(sale) over(partition by fiscal_year) AS 'total_year',
      sum(sale) over(partition by sales_employee) AS 'total_employee'
      FROM sales;
      复制


      Note: 窗口函数允许你站在当前行通过“窗口”观察到不在此地的风景!



      3

      WITH与临时表


        -- 创建表 department
        CREATE TABLE department(
        id INT AUTO_INCREMENT PRIMARY KEY,
        name varchar(50) NOT NULL
        );
        -- 向 department中插入数据
        INSERT INTO department(name)
        VALUES('IT'), ('Sales');
        -- 创建表 employee
        CREATE TABLE employee(
        id int auto_increment,
        name varchar(50) NOT NULL,
        salary int NOT NULL,
        departmentid int NOT NULL,
        PRIMARY KEY(id)
        );
        -- 添加外键约束
        ALTER TABLE employee ADD constraint fk_employee_department FOREIGN KEY (departmentid) REFERENCES department(id);
        -- 向 employee表中插入数据
        INSERT INTO employee(name, salary, departmentid)
        VALUES('Joe',85000, 1),
        ('Henry', 80000, 2),
        ('Sam', 60000, 2),
        ('Max', 90000, 1),
        ('Janet', 69000, 1),
        ('Randy', 85000, 1),
        ('Will', 70000, 1),
        ('Vincent', 70000, 2),
        ('Galary', 55000, 2);
        复制
          -- 查询每个部门工资前三的员工 
          -- 临时表创建方式1:在FROM子句中用AS关键字封装结果集为临时表,适用于简单查询
          SELECT department, employee, salary, depart_inner_ranking, depart_outer_ranking
          FROM
          (SELECT department.name AS 'department',
          employee.name AS 'employee',
          employee.salary AS 'salary',
          Dense_Rank() Over(PARTITION BY departmentid ORDER BY salary DESC) AS 'depart_inner_ranking',
          dense_rank() over(ORDER BY salary DESC) AS 'depart_outer_ranking'
          FROM employee INNER JOIN department ON employee.departmentid = department.id) AS temp_table
          WHERE depart_inner_ranking <= 3
          ORDER BY department ASC, salary DESC;
          -- 临时表创建方式2(推荐):用WITH...AS()建立临时视图,适用于复杂查询
          WITH temp_table AS(
          SELECT department.name AS 'department',
          employee.name AS 'employee',
          employee.salary AS 'salary',
          Dense_Rank() Over(PARTITION BY departmentid ORDER BY salary DESC) AS 'depart_inner_ranking',
          Dense_Rank() over(ORDER BY salary DESC) AS 'depart_outer_ranking'
          FROM employee INNER JOIN department ON employee.departmentid = department.id
          ) -- 用WITH封装起来的临时表类似于临时视图
          SELECT department, employee, salary, depart_inner_ranking, depart_outer_ranking
          FROM temp_table
          WHERE depart_inner_ranking <= 3
          ORDER BY department ASC, salary DESC;
          复制

          note: 1、与视图长期存在于数据库服务器不同,临时表的作用域仅为当前语句,执行完毕后临时表随即销毁;2、可以同时在一条SQL语句中建立多个临时表,当需要建立多个临时表或者某临时表需要反复使用时,强烈建议使用WITH,语法:WITH temp_table1 AS(), [temp_table2 AS(), ...] SELECT... 



          4

          数据类型转换


            -- CAST(value AS type), convert(value, type)
            -- type支持的数据类型包括:
            -- BINARY, CHAR(), DATE, TIME, DATETIME, DECIMAL
            -- 整型 SIGNED, 无符号整型 UNSIGNED
            SELECT CAST('2021-08-28 19:31:00' AS date) AS 'cast1',
            CAST('2021-08-28 19:31:00' AS time) AS 'cast2',
            CAST('-2021' AS signed) AS 'cast3',
            convert('2021', unsigned) AS 'convert1',
            convert('-2021', decimal(10,2)) AS 'convert2',
            convert(2021, char(4)) AS 'convert3';
            复制


            note: 时间日期数据的转换和提取可以通过时间日期处理函数,也可以通过数据类型转换函数完成



            未完待续......

            丰富的日期函数:TO_DAYS(), DATE_SUB(), DATE_FORMAT()......

            用mysql计算常用商业指标:日活、留存率、转化率......


            BACKPACK

            点击下方名片关注我们



            文章转载自统计美学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论