mysql的学习笔记(阶段二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: - mysql函数,控制流函数 SELECT IF ( 5 > 3, "大于", "小于" );-- 5 >3 显示大于,否则就是小于 SELECT *, IF ( score >= 85, '优秀', '及格' ) flag FROM score;
-- mysql函数,控制流函数
  SELECT
  IF
    ( 5 > 3, "大于", "小于" );-- 5 >3 显示大于,否则就是小于
  SELECT
    *,
  IF
    ( score >= 85, '优秀', '及格' ) flag 
  FROM
    score;
  SELECT
    ifnull( 5, 0 );-- 如果第一个值是null,那么就当作0处理
  SELECT
    *,
    ifnull( comm, 0 ) com_flag 
  FROM
    emp;
  SELECT
    isnull( 5 );
  SELECT
    nullif( 12, 12 ) -- 判断两个值是否相等,一样的话就会返回null,否则就会返回第一个值
-- case when语句
  SELECT
  CASE
    5 
    WHEN 1 THEN
    '你好' -- 看case后面的语句是否满足when中的某一个值,如果相等就输出对应的值,否则就else后面的语句
    WHEN 2 THEN
    'hello' 
    WHEN 3 THEN
    'hi' ELSE '。。。' 
    END AS info;-- 另一种格式
  SELECT
  CASE
    WHEN
    2 > 1 THEN
      "你好" -- 直接在when后面写语句,当前面的某一个语句满足的时候后面的语句就不会执行了
      WHEN 2 < 1 THEN
      "hello" ELSE '其他' 
    END AS info;-- mysql 窗口函数
-- row_number(),rank(),dense_rank()
    SELECT
    id,
    NAME,
    salary,
    dense_rank() over ( PARTITION BY id ORDER BY salary DESC ) AS rn1 
    FROM
    employee;
    CREATE TABLE `emp` (
    `id` INT ( 11 ) NOT NULL,
    `emp_name` VARCHAR ( 255 ) DEFAULT NULL,
    `dept_no` VARCHAR ( 255 ) DEFAULT NULL,
    `emp_salary` INT ( 10 ) DEFAULT NULL,
    `emp_hire_date` date DEFAULT NULL,
    PRIMARY KEY ( `id` ) 
    );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 1, '张三', '0001', 5000, '2017-01-11' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 2, '李四', '0002', 1000, '2018-10-10' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 3, '王五', '0003', 2000, '2018-12-19' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 4, '赵六', '0002', 4000, '2019-09-11' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 5, '王强强', '0001', 3000, '2019-03-14' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 6, '刘阳', '0002', 6000, '2019-08-08' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 7, '周心怡', '0003', 500, '2015-06-10' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 8, '毛志宇', '0004', 4500, '2016-09-20' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 9, '刘德仁', '0002', 3500, '2016-02-25' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 10, '范德武', '0001', 3000, '2020-02-12' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 11, '梅婷婷', '0005', 8000, '2013-07-07' );
    INSERT INTO `emp` ( `id`, `emp_name`, `dept_no`, `emp_salary`, `emp_hire_date` )
    VALUES
    ( 12, '郑冰', '0005', 1000, '2014-11-17' );
    SELECT
    dept_no,
    emp_name,
    emp_salary,
    emp_hire_date,
    sum( emp_salary ) over ( PARTITION BY dept_no ORDER BY emp_hire_date ) AS pv1 
    FROM
    emp;--  求topn
-- 求出每个部门薪资排在前三位的员工-分组求topn
    SELECT
    * 
    FROM
    ( SELECT emp_name, id, emp_salary, dept_no, dense_rank() over ( PARTITION BY dept_no ORDER BY emp_salary DESC ) AS rn FROM emp ) t 
    WHERE
    t.rn <= 3;-- 对所有员工进行全局排序
    SELECT
    emp_name,
    dept_no,
    emp_salary,
    dense_rank() over ( ORDER BY emp_salary DESC ) AS rn 
    FROM
    emp;--  开窗聚合函数
    SELECT
    emp_name,
    dept_no,
    emp_salary,
    sum( emp_salary ) over ( PARTITION BY dept_no ) AS c1 
    FROM
    emp;-- rank() 函数对分区的每行分配一个排名
-- 还是按照部门进行分组,然后每组(部门号一样的按照薪资进行排序),然后rank给一个排名号码
    SELECT
    emp_name,
    dept_no,
    emp_salary,
    emp_hire_date,
    rank() over ( PARTITION BY dept_no ORDER BY emp_salary DESC ) AS "部门排名" 
    FROM
    emp;-- 头尾函数
-- first_value()
-- last_value()
-- 按照薪资排序后获取每次获取到行后到目前为止的第一个值或者最后一个值(排序后的)
    SELECT
    emp_name,
    dept_no,
    emp_salary,
    emp_hire_date,
    first_value( emp_salary ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS FIRST,
    last_value( emp_salary ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS last 
    FROM
    emp;-- 获取排在第几值
    SELECT
    emp_name,
    dept_no,
    emp_salary,
    emp_hire_date,
    nth_value( emp_salary, 1 ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS FIRST,
    nth_value( emp_salary, 2 ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS SECOND 
    FROM
    emp;-- 等级排序函数
    SELECT
    emp_name,
    dept_no,
    emp_hire_date,
    emp_salary,
    ntile( 3 ) over ( PARTITION BY dept_no ORDER BY emp_hire_date ) AS rn 
    FROM
    emp;-- 取排在第几的数值
    SELECT
    emp_name,
    dept_no,
    emp_hire_date,
    emp_salary,
    nth_value( emp_salary, 2 ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS SECOND,
    nth_value( emp_salary, 3 ) over ( PARTITION BY dept_no ORDER BY emp_salary ) AS third 
    FROM
    emp;-- 取出每一个部门的第一组员工(相当于分组后再进行部分取样)
    SELECT
    * 
    FROM
    ( SELECT emp_name, dept_no, emp_salary, emp_hire_date, ntile( 3 ) over ( PARTITION BY dept_no ORDER BY emp_hire_date ) AS nt FROM emp ) t 
    WHERE
    t.nt = 1;-- mysql 视图(view)虚拟的逻辑
-- 创建试图
    CREATE 
    OR REPLACE VIEW view1_emp AS SELECT
    emp_name,
    emp_salary 
    FROM
    emp;-- 查看表和视图
    SHOW TABLES;
    SHOW FULL TABLES;-- (视图不是真正的表,只是记录表的逻辑)(但是还是会基于原表的数据)
    SELECT
    * 
    FROM
    view1_emp;-- 对视图进行修改
-- 其实 create or replace 本身也是修改
    ALTER VIEW view1_emp AS SELECT
    * 
    FROM
    emp;-- 更新视图的时候也会对原表的数据产生变化
-- 视图
-- 1:包含聚合函数不能跟新
-- 2:包含distinct 不能跟新
-- 3:包含 having不能跟新
-- 4: 包含union 也不行
-- 5: 包含子查询不能更新
-- 6:视图包含join不可跟新
-- 一般情况下就不要去通过视图进行跟新了
-- 重命名视图
    RENAME TABLE view1_emp TO myview1;-- 删除视图
    DROP VIEW
    IF
    EXISTS myview1;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
139 0
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6
|
9天前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
25 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
30 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
9天前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
20 1
|
4月前
|
SQL Oracle 关系型数据库
MySQL学习笔记
MySQL学习笔记
33 0
|
2月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
52 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
2月前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
92 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
2月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。
|
2月前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
34 6