精华内容
下载资源
问答
  • 一天分为四个时间段
    万次阅读
    2018-11-08 09:58:18

    求分钟:

    SELECT CEIL((TO_DATE('2016-07-19 10:10:10' , 'YYYY-MM-DD HH24-MI-SS') - 
    TO_DATE('2016-07-19 10:07:50' , 'YYYY-MM-DD HH24-MI-SS')) * 24*60  )  
    as HOURS FROM DUAL;
    

    执行结果如下

    HOURS 
    3
    

    求小时:

    SELECT CEIL((TO_DATE('2016-07-19 15:10:10' , 'YYYY-MM-DD HH24-MI-SS') - 
    TO_DATE('2016-07-19 10:07:50' , 'YYYY-MM-DD HH24-MI-SS')) * 24  ) 
    AS minutesFROM DUAL;
    

    执行结果如下

    minutes
    6
    

    求秒:

    SELECT CEIL((TO_DATE('2016-07-19 10:10:10' , 'YYYY-MM-DD HH24-MI-SS') - 
    TO_DATE('2016-07-19 10:07:50' , 'YYYY-MM-DD HH24-MI-SS')) * 24*60*60)
    as SECOND FROM DUAL;
    

    执行结果如下:

    SECOND
    140
    

    oracle计算两个时间之前相差小时 ROUND(TO_NUMBER(结束时间 - 开始时间) * 24)

    ROUND(TO_NUMBER(结束时间 - 开始时间) * 24)

    例:

    SELECT Avg(Round(To_number(a.over_time - a.assign_time) * 24)) AS "timeUsed", 
           solveUser.name   AS "solveUser.name", 
           solveUser.id AS "solveUser.id" 
    FROM   em_work_order a 
    left join sys_user solveUser 
    ON solveUser.id = a.solve_user 
    GROUP  BY solveUser.name, solveUser.id 
    

    Oracle计算timestampdate类型的时间差

    首先是计算timestamp类型的时间差,

    下面以秒为Demo:

    SELECT * 
    FROM   swap_park_record T 
    WHERE  Round (To_number (To_date (To_char (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - 
                            To_date ( 
                             To_char (T .arrive_time, 
                             'yyyy-mm-dd hh24:mi:ss'), 
                                                      'YYYY-MM-DD HH24:mi:ss' 
                             )) * 24 * 60 * 60) > 60 
    AND "id" = '4077785'; 
    

    计算当前时间和某个字段时间差大于60秒的计算。

    详细:

    TIMESTAMP数据类型:是DATE的扩展,可以存储年、月、日、小时、分钟、秒,同时还可以存储秒的小数部分。

    通过to_timestamp函数将date型转成这种类型,来看看它的形式

    详见代码:

    SELECT TO_TIMESTAMP('2009-7-30','yyyy-mm-dd')  FROM dual  
    

    结果为:30-7月 -09 12.00.00.000000000 上午

    timestamp以日期格式输出表示 :

    select TO_CHAR(to_timestamp('2009-7-30','yyyy-mm-dd hh24:mi:ss') ,'YYYY-MM-DD HH24:MI:SS')  from dual  
    

    结果为:2009-07-30 00:00:00

    date格式的时间差,以秒为单位:

    select (to_date('2009-7-30', 'yyyy-mm-dd hh24:mi:ss') -  
            to_date('2009-7-29', 'YYYY-MM-DD HH24:mi:ss')) * 86400  as  "itvtime"  
    from dual  
    

    结果为:86400

    timestamp格式求时间差,以秒为单位:

    SELECT ( To_date(To_char(To_timestamp('2009-7-30', 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') 
    - To_date(To_char(To_timestamp('2009-7-29', 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'), 'YYYY-MM-DD HH24:mi:ss')) * 86400 AS "itvtime" 
    FROM   dual 
    

    结果为:86400

    求任意timestamp格式的时间戳,据1970年01月01日的毫秒数:

    SELECT ( To_date(To_char(To_timestamp('2009-7-30', 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') 
    - To_date('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:mi:ss') ) * 86400000 
    FROM   dual 
    

    结果为:1248912000000

    应用:具体应用时将例子中to_timestamp()阴影部分代码换成相应字段即可(该字段是timestamp格式)
    与得到以分为单位或小时为单位只需要变乘的数即可

    虽然实现了时间差的计算,自我感觉比较复杂化,希望找到比较简便的方法。。。

    根据日期求当月天数

    select add_months(trunc(to_date('2009-9', 'yyyy-mm'), 'mm'), 1) - trunc(to_date('2009-9', 'yyyy-mm'), 'mm')  
    from dual  
    

    二. 计算date类型的时间差:

    两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒):

    天:

    ROUND(TO_NUMBER(END_DATE - START_DATE))
    

    小时:

    ROUND(TO_NUMBER(END_DATE - START_DATE) * 24)
    

    分钟:

    ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60)
    

    秒:

    ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60)
    

    毫秒:

    ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)
    
    更多相关内容
  • 0900-1200 1200-1600 1600-2100 2100-0900 这四个时间段 意思就是相当于一天的开始是9点,然后最后的时间段是晚上9点到第二天早上9点 ,查询的数据都是9点到第二天9点的数据,求大神给点思路
  • 最近写项目,遇到一个将选中时间段平均分割为若干小段,然后根据小段时间在数据库查询求均值的问题,后台大哥犯懒,非说后台做不了,让我分好传给他ヾ(。 ̄□ ̄)ツ゜゜゜好气呦,但还要保持微笑,我就是这么懂礼貌的...

    最近写项目,遇到一个将选中时间段平均分割为若干小段,然后根据小段时间在数据库查询求均值的问题,后台大哥犯懒,非说后台做不了,让我分好传给他ヾ(。 ̄□ ̄)ツ゜゜゜好气呦,但还要保持微笑,我就是这么懂礼貌的好孩子ー( ̄~ ̄)ξ

     

    闲话不多说,来说实现过程

    最开始只是分固定时间段,每天两小时一分,也就直接全写了,后来需求变了,日期选择输入,想要多少天就要多少天,时间大了要求取到的数据量还是那么多

    我:不太好实现啊老板

    boss:啥?别人都能做到,你咋就做不到?你这技术水平怕是有点低了把?

    我:那我试试(MDZZ)

    先确定后台需要什么数据格式,按照存入格式,先写个方法

    1 function range(beginTime, endTime) {//存入格式
    2     this.beginTime = beginTime;
    3     this.endTime = endTime;
    4 }

    考虑到这是一个js文件,数据分割也是固定的等分,就写一个从外部获取参数的函数吧,TimeRange(startTime,endTime)函数用来供页面调用,只传入开始时间,结束时间,不写分多少组了,因为需要的数据总量一般都是固定的,分多少组也是固定的,哪里需要直接来js改就好了

    1  function TimeRange(startTime, endTime) { //传入开始时间var startTime 传入结束时间var endTime 传入格式xxxx-xx-xx 年月日
    2     var amount = 100; //定义分多少组
    3     var startTimes = startTime + " 00:00:00"; //日期添加时分秒 开始日期
    4     var endTimes = endTime + " 23:59:59"; //日期添加时分秒 结束日期
    5

     

    判断一波

    复制代码
    1 if(endTimes <= startTimes) {
    2         alert('结束日期必须大于开始日期!');
    3         return -1;
    4     }
    5 
    6     if(dataDiff > 15) {
    7         alert('单次查询日期不超过两周,请重新选择!');
    8         return -2;
    9     }
    复制代码

    既然平均分,那就得知道时间间隔,计算时间间隔,写个方法直接调用

    复制代码
     1 //计算天数差的函数,通用
     2 function DateDiff(sDate1, sDate2) { //sDate1和sDate2是2006-12-18格式  
     3     var aDate, oDate1, oDate2, iDays
     4     aDate = sDate1.split("-")
     5     oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0]) //转换为12-18-2006格式  
     6     aDate = sDate2.split("-")
     7     oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
     8     iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒数转换为天数  
     9     return iDays
    10 }
    复制代码

     

    整理了一下逻辑,伪代码如下

    复制代码
     1     //计算时间段总时间,分割后每段时间间隔,单位(秒)
     2         var timeRange;//存储计算出的时间段
     3         var timeAll ; //总时间间隔
     4         var timeGap ; //分割后时间间隔
     5         var slidingTime = 0; //循环开始条件
     6         var momentTime_front; //时间段前一个值
     7         var momentTime_rear;//时间段后一个值
     8         for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
     9             momentTime_front = 计算出的时间前半部分
    10             momentTime_rear = 计算出的时间后半部分
    11             timeRange.push(new range(momentTime_front, momentTime_rear));//将计算后的小段的开始时间和结束时间组合存入timeRange
    12         }
    13         return timeRange;
    14     } 
    复制代码

     

     

    实现后的TimeRange()方法如下:

    复制代码
     1 function TimeRange(startTime, endTime) { //传入开始时间var startTime 传入结束时间var endTime
     2     var amount = 100; //定义分多少组
     3     var timeRange = new Array(); //return数组初始化
     4     var dataDiff = DateDiff(startTime, endTime); //计算两个日期相差天数
     5     var startTimes = startTime + " 00:00:00"; //日期添加时分秒 开始日期
     6     var endTimes = endTime + " 23:59:59"; //日期添加时分秒 结束日期
     7 
     8     if(endTimes <= startTimes) {
     9         alert('结束日期必须大于开始日期!');
    10         return -1;
    11     }
    12 
    13     if(dataDiff > 15) {
    14         alert('单次查询日期不超过两周,请重新选择!');
    15         return -2;
    16     }
    17     if(1) {
    18         //计算时间段总时间,分割后每段时间间隔,单位(秒)
    19         var timeAll = (dataDiff + 1) * 24 * 3600; //总时间间隔
    20         var timeGap = timeAll / amount; //分割后时间间隔
    21         var slidingTime = 0; //循环开始
    22         var momentTime_front;  
    23         var momentTime_rear;
    24         for(slidingTime; slidingTime < timeAll; slidingTime += timeGap) {
    25             momentTime_front = addDatetime(startTimes, slidingTime)
    26             momentTime_rear = addDatetime(startTimes, (slidingTime + timeGap - 1))
    28             timeRange.push(new range(momentTime_front, momentTime_rear));
    29         }
    30         return timeRange;
    31     }
    32 }
    复制代码

     

    接下来的问题就是如何计算 momentTime_front 和 momentTime_rear 了

    我的思路是将开始时间加上秒数转换后的日时分秒等再相加,直接添加的语句或者方法没找到,那咋办?还把我难住了?找不到算了,技不如人,不如自己写一个方法,直接计算两个字符串类型的时间格式相加,哼╭(╯^╰)╮

    先想想怎么写,需要现将字符串转换成字符串类型的数组,将年月日时分秒都分开才能逐个击破,分开后的数组都是字符串类型,没法进行加减运算,强转!先写个将日期类型转换为整型数组的方法

    复制代码
     1 //传入'1970-01-01 00:00:00' 将其分成可计算的整形数组[1970,1,1,0,0,0]
     2 function getArray(dataTime) {
     3     dataTime = dataTime.replace(/ /, "-")
     4     var timesArray = dataTime.split("-");
     5     var timeArray = timesArray[3].split(":");
     6     timesArray[0] = parseInt(timesArray[0]);
     7     timesArray[1] = parseInt(timesArray[1]);
     8     timesArray[2] = parseInt(timesArray[2]);
     9     timesArray[3] = parseInt(timeArray[0]);
    10     timesArray[4] = parseInt(timeArray[1]);
    11     timesArray[5] = parseInt(timeArray[2]);
    12     return timesArray;
    13 }
    复制代码

     

    ok,能计算了,但是增加的时间是秒,还得把秒转换成年月日时分秒格式

    复制代码
     1 //将秒转换为日期格式(最高到天)
     2 function getDatetime(s) {
     3     var dataTime = new Array;
     4     //存入 秒
     5     dataTime[5] = parseInt((s / 1) % 60);
     6     //存入 分
     7     dataTime[4] = parseInt((s / 60) % 60);
     8     //存入 时
     9     dataTime[3] = parseInt((s / 60 / 60) % 24);
    10     //存入 日
    11     dataTime[2] = parseInt(s / 60 / 60 / 24);
    12     //存入 月
    13     dataTime[1] = parseInt(0);
    14     //存入 年
    15     dataTime[0] = parseInt(0);
    16     return dataTime;
    17 }
    复制代码

     

    好嘞,需要的类有了,可是时间相加,不是简单的数字相加啊,还要考虑闰年问题,大月小月问题,嗯....计算大月小月

    【本文由“java程序”发布,2017年10月14日】

    展开全文
  • MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System:关系数据库管理系统) 应用软件之
    • MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一

    在这里插入图片描述

    MySQL实战文章目录


    MySQL必会知识点梳理 (必看)

    在这里插入图片描述

    评论区评论要资料三个字即可获得MySQL全套资料 !


    【介绍】

    在这里插入图片描述

    什么是数据库

    • 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
    • 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
    • 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

    MySQL数据库

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    • MySQL 是开源的,目前隶属于 Oracle 旗下产品。
    • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
    • MySQL 使用标准的 SQL 数据语言形式。
    • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
    • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
    • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
    • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

    RDBMS 术语

    在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语

    • 数据库: 数据库是一些关联表的集合。
    • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
    • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
    • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
    • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
    • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
    • 外键:外键用于关联两个表。
    • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
    • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
    • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格

    数据库表的存储位置

    MySQL数据表以文件方式存放在磁盘中:

    1. 包括表文件、数据文件以及数据库的选项文件
    2. 位置:MySQL安装目录\data下存放数据表。目录名对应数据库名,该目录下文件名对应数据表

    注:

    InnoDB类型数据表只有一个*. frm文件,以及上一级目录的ibdata1文件
    MylSAM类型数据表对应三个文件:

    1. *. frm —— 表结构定义文件
    2. *. MYD —— 数据文件
    3. *. MYI —— 索引文件

    存储位置:因操作系统而异,可查my.ini


    【数据类型】

    • MySQL提供的数据类型包括数值类型(整数类型和小数类型)、字符串类型、日期类型、复合类型(复合类型包括enum类型和set类型)以及二进制类型 。

    一. 整数类型

    在这里插入图片描述

    • 整数类型的数,默认情况下既可以表示正整数又可以表示负整数(此时称为有符号数)。如果只希望表示零和正整数,可以使用无符号关键字“unsigned”对整数类型进行修饰。
    • 各个类别存储空间及取值范围。

    在这里插入图片描述

    二. 小数类型

    在这里插入图片描述

    • decimal(length, precision)用于表示精度确定(小数点后数字的位数确定)的小数类型,length决定了该小数的最大位数,precision用于设置精度(小数点后数字的位数)。

    • 例如: decimal (5,2)表示小数取值范围:999.99~999.99 decimal (5,0)表示: -99999~99999的整数。

    • 各个类别存储空间及取值范围。

    在这里插入图片描述

    三. 字符串

    在这里插入图片描述

    • char()与varchar(): 例如对于简体中文字符集gbk的字符串而言,varchar(255)表示可以存储255个汉字,而每个汉字占用两个字节的存储空间。假如这个字符串没有那么多汉字,例如仅仅包含一个‘中’字,那么varchar(255)仅仅占用1个字符(两个字节)的储存空间;而char(255)则必须占用255个字符长度的存储空间,哪怕里面只存储一个汉字。
    • 各个类别存储空间及取值范围。

    在这里插入图片描述

    四. 日期类型

    • date表示日期,默认格式为‘YYYY-MM-DD’; time表示时间,格式为‘HH:ii:ss’; year表示年份; datetime与timestamp是日期和时间的混合类型,格式为’YYYY-MM-DD HH:ii:ss’。
      在这里插入图片描述
    • datetime与timestamp都是日期和时间的混合类型,区别在于: 表示的取值范围不同,datetime的取值范围远远大于timestamp的取值范围。 将NULL插入timestamp字段后,该字段的值实际上是MySQL服务器当前的日期和时间。 同一个timestamp类型的日期或时间,不同的时区,显示结果不同。
    • 各个类别存储空间及取值范围。

    在这里插入图片描述

    五. 复合类型

    • MySQL 支持两种复合数据类型:enum枚举类型和set集合类型。 enum类型的字段类似于单选按钮的功能,一个enum类型的数据最多可以包含65535个元素。 set 类型的字段类似于复选框的功能,一个set类型的数据最多可以包含64个元素。

    六. 二进制类型

    • 二进制类型的字段主要用于存储由‘0’和‘1’组成的字符串,因此从某种意义上将,二进制类型的数据是一种特殊格式的字符串。
    • 二进制类型与字符串类型的区别在于:字符串类型的数据按字符为单位进行存储,因此存在多种字符集、多种字符序;而二进制类型的数据按字节为单位进行存储,仅存在二进制字符集binary。

    在这里插入图片描述


    【约束】

    • 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。下面文章就来给大家介绍一下6种mysql常见的约束,希望对大家有所帮助。

    一. 非空约束(not null)

    • 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。

    • Null类型特征:所有的类型的值都可以是null,包括int、float 等数据类型

    在这里插入图片描述

    二. 唯一性约束(unique)

    • 唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
    • 唯一约束不允许出现重复的值,但是可以为多个null。
    • 同一个表可以有多个唯一约束,多个列组合的约束。
    • 在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
    • 唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

    在这里插入图片描述

    三. 主键约束(primary key) PK

    • 主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。

    • 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。

    • 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

    在这里插入图片描述

    四. 外键约束(foreign key) FK

    • 外键约束是用来加强两个表(主表和从表)的一列或多列数据之间的连接的,可以保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

    • 创建外键约束的顺序是先定义主表的主键,然后定义从表的外键。也就是说只有主表的主键才能被从表用来作为外键使用,被约束的从表中的列可以不是主键,主表限制了从表更新和插入的操作。
      在这里插入图片描述

    五. 默认值约束 (Default)

    • 若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为NULL。

    在这里插入图片描述

    六. 自增约束(AUTO_INCREMENT)

    • 自增约束(AUTO_INCREMENT)可以约束任何一个字段,该字段不一定是PRIMARY KEY字段,也就是说自增的字段并不等于主键字段。

    • 但是PRIMARY_KEY约束的主键字段,一定是自增字段,即PRIMARY_KEY 要与AUTO_INCREMENT一起作用于同一个字段。

    在这里插入图片描述

    当插入第一条记录时,自增字段没有给定一个具体值,可以写成DEFAULT/NULL,那么以后插入字段的时候,该自增字段就是从1开始,没插入一条记录,该自增字段的值增加1。当插入第一条记录时,给自增字段一个具体值,那么以后插入的记录在此自增字段上的值,就在第一条记录该自增字段的值的基础上每次增加1。也可以在插入记录的时候,不指定自增字段,而是指定其余字段进行插入记录的操作。


    【常用命令】

    登录数据库相关命令

    一. 启动服务

    语法:

    mysql> net stop mysql
    

    二. 关闭服务

    语法:

    mysql> net start mysql
    

    三. 链接MySQL

    • 语法:mysql -u用户名 -p密码;
    root@243ecf24bd0a:/ mysql -uroot -p123456;
    
    • 在以上命令行中,mysql 代表客户端命令,-u 后面跟连接的数据库用户,-p 表示需要输入密码。如果数据库设置正常,并输入正确的密码,将看到上面一段欢迎界面和一个 mysql>提示符。
      在这里插入图片描述

    四. 退出数据库

    • 语法:quit
    mysql> quit
    
    • 结果:
      在这里插入图片描述

    DDL(Data Definition Languages)语句:即数据库定义语句

    对于数据库而言实际上每一张表都表示是一个数据库的对象,而数据库对象指的就是DDL定义的所有操作,例如:表,视图,索引,序列,约束等等,都属于对象的操作,所以表的建立就是对象的建立,而对象的操作主要分为以下三类语法

    • 创建对象:CREATE 对象名称;
    • 删除对象:DROP 对象名称;
    • 修改对象:ALTER 对象名称;

    数据库相关操作

    在这里插入图片描述

    一. 创建数据库

    • 语法:create database 数据库名字;
    mysql> create database sqltest;
    
    • 结果:
      在这里插入图片描述

    二. 查看已经存在的数据库

    • 语法:show databases;
    mysql> show databases;
    
    • 结果:
      在这里插入图片描述

    可以发现,在上面的列表中除了刚刚创建的 mzc-test,sqltest,外,还有另外 4 个数据库,它们都是安装MySQL 时系统自动创建的,其各自功能如下。

    1. information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
    2. cluster:存储了系统的集群信息。
    3. mysql:存储了系统的用户权限信息。
    4. test:系统自动创建的测试数据库,任何用户都可以使用。

    三. 选择数据库

    • 语法:use 数据库名;
    mysql> use mzc-test;
    
    • 返回Database changed代表我们已经选择 sqltest 数据库,后续所有操作将在 sqltest 数据库上执行。
      在这里插入图片描述
    • 有些人可能会问到,连接以后怎么退出。其实,不用退出来,use 数据库后,使用show databases就能查询所有数据库,如果想跳到其他数据库,用use 其他数据库名字。

    四. 查看数据库中的表

    • 语法:show tables;
    mysql> show tables;
    
    • 结果:
      在这里插入图片描述

    五. 删除数据库

    • 语法:drop database 数据库名称;
    mysql> drop database mzc-test;
    
    • 结果:
      在这里插入图片描述
    • 注意:删除时,最好用 `` 符号把表明括起来

    六. 设置表的类型

    • MySQL的数据表类型:MyISAMInnoDB、HEAP、 BOB、CSV等

    在这里插入图片描述
    语法:

    CREATE TABLE 表名(
    	#省略代码ENGINE= InnoDB;
    

    适用场景:

    1. 使用MyISAM:节约空间及响应速度快;不需事务,空间小,以查询访问为主
    2. 使用InnoDB:安全性,事务处理及多用户操作数据表;多删除、更新操作,安全性高,事务处理及并发控制
    
    1. 查看mysql所支持的引擎类型

    语法:

    SHOW ENGINES
    

    结果:

    在这里插入图片描述

    2. 查看默认引擎

    语法:

    SHOW VARIABLES LIKE 'storage_engine';
    

    结果:
    在这里插入图片描述


    数据库表相关操作

    在这里插入图片描述

    一. 创建表

    语法:create table 表名 {列名,数据类型,约束条件};

    CREATE TABLE `Student`(
    	`s_id` VARCHAR(20),
    	`s_name` VARCHAR(20) NOT NULL DEFAULT '',
    	`s_birth` VARCHAR(20) NOT NULL DEFAULT '',
    	`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
    	PRIMARY KEY(`s_id`)
    );
    
    • 结果
      在这里插入图片描述

    注意:表名还请遵守数据库的命名规则,这条数据后面要进行删除,所以首字母为大写。

    二. 查看表定义

    • 语法:desc 表名
    mysql> desc Student;
    
    • 结果:
      在这里插入图片描述
    • 虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到,可以使用如下命令实现
    • 语法:show create table 表名 \G;
    mysql> show create table Student \G;
    
    • 结果:
      在这里插入图片描述
    • 从上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。\G选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。

    三. 删除表

    • 语法:drop table 表名
    mysql> drop table Student;
    
    • 结果:

    在这里插入图片描述

    四. 修改表 (重要)

    • 对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用 alter table语句,以下是一些常用的命令。
    1. 修改表类型
    • 语法:ALTER TABLE 表名 MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
    • 例如,修改表 student 的 s_name 字段定义,将 varchar(20)改为 varchar(30)
    mysql> alter table Student modify s_name varchar(30);
    
    • 结果:
      在这里插入图片描述
    2. 增加表字段
    • 语法:ALTER TABLE 表名 ADD [COLUMN] [FIRST | AFTER col_name];
    • 例如,表 student 上新增加字段 s_test,类型为 int(3)
    mysql> alter table student add column s_test int(3);
    
    • 结果:
      在这里插入图片描述
    3. 删除表字段
    • 语法:ALTER TABLE 表名 DROP [COLUMN] col_name
    • 例如,将字段 s_test 删除掉
    mysql> alter table Student drop column s_test;
    
    • 结果:
      在这里插入图片描述
    4. 字段改名
    • 语法:ALTER TABLE 表名 CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
    • 例如,将 s_sex 改名为 s_sex1,同时修改字段类型为 int(4)
    mysql> alter table Student change s_sex s_sex1 int(4);
    
    • 结果:
      在这里插入图片描述

    注意:change 和 modify 都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。但是 change 的优点是可以修改列名称,modify 则不能。

    5. 修改字段排列顺序
    • 前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY)中,都有一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,默认 ADD 增加的新字段是加在表的最后位置,而 CHANGE/MODIFY 默认都不会改变字段的位置。

    • 例如,将新增的字段 s_test 加在 s_id 之后

    • 语法:alter table 表名 add 列名 数据类型 after 列名;

    mysql> alter table Student add s_test date after s_id;
    
    • 结果:
      在这里插入图片描述
    • 修改已有字段 s_name,将它放在最前面
    mysql> alter table Student modify s_name varchar(30) default '' first;
    
    • 结果:
      在这里插入图片描述

    注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展,在其他数据库上不一定适用。

    6.表名修改
    • 语法:ALTER TABLE 表名 RENAME [TO] new_tablename
    • 例如,将表 Student 改名为 student
    mysql> alter table Student rename student;
    
    • 结果:
      在这里插入图片描述

    DML(Data Manipulation Language)语句:即数据操纵语句

    • 用于操作数据库对象中所包含的数据

    一. 添加数据:INSERT

    Insert 语句用于向数据库中插入数据

    1. 插入单条数据(常用)

    语法:insert into 表名(列名1,列名2,...) values(值1,值2,...)

    特点:

    • 插入值的类型要与列的类型一致或兼容。插入NULL可实现为列插入NULL值。列的顺序可以调换。列数和值的个数必须一致。可省略列名,默认所有列,并且列的顺序和表中列的顺序一致。

    案例:

    -- 插入学生表测试数据
    insert into Student(s_id,s_name,s_birth,s_sex) values('01' , '赵信' , '1990-01-01' , '男');
    

    在这里插入图片描述

    2. 插入单条数据

    语法:INSERT INTO 表名 SET 列名 = 值,列名 = 值

    • 这种方式每次只能插入一行数据,每列的值通过赋值列表制定。

    案例:

    INSERT INTO student SET s_id='02',s_name='德莱厄斯',s_birth='1990-01-01',s_sex='男'
    

    在这里插入图片描述

    3. 插入多条数据

    语法:insert into 表名 values(值1,值2,值3),(值4,值5,值6),(值7,值8,值9);

    案例:

    INSERT INTO student VALUES('03','艾希','1990-01-01','女'),('04','德莱文','1990-08-06','男'),('05','俄洛依','1991-12-01','女');
    

    在这里插入图片描述

    上面的例子中,值1,值2,值3),(值4,值5,值6),(值7,值8,值9) 即为 Value List,其中每个括号内部的数据表示一行数据,这个例子中插入了三行数据。Insert 语句也可以只给部分列插入数据,这种情况下,需要在 Value List 之前加上 ColumnName List,

    例如:

    INSERT INTO student(s_name,s_sex) VALUES('艾希','女'),('德莱文','男');
    
    • 每行数据只指定了 s_name 和 s_sex 这两列的值,其他列的值会设为 Null。

    4. 表数据复制

    语法:INSERT INTO 表名 SELECT * from 表名;

    案例:

    INSERT INTO student SELECT * from student1;
    

    在这里插入图片描述注意:

    • 两个表的字段需要一直,并尽量保证要新增的表中没有数据

    二. 更新数据:UPDATE

    Update 语句一共有两种语法,分别用于更新单表数据和多表数据。

    在这里插入图片描述

    • 注意:没有 WHERE 条件的 UPDATE 会更新所有值!

    1. 修改一条数据的某个字段

    语法:UPDATE 表名 SET 字段名 =值 where 字段名=值

    案例:

    UPDATE student SET s_name ='张三' WHERE s_id ='01'
    

    在这里插入图片描述

    2. 修改多个字段为同一的值

    语法:UPDATE 表名 SET 字段名= 值 WHERE 字段名 in ('值1','值2','值3');

    案例:

    UPDATE student SET s_name = '李四' WHERE s_id in ('01','02','03');
    

    在这里插入图片描述

    3. 使用case when实现批量更新

    语法:update 表名 set 字段名 = case 字段名 when 值1 then '值' when 值2 then '值' when 值3 then '值' end where s_id in (值1,值2,值3)

    案例:

    update student set s_name = case s_id when 01 then '小王' when 02 then '小周' when 03 then '老周' end where s_id in (01,02,03)
    

    在这里插入图片描述

    • 这句sql的意思是,更新 s_name 字段,如果 s_id 的值为 01 则 s_name 的值为 小王,s_id = 02 则 s_name = 小周,如果s_id =03 则 s_name 的值为 老周。
    • 这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

    案例 2:

    UPDATE student SET s_birth = CASE s_name
    	WHEN '小王' THEN
    		'2019-01-20'
    	WHEN '小周' THEN
    		'2019-01-22'
    END WHERE s_name IN ('小王','小周');
    

    在这里插入图片描述

    三. 删除数据:DELETE

    • 数据库一旦删除数据,它就会永远消失。 因此,在执行DELETE语句之前,应该先备份数据库,以防万一要找回删除过的数据。

    1. 删除指定数据

    语法:DELETE FROM 表名 WHERE 列名=值

    • 注意:删除的时候如果不指定where条件,则保留数据表结构,删除全部数据行,有主外键关系的都删不了

    案例:

    DELETE FROM student WHERE s_id='09'
    

    在这里插入图片描述与 SELECT 语句不同的是,DELETE 语句中不能使用 GROUP BY、 HAVING 和 ORDER BY 三类子句,而只能使用WHERE 子句。原因很简单, GROUP BY 和 HAVING 是从表中选取数据时用来改变抽取数据形式的, 而 ORDER BY 是用来指定取得结果显示顺序的。因此,在删除表中数据 时它们都起不到什么作用。`

    2. 删除表中全部数据

    语法:TRUNCATE 表名;

    • 注意:全部删除,内存无痕迹,如果有自增会重新开始编号。

    • 与 DELETE 不同的是,TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据。也正是因为它不能具体地控制删除对象, 所以其处理速度比 DELETE 要快得多。实际上,DELETE 语句在 DML 语句中也 属于处理时间比较长的,因此需要删除全部数据行时,使用 TRUNCATE 可以缩短 执行时间。

    案例:

    TRUNCATE student1;
    

    在这里插入图片描述


    DQL(Data Query Language)语句:即数据查询语句

    • 查询数据库中的记录,关键字 SELECT,这块内容非常重要!

    一. wherer 条件语句

    语法:select 列名 from 表名 where 列名 =值

    where的作用:

    1. 用于检索数据表中符合条件的记录
    2. 搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

    搜索条件的组成:

    • 算数运算符

    在这里插入图片描述

    • 逻辑操作符(操作符有两种写法)
      在这里插入图片描述
    • 比较运算符

    在这里插入图片描述

    注意:数值数据类型的记录之间才能进行算术运算,相同数据类型的数据之间才能进行比较。

    表数据
    在这里插入图片描述

    案例 1(AND):

    SELECT  * FROM student WHERE s_name ='小王' AND s_sex='男'
    

    在这里插入图片描述
    案例 2(OR):

    SELECT  * FROM student WHERE s_name ='崔丝塔娜' OR s_sex='男'
    

    在这里插入图片描述

    案例 3(NOT):

    SELECT  * FROM student WHERE NOT s_name ='崔丝塔娜' 
    

    在这里插入图片描述
    案例 4(IS NULL):

    SELECT * FROM student WHERE s_name IS NULL;
    

    在这里插入图片描述
    案例 5(IS NOT NULL):

    SELECT * FROM student WHERE s_name IS NOT NULL;
    

    在这里插入图片描述
    案例 6(BETWEEN):

    SELECT * FROM student WHERE s_birth BETWEEN '2019-01-20' AND '2019-01-22'
    

    在这里插入图片描述

    案例 7(LINK):

    SELECT * FROM student WHERE s_name LIKE '小%'
    

    在这里插入图片描述

    案例 8(IN):

    SELECT * FROM student WHERE s_name IN ('小王','小周')
    

    在这里插入图片描述

    二. as 取别名

    • 表里的名字没有变,只影响了查询出来的结果

    案例:

    SELECT s_name as `name` FROM student 
    

    在这里插入图片描述

    • 使用as也可以为表取别名 (作用:单表查询意义不大,但是当多个表的时候取别名就好操作,当不同的表里有相同名字的列的时候区分就会好区分)

    三. distinct 去除重复记录

    • 注意:当查询结果中所有字段全都相同时 才算重复的记录

    案例

    SELECT DISTINCT * FROM student
    

    在这里插入图片描述

    指定字段

    1. 星号表示所有字段
    2. 手动指定需要查询的字段
    SELECT DISTINCT s_name,s_birth FROM student
    

    在这里插入图片描述

    1. 还可也是四则运算
    2. 聚合函数

    四. group by 分组

    • group by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组。

    语法:

    select 字段名 from 表名 group by 字段名称;
    

    1. 单个字段分组

    SELECT COUNT(*)FROM student GROUP BY s_sex;
    

    在这里插入图片描述

    2. 多个字段分组

    SELECT s_name,s_sex,COUNT(*) FROM student GROUP BY s_name,s_sex;
    

    在这里插入图片描述

    • 注意:多个字段进行分组时,需要将s_name和s_sex看成一个整体,只要是s_name和s_sex相同的可以分成一组;如果只是s_sex相同,s_sex不同就不是一组。

    五. having 过滤

    • HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中显示的任意项。

    我们如果要查询男生或者女生,人数大于4的性别

    
    SELECT s_sex as 性别,count(s_id) AS 人数 FROM student GROUP BY s_sex HAVING COUNT(s_id)>4
    

    在这里插入图片描述

    六. order by 排序

    • 根据某个字段排序,默认升序(从小到大)

    语法:

    select * from 表名 order by 字段名;
    

    1. 一个字段,降序(从大到小)

    SELECT * FROM student ORDER BY s_id DESC;
    

    在这里插入图片描述

    2. 多个字段

    SELECT * FROM student ORDER BY s_id DESC, s_birth ASC;
    

    在这里插入图片描述

    • 多个字段 第一个相同在按照第二个 asc 表示升序

    limit 分页

    • 用于限制要显示的记录数量

    语法1:

    select * from table_name limit 个数;
    

    语法2:

    select * from table_name limit 起始位置,个数;
    

    案例:

    • 查询前三条数据
    SELECT * FROM student LIMIT 3;
    

    在这里插入图片描述

    • 从第三条开始 查询3条
    SELECT * FROM student LIMIT 2,3;
    

    在这里插入图片描述

    注意:起始位置 从0开始

    经典的使用场景:分页显示

    1. 每一页显示的条数 a = 3
    2. 明确当前页数 b = 2
    3. 计算起始位置 c = (b-1) * a

    子查询

    • 将一个查询语句的结果作为另一个查询语句的条件或是数据来源,​ 当我们一次性查不到想要数据时就需要使用子查询。
    SELECT
    	* 
    FROM
    	score 
    WHERE
    	s_id =(
    	SELECT
    		s_id 
    	FROM
    		student 
    WHERE
    	s_name = '赵信')
    

    在这里插入图片描述

    1. in 关键字子查询

    • 当内层查询 (括号内的) 结果会有多个结果时, 不能使用 = 必须是in ,另外子查询必须只能包含一列数据

    子查询的思路:

    1. 要分析 查到最终的数据 到底有哪些步骤
    2. 根据步骤写出对应的sql语句
    3. 把上一个步骤的sql语句丢到下一个sql语句中作为条件
    SELECT
    	* 
    FROM
    	score 
    WHERE
    	s_id IN (
    	SELECT
    		s_id 
    	FROM
    		student 
    WHERE
    	s_sex = '男')
    

    在这里插入图片描述

    exists 关键字子查询

    • 当内层查询 有结果时 外层才会执行

    多表查询

    1. 笛卡尔积查询

    • 笛卡尔积查询的结果会出现大量的错误数据即,数据关联关系错误,并且会产生重复的字段信息 !

    2. 内连接查询

    • 本质上就是笛卡尔积查询,inner可以省略。

    在这里插入图片描述

    语法:

    select * from1 inner join2;
    

    3. 左外连接查询

    • 左边的表无论是否能够匹配都要完整显示,右边的仅展示匹配上的记录

    在这里插入图片描述

    • 注意: 在外连接查询中不能使用where 关键字 必须使用on专门来做表的对应关系

    4. 右外连接查询

    • 右边的表无论是否能够匹配都要完整显示,左边的仅展示匹配上的记录

    在这里插入图片描述


    DCL(Data Control Language)语句:即数据控制语句

    • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。

    关键字

    • GRANT
    • REVOKE

    查看用户权限

    当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用SHOW GRANTS FOR语句来查询用户的权限。

    例如:

    mysql> SHOW GRANTS FOR test;
    +-------------------------------------------+
    | Grants for test@%                         |
    +-------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    

    GRANT语句

    • 对于新建的MySQL用户,必须给它授权,可以用GRANT语句来实现对新建用户的授权。

    格式语法

    GRANT
        priv_type [(column_list)]
          [, priv_type [(column_list)]] ...
        ON [object_type] priv_level
        TO user [auth_option] [, user [auth_option]] ...
        [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
        [WITH {GRANT OPTION | resource_option} ...]
    
    GRANT PROXY ON user
        TO user [, user] ...
        [WITH GRANT OPTION]
    
    object_type: {
        TABLE
      | FUNCTION
      | PROCEDURE
    }
    
    priv_level: {
        *
      | *.*
      | db_name.*
      | db_name.tbl_name
      | tbl_name
      | db_name.routine_name
    }
    
    user:
        (see Section 6.2.4, “Specifying Account Names”)
    
    auth_option: {
        IDENTIFIED BY 'auth_string'
      | IDENTIFIED WITH auth_plugin
      | IDENTIFIED WITH auth_plugin BY 'auth_string'
      | IDENTIFIED WITH auth_plugin AS 'auth_string'
      | IDENTIFIED BY PASSWORD 'auth_string'
    }
    
    tls_option: {
        SSL
      | X509
      | CIPHER 'cipher'
      | ISSUER 'issuer'
      | SUBJECT 'subject'
    }
    
    resource_option: {
      | MAX_QUERIES_PER_HOUR count
      | MAX_UPDATES_PER_HOUR count
      | MAX_CONNECTIONS_PER_HOUR count
      | MAX_USER_CONNECTIONS count
    }
    

    权限类型(priv_type)

    • 授权的权限类型一般可以分为数据库、表、列、用户。
    授予数据库权限类型

    授予数据库权限时,priv_type可以指定为以下值:

    • SELECT:表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。
    • INSERT:表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。
    • DELETE:表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。
    • UPDATE:表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。
    • REFERENCES:表示授予用户可以创建指向特定的数据库中的表外键的权限。
    • CREATE:表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。
    • ALTER:表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。
    • SHOW VIEW:表示授予用户可以查看特定数据库中已有视图的视图定义的权限。
    • CREATE ROUTINE:表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。
    • ALTER ROUTINE:表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。
    • INDEX:表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。
    • DROP:表示授予用户可以删除特定数据库中所有表和视图的权限。
    • CREATE TEMPORARY TABLES:表示授予用户可以在特定数据库中创建临时表的权限。
    • CREATE VIEW:表示授予用户可以在特定数据库中创建新的视图的权限。
    • EXECUTE ROUTINE:表示授予用户可以调用特定数据库的存储过程和存储函数的权限。
    • LOCK TABLES:表示授予用户可以锁定特定数据库的已有数据表的权限。
    • SHOW DATABASES:表示授权可以使用SHOW DATABASES语句查看所有已有的数据库的定义的权限。
    • ALL或ALL PRIVILEGES:表示以上所有权限。

    授予表权限类型

    授予表权限时,priv_type可以指定为以下值:

    • SELECT:授予用户可以使用 SELECT 语句进行访问特定表的权限。
    • INSERT:授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限。
    • DELETE:授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限。
    • DROP:授予用户可以删除数据表的权限。
    • UPDATE:授予用户可以使用 UPDATE 语句更新特定数据表的权限。
    • ALTER:授予用户可以使用 ALTER TABLE 语句修改数据表的权限。
    • REFERENCES:授予用户可以创建一个外键来参照特定数据表的权限。
    • CREATE:授予用户可以使用特定的名字创建一个数据表的权限。
    • INDEX:授予用户可以在表上定义索引的权限。
    • ALL或ALL PRIVILEGES:所有的权限名。
    授予列(字段)权限类型
    • 授予列(字段)权限时,priv_type的值只能指定为SELECT、INSERT和UPDATE,同时权限的后面需要加上列名列表(column-list)。
    授予创建和删除用户的权限
    • 授予列(字段)权限时,priv_type的值指定为CREATE USER权限,具备创建用户、删除用户、重命名用户和撤消所有特权,而且是全局的。

    ON

    • 有ON,是授予权限,无ON,是授予角色。如:
    -- 授予数据库db1的所有权限给指定账户
    GRANT ALL ON db1.* TO 'user1'@'localhost';
    -- 授予角色给指定的账户
    GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
    

    对象类型(object_type)

    • 在ON关键字后给出要授予权限的object_type,通常object_type可以是数据库名、表名等。

    权限级别(priv_level)

    指定权限级别的值有以下几类格式:

    • *:表示当前数据库中的所有表。
    • .:表示所有数据库中的所有表。
    • db_name.*:表示某个数据库中的所有表,db_name指定数据库名。
    • db_name.tbl_name:表示某个数据库中的某个表或视图,db_name指定数据库名,tbl_name指定表名或视图名。
    • tbl_name:表示某个表或视图,tbl_name指定表名或视图名。
    • db_name.routine_name:表示某个数据库中的某个存储过程或函数,routine_name指定存储过程名或函数名。

    被授权的用户(user)

    'user_name'@'host_name'
    
    • Tips:'host_name’用于适应从任意主机访问数据库而设置的,可以指定某个地址或地址段访问。
    • 可以同时授权多个用户。

    user表中host列的默认值

    host说明
    %匹配所有主机
    localhostlocalhost不会被解析成IP地址,直接通过UNIXsocket连接
    127.0.0.1会通过TCP/IP协议连接,并且只能在本机访问
    ::1::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1

    host_name格式有以下几种:

    • 使用%模糊匹配,符合匹配条件的主机可以访问该数据库实例,例如192.168.2.%或%.test.com;
    • 使用localhost、127.0.0.1、::1及服务器名等,只能在本机访问;
    • 使用ip地址或地址段形式,仅允许该ip或ip地址段的主机访问该数据库实例,例如192.168.2.1或192.168.2.0/24或192.168.2.0/255.255.255.0;
    • 省略即默认为%。

    身份验证方式(auth_option)

    • auth_option为可选字段,可以指定密码以及认证插件(mysql_native_password、sha256_password、caching_sha2_password)。

    加密连接(tls_option)

    • tls_option为可选的,一般是用来加密连接。

    用户资源限制(resource_option)

    • resource_option为可选的,一般是用来指定最大连接数等。
    参数说明
    MAX_QUERIES_PER_HOUR count每小时最大查询数
    MAX_UPDATES_PER_HOUR count每小时最大更新数
    MAX_CONNECTIONS_PER_HOUR count每小时连接次数
    MAX_USER_CONNECTIONS count用户最大连接数

    权限生效

    • 若要权限生效,需要执行以下语句:
    FLUSH PRIVILEGES;
    

    REVOKE语句

    • REVOKE语句主要用于撤销权限。

    语法格式

    • REVOKE语法和GRANT语句的语法格式相似,但具有相反的效果
    REVOKE
        priv_type [(column_list)]
          [, priv_type [(column_list)]] ...
        ON [object_type] priv_level
        FROM user [, user] ...
    
    REVOKE ALL [PRIVILEGES], GRANT OPTION
        FROM user [, user] ...
    
    REVOKE PROXY ON user
        FROM user [, user] ...
    
    • 若要使用REVOKE语句,必须拥有MySQL数据库的全局CREATE USER权限或UPDATE权限;
    • 第一种语法格式用于回收指定用户的某些特定的权限,第二种回收指定用户的所有权限;

    TCL(Transaction Control Language)语句:事务控制语句

    什么是事物?

    • 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行

    事务的ACID属性

    • 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

    • 一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态

    • 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

    • 持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

    分类

    • 隐式事务:事务没有明显的开启和结束的标记(比如insert,update,delete语句)

    • 显式事务:事务具有明显的开启和结束的标记(autocommit变量设置为0)

    事务的使用步骤

    开启事务

    • 默认开启事务
    SET autocommit = 0 ;
    

    提交事务

    COMMIT;
    

    回滚事务

    ROLLBACK ;
    

    查看当前的事务隔离级别

    select @@tx_isolation;
    

    设置当前连接事务的隔离级别

    set session transaction isolation level read uncommitted;
    

    设置数据库系统的全局的隔离级别

    set global transaction isolation level read committed ;
    

    【常用函数】

    • MySQL提供了众多功能强大、方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求。本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时查看。

    (这里使用 Navicat Premium 15 工具进行演示)

    在这里插入图片描述

    因为内容太多了这里只演示一些常用的在这里插入图片描述

    一. 数学函数

    对数值型的数据进行指定的数学运算,如abs()函数可以获得给定数值的绝对值,round()函数可以对给定的数值进行四舍五入。

    1. ABS(number)

    • 作用:返回 number 的绝对值
    SELECT
     ABS(s_score)
    FROM
    	score;
    

    在这里插入图片描述

    在这里插入图片描述

    • ABS(-86) 返回:86

    • number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。

    2. PI()

    • 例1:pi() 返回:3.141592653589793

    • 例2:pi(2) 返回:6.283185307179586

    • 作用:计算圆周率及其倍数

    3. SQRT(x)

    • 作用:返回非负数的x的二次方根

    4. MOD(x,y)

    • 作用:返回x被y除后的余数

    5. CEIL(x)、CEILING(x)

    • 作用:返回不小于x的最小整数

    6. FLOOR(x)

    • 作用:返回不大于x的最大整数

    7. FLOOR(x)

    • 作用:返回不大于x的最大整数

    8. ROUND(x)、ROUND(x,y)

    • 作用:前者返回最接近于x的整数,即对x进行四舍五入;后者返回最接近x的数,其值保留到小数点后面y位,若y为负值,则将保留到x到小数点左边y位
    SELECT ROUND(345222.9)
    

    在这里插入图片描述

    • 参数说明: numberExp 需要进行截取的数据 nExp 整数,用于指定需要进行截取的位置,>0:从小数点往右位移nExp个位数, <0:从小数点往左

    nExp个位数 =0:表示当前小数点的位置

    9. POW(x,y)和、POWER(x,y)

    • 作用:返回x的y次乘方的值

    10. EXP(x)

    • 作用:返回e的x乘方后的值

    11. LOG(x)

    • 作用:返回x的自然对数,x相对于基数e的对数

    12. LOG10(x)

    • 作用:返回x的基数为10的对数

    13. RADIANS(x)

    • 作用:返回x由角度转化为弧度的值

    14. DEGREES(x)

    • 作用:返回x由弧度转化为角度的值

    15. SIN(x)、ASIN(x)

    • 作用:前者返回x的正弦,其中x为给定的弧度值;后者返回x的反正弦值,x为正弦

    16. COS(x)、ACOS(x)

    • 作用:前者返回x的余弦,其中x为给定的弧度值;后者返回x的反余弦值,x为余弦

    17. TAN(x)、ATAN(x)

    • 作用:前者返回x的正切,其中x为给定的弧度值;后者返回x的反正切值,x为正切

    18. COT(x)

    • 作用:返回给定弧度值x的余切

    二. 字符串函数

    1. CHAR_LENGTH(str)

    • 作用:计算字符串字符个数
    SELECT CHAR_LENGTH('这是一个十二个字的字符串');
    

    在这里插入图片描述

    2. CONCAT(s1,s2,…)

    • 作用:返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL
    SELECT CONCAT('拼接','测试');
    

    在这里插入图片描述

    3. CONCAT_WS(x,s1,s2,…)

    • 作用:返回多个字符串拼接之后的字符串,每个字符串之间有一个x
    SELECT CONCAT_WS('-','测试','拼接','WS') 
    

    在这里插入图片描述

    4. INSERT(s1,x,len,s2)

    • 作用:返回字符串s1,其子字符串起始于位置x,被字符串s2取代len个字符
    SELECT INSERT('测试字符串替换',2,1,'牛');
    

    在这里插入图片描述

    5. LOWER(str)和LCASE(str)、UPPER(str)和UCASE(str)

    • 作用:前两者将str中的字母全部转换成小写,后两者将字符串中的字母全部转换成大写
    SELECT LOWER('JHGYTUGHJGG'),LCASE('HKJHKJHKJHKJ');
    

    在这里插入图片描述

    SELECT UPPER('aaaaaa'),UCASE('vvvvv');
    

    在这里插入图片描述

    6. LEFT(s,n)、RIGHT(s,n)

    • 作用:前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符
    SELECT LEFT('左边开始',2),RIGHT('右边开始',2);
    

    在这里插入图片描述

    7. LPAD(s1,len,s2)、RPAD(s1,len,s2)

    • 作用:前者返回s1,其左边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符;前者返回s1,其右边由字符串s2填补到len字符长度,假如s1的长度大于len,则返回值被缩短至len字符
    SELECT LEFT('左边开始',2),RIGHT('右边开始',2);
    

    在这里插入图片描述

    8. LTRIM(s)、RTRIM(s)

    • 作用:前者返回字符串s,其左边所有空格被删除;后者返回字符串s,其右边所有空格被删除
    SELECT LTRIM('       左边开始'),RTRIM('    右边开始         ');
    

    在这里插入图片描述

    9. TRIM(s)

    • 作用:返回字符串s删除了两边空格之后的字符串
    SELECT TRIM(' 是是 ');
    

    在这里插入图片描述

    10. TRIM(s1 FROM s)

    • 作用:删除字符串s两端所有子字符串s1,未指定s1的情况下则默认删除空格

    11. REPEAT(s,n)

    • 作用:返回一个由重复字符串s组成的字符串,字符串s的数目等于n
    SELECT REPEAT('测试',5);
    

    在这里插入图片描述

    12. SPACE(n)

    • 作用:返回一个由n个空格组成的字符串
    SELECT SPACE(20);
    

    在这里插入图片描述

    13. REPLACE(s,s1,s2)

    • 作用:返回一个字符串,用字符串s2替代字符串s中所有的字符串s1

    14. STRCMP(s1,s2)

    • 作用:若s1和s2中所有的字符串都相同,则返回0;根据当前分类次序,第一个参数小于第二个则返回-1,其他情况返回1
    SELECT STRCMP('我我我','我我我');
    

    在这里插入图片描述

    SELECT STRCMP('我我我','是是是');
    

    在这里插入图片描述

    15. SUBSTRING(s,n,len)、MID(s,n,len)

    • 作用:两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串
    SELECT SUBSTRING('测试测试',2,2);
    

    在这里插入图片描述

    SELECT MID('测试测试',2,2);
    

    在这里插入图片描述

    16. LOCATE(str1,str)、POSITION(str1 IN str)、INSTR(str,str1)

    • 作用:三个函数作用相同,返回子字符串str1在字符串str中的开始位置(从第几个字符开始)
    SELECT LOCATE('字','获取字符串的位置');
    

    在这里插入图片描述

    17. REVERSE(s)

    • 作用:将字符串s反转
    SELECT REVERSE('字符串反转');
    

    在这里插入图片描述

    18. ELT(N,str1,str2,str3,str4,…)

    • 作用:返回第N个字符串
    SELECT ELT(2,'字符串反转','sssss');
    

    在这里插入图片描述

    三. 日期和时间函数

    当前时间
    在这里插入图片描述

    1. CURDATE()、CURRENT_DATE()

    • 作用:将当前日期按照"YYYY-MM-DD"或者"YYYYMMDD"格式的值返回,具体格式根据函数用在字符串或是数字语境中而定

    2. CURRENT_TIMESTAMP()、LOCALTIME()、NOW()、SYSDATE()

    • 作用:这四个函数作用相同,返回当前日期和时间值,格式为"YYYY_MM-DD HH:MM:SS"或"YYYYMMDDHHMMSS",具体格式根据函数用在字符串或数字语境中而定
    SELECT CURRENT_TIMESTAMP()
    

    在这里插入图片描述

    SELECT LOCALTIME()
    

    在这里插入图片描述

    SELECT NOW()
    

    在这里插入图片描述

    SELECT SYSDATE()
    

    在这里插入图片描述

    3. UNIX_TIMESTAMP()、UNIX_TIMESTAMP(date)

    • 作用:前者返回一个格林尼治标准时间1970-01-01 00:00:00到现在的秒数,后者返回一个格林尼治标准时间1970-01-01 00:00:00到指定时间的秒数
    SELECT UNIX_TIMESTAMP()
    

    在这里插入图片描述

    4. FROM_UNIXTIME(date)

    • 作用:和UNIX_TIMESTAMP互为反函数,把UNIX时间戳转换为普通格式的时间

    5. UTC_DATE()和UTC_TIME()

    • 前者返回当前UTC(世界标准时间)日期值,其格式为"YYYY-MM-DD"或"YYYYMMDD",后者返回当前UTC时间值,其格式为"YYYY-MM-DD"或"YYYYMMDD"。具体使用哪种取决于函数用在字符串还是数字语境中
    SELECT UTC_DATE()
    

    在这里插入图片描述

    SELECT UTC_TIME()
    

    在这里插入图片描述

    6. MONTH(date)和MONTHNAME(date)

    • 作用:前者返回指定日期中的月份,后者返回指定日期中的月份的名称
    SELECT MONTH(NOW())
    

    在这里插入图片描述

    SELECT MONTHNAME(NOW())
    

    在这里插入图片描述

    7. DAYNAME(d)、DAYOFWEEK(d)、WEEKDAY(d)

    • 作用:DAYNAME(d)返回d对应的工作日的英文名称,如Sunday、Monday等;DAYOFWEEK(d)返回的对应一周中的索引,1表示周日、2表示周一;WEEKDAY(d)表示d对应的工作日索引,0表示周一,1表示周二

    8. WEEK(d)

    • 计算日期d是一年中的第几周
    SELECT WEEK(NOW())
    

    在这里插入图片描述

    9. DAYOFYEAR(d)、DAYOFMONTH(d)

    • 作用:前者返回d是一年中的第几天,后者返回d是一月中的第几天
    SELECT DAYOFYEAR(NOW())
    

    在这里插入图片描述

    SELECT DAYOFMONTH(NOW())
    

    在这里插入图片描述

    10. YEAR(date)、QUARTER(date)、MINUTE(time)、SECOND(time)

    • 作用: YEAR(date)返回指定日期对应的年份,范围是1970~2069;QUARTER(date)返回date对应一年中的季度,范围是1~4;MINUTE(time)返回time对应的分钟数,范围是0~59;SECOND(time)返回制定时间的秒值
    SELECT YEAR(NOW())
    

    在这里插入图片描述

    SELECT QUARTER(NOW())
    

    在这里插入图片描述

    SELECT MINUTE(NOW())
    

    在这里插入图片描述

    SELECT SECOND(NOW())
    

    在这里插入图片描述

    11. EXTRACE(type FROM date)

    • 作用:从日期中提取一部分,type可以是YEAR、YEAR_MONTH、DAY_HOUR、DAY_MICROSECOND、DAY_MINUTE、DAY_SECOND

    12. TIME_TO_SEC(time)

    • 作用:返回以转换为秒的time参数,转换公式为"3600小时 + 60分钟 + 秒"
    SELECT TIME_TO_SEC(NOW())
    

    在这里插入图片描述

    13. SEC_TO_TIME()

    • 作用:和TIME_TO_SEC(time)互为反函数,将秒值转换为时间格式
    SELECT SEC_TO_TIME(530)
    

    在这里插入图片描述

    14. DATE_ADD(date,INTERVAL expr type)、ADD_DATE(date,INTERVAL expr type)

    • 作用:返回将起始时间加上expr type之后的时间,比如DATE_ADD(‘2010-12-31 23:59:59’, INTERVAL 1 SECOND)表示的就是把第一个时间加1秒

    15. DATE_SUB(date,INTERVAL expr type)、SUBDATE(date,INTERVAL expr type)

    • 作用:返回将起始时间减去expr type之后的时间

    16. ADDTIME(date,expr)、SUBTIME(date,expr)

    • 作用:前者进行date的时间加操作,后者进行date的时间减操作

    四. 条件判断函数

    1. IF(expr,v1,v2)

    • 作用:如果expr是TRUE则返回v1,否则返回v2

    2. IFNULL(v1,v2)

    • 作用:如果v1不为NULL,则返回v1,否则返回v2

    3. CASE expr WHEN v1 THEN r1 [WHEN v2 THEN v2] [ELSE rn] END

    • 作用:如果expr等于某个vn,则返回对应位置THEN后面的结果,如果与所有值都不想等,则返回ELSE后面的rn

    五. 系统信息函数

    1. VERSION()

    • 作用:查看MySQL版本号
    SELECT VERSION()
    

    在这里插入图片描述

    2. CONNECTION_ID()

    • 作用:查看当前用户的连接数
    SELECT CONNECTION_ID()
    

    在这里插入图片描述

    3. USER()、CURRENT_USER()、SYSTEM_USER()、SESSION_USER()

    • 作用:查看当前被MySQL服务器验证的用户名和主机的组合,一般这几个函数的返回值是相同的
    SELECT USER()
    

    在这里插入图片描述

    SELECT CURRENT_USER()
    

    在这里插入图片描述

    SELECT SYSTEM_USER()
    

    在这里插入图片描述

    SELECT SESSION_USER()
    

    在这里插入图片描述

    4. CHARSET(str)

    • 作用:查看字符串str使用的字符集
    SELECT CHARSET(555)
    

    在这里插入图片描述

    5. COLLATION()

    • 作用:查看字符串排列方式
    
    SELECT COLLATION('sssfddsfds')
    

    在这里插入图片描述

    六. 加密函数

    1. PASSWORD(str)

    • 作用:从原明文密码str计算并返回加密后的字符串密码,注意这个函数的加密是单向的(不可逆),因此不应将它应用在个人的应用程序中而应该只在MySQL服务器的鉴定系统中使用
    SELECT PASSWORD('mima')
    

    在这里插入图片描述

    2. MD5(str)

    • 作用:为字符串算出一个MD5 128比特校验和,改值以32位十六进制数字的二进制字符串形式返回
    SELECT MD5('mima')
    

    在这里插入图片描述

    3. ENCODE(str, pswd_str)

    • 作用:使用pswd_str作为密码,加密str
    SELECT ENCODE('fdfdz','mima')
    

    在这里插入图片描述

    4. DECODE(crypt_str,pswd_str)

    • 作用:使用pswd_str作为密码,解密加密字符串crypt_str,crypt_str是由ENCODE函数返回的字符串
    SELECT DECODE('fdfdz','mima')
    

    在这里插入图片描述

    七. 其他函数

    1. FORMAT(x,n)

    • 作用:将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串形式返回
    SELECT FORMAT(446.454,2)
    

    在这里插入图片描述

    2. CONV(N,from_base,to_base)

    • 作用:不同进制数之间的转换,返回值为数值N的字符串表示,由from_base进制转换为to_base进制

    3. INET_ATON(expr)

    • 作用:给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数,地址可以使4或8比特

    4. INET_NTOA(expr)

    • 作用:给定一个数字网络地址(4或8比特),返回作为字符串的该地址的点地址表示

    5. BENCHMARK(count,expr)

    • 作用:重复执行count次表达式expr,它可以用于计算MySQL处理表达式的速度,结果值通常是0(0只是表示很快,并不是没有速度)。
    • 另一个作用是用它在MySQL客户端内部报告语句执行的时间

    6. CONVERT(str USING charset)

    • 作用:使用字符集charset表示字符串str

    更多用法还请参考:http://www.geezn.com/documents/gez/help/117555-1355219868404378.html

    在这里插入图片描述

    【SQL实战练习】

    • 题目来自互联网,建议每道题都在本地敲一遍巩固记忆 !

    创建数据库

    在这里插入图片描述

    创建表(并初始化数据)

    -- 学生表
    CREATE TABLE `student`(
    `s_id` VARCHAR(20),
    `s_name` VARCHAR(20) NOT NULL DEFAULT '',
    `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
    `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY(`s_id`)
    );
    -- 课程表
    CREATE TABLE `course`(
    `c_id` VARCHAR(20),
    `c_name` VARCHAR(20) NOT NULL DEFAULT '',
    `t_id` VARCHAR(20) NOT NULL,
    PRIMARY KEY(`c_id`)
    );
    -- 教师表
    CREATE TABLE `teacher`(
    `t_id` VARCHAR(20),
    `t_name` VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(`t_id`)
    );
    -- 成绩表
    CREATE TABLE `score`(
    `s_id` VARCHAR(20),
    `c_id` VARCHAR(20),
    `s_score` INT(3),
    PRIMARY KEY(`s_id`,`c_id`)
    );
    
    -- 插入学生表测试数据
    insert into student values('01' , '赵信' , '1990-01-01' , '男');
    insert into student values('02' , '德莱厄斯' , '1990-12-21' , '男');
    insert into student values('03' , '艾希' , '1990-05-20' , '男');
    insert into student values('04' , '德莱文' , '1990-08-06' , '男');
    insert into student values('05' , '俄洛依' , '1991-12-01' , '女');
    insert into student values('06' , '光辉女郎' , '1992-03-01' , '女');
    insert into student values('07' , '崔丝塔娜' , '1989-07-01' , '女');
    insert into student values('08' , '安妮' , '1990-01-20' , '女');
    -- 课程表测试数据
    insert into course values('01' , '语文' , '02');
    insert into course values('02' , '数学' , '01');
    insert into course values('03' , '英语' , '03');
    
    -- 教师表测试数据
    insert into teacher values('01' , '死亡歌颂者');
    insert into teacher values('02' , '流浪法师');
    insert into teacher values('03' , '邪恶小法师');
    
    -- 成绩表测试数据
    insert into score values('01' , '01' , 80);
    insert into score values('01' , '02' , 90);
    insert into score values('01' , '03' , 99);
    insert into score values('02' , '01' , 70);
    insert into score values('02' , '02' , 60);
    insert into score values('02' , '03' , 80);
    insert into score values('03' , '01' , 80);
    insert into score values('03' , '02' , 80);
    insert into score values('03' , '03' , 80);
    insert into score values('04' , '01' , 50);
    insert into score values('04' , '02' , 30);
    insert into score values('04' , '03' , 20);
    insert into score values('05' , '01' , 76);
    insert into score values('05' , '02' , 87);
    insert into score values('06' , '01' , 31);
    insert into score values('06' , '03' , 34);
    insert into score values('07' , '02' , 89);
    insert into score values('07' , '03' , 98);
    

    表结构

    • 这里建的表主要用于sql语句的练习,所以并没有遵守一些规范。下面让我们来看看相关的表结构吧

    学生表(student)

    在这里插入图片描述

    • s_id = 学生编号,s_name = 学生姓名,s_birth = 出生年月,s_sex = 学生性别

    课程表(course)

    在这里插入图片描述

    • c_id = 课程编号,c_name = 课程名称,t_id = 教师编号

    教师表(teacher)

    在这里插入图片描述

    • t_id = 教师编号,t_name = 教师姓名

    成绩表(score)

    在这里插入图片描述

    • s_id = 学生编号,c_id = 课程编号,s_score = 分数

    习题

    • 开始之前我们先来看看四张表中的数据。

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    1. 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    SELECT
    	st.*,
    	sc.s_score AS '语文',
    	sc2.s_score '数学' 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.c_id = '01'
    	LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    	AND sc2.c_id = '02'
    

    在这里插入图片描述

    2. 查询"01"课程比"02"课程成绩低的学生的信息及课程分数

    SELECT
    	st.*,
    	s.s_score AS 数学,
    	s2.s_score AS 语文 
    FROM
    	student st
    	LEFT JOIN score s ON s.s_id = st.s_id 
    	AND s.c_id = '01'
    	LEFT JOIN score s2 ON s2.s_id = st.s_id 
    	AND s2.c_id = '02' 
    WHERE
    	s.s_score < s2.s_score
    

    在这里插入图片描述

    3. 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

    SELECT
    	st.s_id AS '学生编号',
    	st.s_name AS '学生姓名',
    	AVG( s.s_score ) AS avgScore 
    FROM
    	student st
    	LEFT JOIN score s ON st.s_id = s.s_id 
    GROUP BY
    	st.s_id 
    HAVING
    	avgScore >= 60
    

    在这里插入图片描述

    4. 查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    • (包括有成绩的和无成绩的)
    SELECT
    	st.s_id AS '学生编号',
    	st.s_name AS '学生姓名',(
    	CASE
    			
    			WHEN ROUND( AVG( sc.s_score ), 2 ) IS NULL THEN
    			0 ELSE ROUND( AVG( sc.s_score ), 2 ) 
    		END 
    		) 
    	FROM
    		student st
    		LEFT JOIN score sc ON st.s_id = sc.s_id 
    	GROUP BY
    		st.s_id 
    	HAVING
    	AVG( sc.s_score )< 60 
    	OR AVG( sc.s_score ) IS NULL
    

    在这里插入图片描述

    5. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

    SELECT
    	st.s_id AS '学生编号',
    	st.s_name AS '学生姓名',
    	COUNT( sc.c_id ) AS '选课总数',
    	sum( CASE WHEN sc.s_score IS NULL THEN 0 ELSE sc.s_score END ) AS '总成绩' 
    FROM
    	student st
    	LEFT JOIN score sc ON st.s_id = sc.s_id 
    GROUP BY
    	st.s_id
    

    在这里插入图片描述

    6. 查询"流"姓老师的数量

    SELECT COUNT(t_id) FROM teacher WHERE t_name LIKE '流%'
    

    在这里插入图片描述

    7. 查询学过"流浪法师"老师授课的同学的信息

    SELECT
    	st.* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id
    	LEFT JOIN course cs ON cs.c_id = sc.c_id
    	LEFT JOIN teacher tc ON tc.t_id = cs.t_id 
    	WHERE tc.t_name = '流浪法师'
    

    在这里插入图片描述

    8. 查询没学过"张三"老师授课的同学的信息

    -- 查询流浪法师教的课
    SELECT
    	cs.* 
    FROM
    	course cs
    	LEFT JOIN teacher tc ON tc.t_id = cs.t_id 
    WHERE
    	tc.t_name = '流浪法师'
    
    
    
    -- 查询有流浪法师课程成绩的学生id
    SELECT
    	sc.s_id 
    FROM
    	score sc 
    WHERE
    	sc.c_id IN (
    	SELECT
    		cs.c_id 
    	FROM
    		course cs
    		LEFT JOIN teacher tc ON tc.t_id = cs.t_id 
    	WHERE
    	tc.t_name = '流浪法师')
    
    
    
    -- 取反,查询没有学过流浪法师课程的同学信息
    SELECT
    	st.* 
    FROM
    	student st 
    WHERE
    	st.s_id NOT IN (
    	SELECT
    		sc.s_id 
    	FROM
    		score sc 
    	WHERE
    	sc.c_id IN ( SELECT cs.c_id FROM course cs LEFT JOIN teacher tc ON tc.t_id = cs.t_id WHERE tc.t_name = '流浪法师' ) 
    	)
    

    在这里插入图片描述

    9. 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

    • 方法 1
    -- 查询学过编号为01课程的同学id
    SELECT
    	st.s_id 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id
    	INNER JOIN course cs ON cs.c_id = sc.c_id 
    	AND cs.c_id = '01';
    	
    	
    
    -- 查询学过编号为02课程的同学id
    SELECT
    	st2.s_id 
    FROM
    	student st2
    	INNER JOIN score sc2 ON sc2.s_id = st2.s_id
    	INNER JOIN course cs2 ON cs2.c_id = sc2.c_id 
    	AND cs2.c_id = '02';
    	
    	
    
    -- 查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
    SELECT
    	st.* 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id
    	INNER JOIN course cs ON cs.c_id = sc.c_id 
    	AND sc.c_id = '01' 
    WHERE
    	st.s_id IN (
    	SELECT
    		st2.s_id 
    	FROM
    		student st2
    		INNER JOIN score sc2 ON sc2.s_id = st2.s_id
    		INNER JOIN course cs2 ON cs2.c_id = sc2.c_id 
    		AND cs2.c_id = '02' 
    	);
    

    在这里插入图片描述

    • 方法 2
    SELECT
    	a.* 
    FROM
    	student a,
    	score b,
    	score c 
    WHERE
    	a.s_id = b.s_id 
    	AND a.s_id = c.s_id 
    	AND b.c_id = '01' 
    	AND c.c_id = '02';
    

    在这里插入图片描述

    10. 查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

    SELECT
    	st.s_id 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id
    	INNER JOIN course cs ON cs.c_id = sc.c_id 
    	AND cs.c_id = '01' 
    WHERE
    	st.s_id NOT IN (
    	SELECT
    		st.s_id 
    	FROM
    		student st
    		INNER JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course cs ON cs.c_id = sc.c_id 
    		AND cs.c_id = '02' 
    	);
    

    在这里插入图片描述

    11. 查询没有学全所有课程的同学的信息

    • 方法 1
    SELECT
    	* 
    FROM
    	student 
    WHERE
    	s_id NOT IN (
    	SELECT
    		st.s_id 
    	FROM
    		student st
    		INNER JOIN score sc ON sc.s_id = st.s_id 
    		AND sc.c_id = '01' 
    	WHERE
    		st.s_id IN (
    		SELECT
    			st.s_id 
    		FROM
    			student st
    			INNER JOIN score sc ON sc.s_id = st.s_id 
    			AND sc.c_id = '02' 
    		WHERE
    			st.s_id 
    		) 
    		AND st.s_id IN (
    		SELECT
    			st.s_id 
    		FROM
    			student st
    			INNER JOIN score sc ON sc.s_id = st.s_id 
    			AND sc.c_id = '03' 
    		WHERE
    			st.s_id 
    		) 
    	);
    

    在这里插入图片描述

    • 方法 2
    SELECT
    	a.* 
    FROM
    	student a
    	LEFT JOIN score b ON a.s_id = b.s_id 
    GROUP BY
    	a.s_id 
    HAVING
    	COUNT( b.c_id ) != '3';
    

    在这里插入图片描述

    12. 查询至少有一门课与学号为"01"的同学所学相同的同学的信息

    SELECT DISTINCT
    	st.* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    WHERE
    	sc.c_id IN ( SELECT sc2.c_id FROM student st2 LEFT JOIN score sc2 ON sc2.s_id = st2.s_id WHERE st2.s_id = '01' );
    

    在这里插入图片描述

    13. 查询和"01"号的同学学习的课程完全相同的其他同学的信息

    SELECT
    	st.* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    HAVING
    	GROUP_CONCAT( sc.c_id )=(
    	SELECT
    		GROUP_CONCAT( sc2.c_id ) 
    	FROM
    		student st2
    		LEFT JOIN score sc2 ON sc2.s_id = st2.s_id 
    	WHERE
    		st2.s_id = '01' 
    	);
    

    在这里插入图片描述

    14. 查询没学过"邪恶小法师"老师讲授的任一门课程的学生姓名

    SELECT
    	* 
    FROM
    	student 
    WHERE
    	s_id NOT IN (
    	SELECT
    		sc.s_id 
    	FROM
    		score sc
    		INNER JOIN course cs ON cs.c_id = sc.c_id
    	INNER JOIN teacher t ON t.t_id = cs.t_id 
    	AND t.t_name = '邪恶小法师');
    

    在这里插入图片描述

    15. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

    SELECT
    	st.s_id AS '学号',
    	st.s_name AS '姓名',
    	AVG( sc.s_score ) AS '平均成绩' 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    WHERE
    	sc.s_id IN (
    	SELECT
    		sc.s_id 
    	FROM
    		score sc 
    	WHERE
    		sc.s_score < 60 
    		OR sc.s_score IS NULL 
    	GROUP BY
    		sc.s_id 
    	HAVING
    		COUNT( 1 )>= 2 
    	) 
    GROUP BY
    	st.s_id
    

    在这里插入图片描述

    16. 检索"01"课程分数小于60,按分数降序排列的学生信息

    SELECT
    	st.* 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.c_id = '01' 
    	AND sc.s_score < '60' 
    ORDER BY
    	sc.s_score DESC;
    	
    	
    SELECT
    	st.* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    WHERE
    	sc.c_id = '01' 
    	AND sc.s_score < '60' 
    ORDER BY
    	sc.s_score DESC;
    

    在这里插入图片描述

    17. 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

    • 方法 1
    SELECT
    	st.*,
    	AVG( sc4.s_score ) AS '平均分',
    	sc.s_score AS '语文',
    	sc2.s_score AS '数学',
    	sc3.s_score AS '英语' 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.c_id = '01'
    	LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    	AND sc2.c_id = '02'
    	LEFT JOIN score sc3 ON sc3.s_id = st.s_id 
    	AND sc3.c_id = '03'
    	LEFT JOIN score sc4 ON sc4.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    ORDER BY
    	AVG( sc4.s_score ) DESC;
    

    在这里插入图片描述

    • 方法 2
    SELECT
    	st.*,
    	( CASE WHEN AVG( sc4.s_score ) IS NULL THEN 0 ELSE AVG( sc4.s_score ) END ) AS '平均分',
    	( CASE WHEN sc.s_score IS NULL THEN 0 ELSE sc.s_score END ) AS '语文',
    	( CASE WHEN sc2.s_score IS NULL THEN 0 ELSE sc2.s_score END ) AS '数学',
    	( CASE WHEN sc3.s_score IS NULL THEN 0 ELSE sc3.s_score END ) AS '英语' 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.c_id = '01'
    	LEFT JOIN score sc2 ON sc2.s_id = st.s_id 
    	AND sc2.c_id = '02'
    	LEFT JOIN score sc3 ON sc3.s_id = st.s_id 
    	AND sc3.c_id = '03'
    	LEFT JOIN score sc4 ON sc4.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    ORDER BY
    	AVG( sc4.s_score ) DESC;
    

    在这里插入图片描述

    18. 查询各科成绩最高分、最低分和平均分:

    • 以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
    • 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    SELECT
    	cs.c_id,
    	cs.c_name,
    	MAX( sc1.s_score ) AS '最高分',
    	MIN( sc2.s_score ) AS '最低分',
    	AVG( sc3.s_score ) AS '平均分',
    	((
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			s_score >= 60 
    			AND c_id = cs.c_id 
    			)/(
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			c_id = cs.c_id 
    		)) AS '及格率',
    	((
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			s_score >= 70 
    			AND s_score < 80 
    			AND c_id = cs.c_id 
    			)/(
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			c_id = cs.c_id 
    		)) AS '中等率',
    	((
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			s_score >= 80 
    			AND s_score < 90 
    			AND c_id = cs.c_id 
    			)/(
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			c_id = cs.c_id 
    		)) AS '优良率',
    	((
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			s_score >= 90 
    			AND c_id = cs.c_id 
    			)/(
    		SELECT
    			COUNT( s_id ) 
    		FROM
    			score 
    		WHERE
    			c_id = cs.c_id 
    		)) AS '优秀率' 
    FROM
    	course cs
    	LEFT JOIN score sc1 ON sc1.c_id = cs.c_id
    	LEFT JOIN score sc2 ON sc2.c_id = cs.c_id
    	LEFT JOIN score sc3 ON sc3.c_id = cs.c_id 
    GROUP BY
    	cs.c_id;
    

    在这里插入图片描述

    19. 按各科成绩进行排序,并显示排名(实现不完全)

    • mysql没有rank函数
    • 加@score是为了防止用union all 后打乱了顺序
    SELECT
    	c1.s_id,
    	c1.c_id,
    	c1.c_name,
    	@score := c1.s_score,
    	@i := @i + 1 
    FROM
    	(
    	SELECT
    		c.c_name,
    		sc.* 
    	FROM
    		course c
    		LEFT JOIN score sc ON sc.c_id = c.c_id 
    	WHERE
    		c.c_id = "01" 
    	ORDER BY
    		sc.s_score DESC 
    	) c1,
    	( SELECT @i := 0 ) a UNION ALL
    SELECT
    	c2.s_id,
    	c2.c_id,
    	c2.c_name,
    	c2.s_score,
    	@ii := @ii + 1 
    FROM
    	(
    	SELECT
    		c.c_name,
    		sc.* 
    	FROM
    		course c
    		LEFT JOIN score sc ON sc.c_id = c.c_id 
    	WHERE
    		c.c_id = "02" 
    	ORDER BY
    		sc.s_score DESC 
    	) c2,
    	( SELECT @ii := 0 ) aa UNION ALL
    SELECT
    	c3.s_id,
    	c3.c_id,
    	c3.c_name,
    	c3.s_score,
    	@iii := @iii + 1 
    FROM
    	(
    	SELECT
    		c.c_name,
    		sc.* 
    	FROM
    		course c
    		LEFT JOIN score sc ON sc.c_id = c.c_id 
    	WHERE
    		c.c_id = "03" 
    	ORDER BY
    		sc.s_score DESC 
    	) c3;
    
    SET @iii = 0;
    

    在这里插入图片描述

    20. 查询学生的总成绩并进行排名

    SELECT
    	st.s_id,
    	st.s_name,
    	( CASE WHEN sum( sc.s_score ) IS NULL THEN 0 ELSE SUM( sc.s_score ) END ) 
    FROM
    	student st
    	LEFT JOIN score sc ON st.s_id = sc.s_id 
    GROUP BY
    	st.s_id 
    ORDER BY
    	SUM( sc.s_score ) DESC
    

    在这里插入图片描述

    21. 查询不同老师所教不同课程平均分从高到低显示

    SELECT
    	t.t_id,
    	t.t_name,
    	AVG( sc.s_score ) 
    FROM
    	teacher t
    	LEFT JOIN course c ON c.t_id = t.t_id
    	LEFT JOIN score sc ON sc.c_id = c.c_id 
    GROUP BY
    	t.t_id 
    ORDER BY
    	AVG( sc.s_score ) DESC
    

    在这里插入图片描述

    22. 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

    SELECT
    	a.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON sc.c_id = c.c_id 
    		AND c.c_id = '01' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 1,
    		2 
    	) a UNION ALL
    SELECT
    	b.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '02' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 1,
    		2 
    	) b UNION ALL
    SELECT
    	c.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '03' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 1,
    		2 
    	) c;
    

    在这里插入图片描述

    23. 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比

    SELECT
    	c.c_id,
    	c.c_name,
    	(
    	SELECT
    		COUNT( 1 ) 
    	FROM
    		score sc 
    	WHERE
    		sc.c_id = c.c_id 
    		AND sc.s_score <= 100 AND sc.s_score > 80 
    		)/(
    	SELECT
    		COUNT( 1 ) 
    	FROM
    		score sc 
    	WHERE
    		sc.c_id = c.c_id 
    	) AS '100-85',
    	((
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    			AND sc.s_score <= 85 AND sc.s_score > 70 
    			)/(
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    		)) AS '85-70',
    	((
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    			AND sc.s_score <= 70 AND sc.s_score > 60 
    			)/(
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    		)) AS '70-60',
    	((
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    			AND sc.s_score <= 60 AND sc.s_score >= 0 
    			)/(
    		SELECT
    			COUNT( 1 ) 
    		FROM
    			score sc 
    		WHERE
    			sc.c_id = c.c_id 
    		)) AS '85-70' 
    FROM
    	course c 
    ORDER BY
    	c.c_id 
    

    在这里插入图片描述

    24. 查询学生平均成绩及其名次

    SET @i = 0;
    SELECT
    	a.*,
    	@i := @i + 1 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		round( CASE WHEN AVG( sc.s_score ) IS NULL THEN 0 ELSE AVG( sc.s_score ) END, 2 ) AS agvScore 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id 
    	GROUP BY
    		st.s_id 
    	ORDER BY
    		agvScore DESC 
    	) a
    

    在这里插入图片描述

    25. 查询各科成绩前三名的记录

    SELECT
    	a.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '01' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    		3 
    	) a UNION ALL
    SELECT
    	b.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '02' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    		3 
    	) b UNION ALL
    SELECT
    	c.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_id,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '03' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    		3 
    	) c
    

    在这里插入图片描述

    26. 查询每门课程被选修的学生数

    SELECT
    	c.c_id,
    	c.c_name,
    	COUNT( 1 ) 
    FROM
    	course c
    	LEFT JOIN score sc ON sc.c_id = c.c_id
    	INNER JOIN student st ON st.s_id = c.c_id 
    GROUP BY
    	c.c_id
    

    在这里插入图片描述

    27. 查询出只有两门课程的全部学生的学号和姓名

    SELECT
    	st.s_id,
    	st.s_name 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id
    	INNER JOIN course c ON c.c_id = sc.c_id 
    GROUP BY
    	st.s_id 
    HAVING
    	COUNT( 1 ) = 2
    

    在这里插入图片描述

    28. 查询男生、女生人数

    SELECT s_sex, COUNT(1) FROM student GROUP BY s_sex
    

    在这里插入图片描述

    29. 查询名字中含有"德"字的学生信息

    SELECT * FROM student WHERE s_name LIKE '%德%'
    

    在这里插入图片描述

    30. 查询同名同性学生名单,并统计同名人数

    select st.s_name,st.s_sex,count(1) from student st group by st.s_name,st.s_sex having count(1)>1
    

    在这里插入图片描述

    31. 查询1990年出生的学生名单

    SELECT st.* FROM student st WHERE st.s_birth LIKE '1990%';
    

    在这里插入图片描述

    32. 查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

    SELECT
    	c.c_id,
    	c_name,
    	AVG( sc.s_score ) AS scoreAvg 
    FROM
    	course c
    	INNER JOIN score sc ON sc.c_id = c.c_id 
    GROUP BY
    	c.c_id 
    ORDER BY
    	scoreAvg DESC,
    	c.c_id ASC;
    

    在这里插入图片描述

    33. 查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩

    SELECT
    	st.s_id,
    	st.s_name,
    	( CASE WHEN AVG( sc.s_score ) IS NULL THEN 0 ELSE AVG( sc.s_score ) END ) scoreAvg 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    HAVING
    	scoreAvg > '85';
    

    在这里插入图片描述

    34. 查询课程名称为"数学",且分数低于60的学生姓名和分数

    SELECT
    	* 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.s_score < 60
    	INNER JOIN course c ON c.c_id = sc.c_id 
    	AND c.c_name = '数学';
    

    在这里插入图片描述

    35. 查询所有学生的课程及分数情况

    SELECT
    	* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id
    	LEFT JOIN course c ON c.c_id = sc.c_id 
    ORDER BY
    	st.s_id,
    	c.c_name;
    

    在这里插入图片描述

    36. 查询任何一门课程成绩在70分以上的姓名、课程名称和分数

    SELECT
    	st.s_id,st.s_name,c.c_name,sc.s_score 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id
    	LEFT JOIN course c ON c.c_id = sc.c_id 
    WHERE
    	st.s_id IN (
    	SELECT
    		st2.s_id 
    	FROM
    		student st2
    		LEFT JOIN score sc2 ON sc2.s_id = st2.s_id 
    	GROUP BY
    		st2.s_id 
    	HAVING
    		MIN( sc2.s_score )>= 70 
    	ORDER BY
    	st2.s_id 
    	)
    

    在这里插入图片描述

    37. 查询不及格的课程

    SELECT
    	st.s_id,
    	c.c_name,
    	st.s_name,
    	sc.s_score 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.s_score < 60
    	INNER JOIN course c ON c.c_id = sc.c_id
    

    在这里插入图片描述

    38. 查询课程编号为01且课程成绩在80分以上的学生的学号和姓名

    SELECT
    	st.s_id,
    	st.s_name,
    	sc.s_score 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id 
    	AND sc.c_id = '01' 
    	AND sc.s_score >= 80;
    

    在这里插入图片描述

    39. 求每门课程的学生人数

    SELECT
    	c.c_id,
    	c.c_name,
    	COUNT( 1 ) 
    FROM
    	course c
    	INNER JOIN score sc ON sc.c_id = c.c_id 
    GROUP BY
    	c.c_id;
    

    在这里插入图片描述

    40. 查询选修"死亡歌颂者"老师所授课程的学生中,成绩最高的学生信息及其成绩

    SELECT
    	st.*,
    	sc.s_score 
    FROM
    	student st
    	INNER JOIN score sc ON sc.s_id = st.s_id
    	INNER JOIN course c ON c.c_id = sc.c_id
    	INNER JOIN teacher t ON t.t_id = c.t_id 
    	AND t.t_name = '死亡歌颂者' 
    ORDER BY
    	sc.s_score DESC 
    	LIMIT 0,1;
    

    在这里插入图片描述

    41. 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    SELECT
    	st.s_id,
    	st.s_name,
    	sc.c_id,
    	sc.s_score 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id
    	LEFT JOIN course c ON c.c_id = sc.c_id 
    WHERE
    	(
    	SELECT
    		COUNT( 1 ) 
    	FROM
    		student st2
    		LEFT JOIN score sc2 ON sc2.s_id = st2.s_id
    		LEFT JOIN course c2 ON c2.c_id = sc2.c_id 
    	WHERE
    		sc.s_score = sc2.s_score 
    	AND c.c_id != c2.c_id 
    	)>1;
    

    在这里插入图片描述

    42. 查询每门功成绩最好的前两名

    SELECT
    	a.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '01' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    		2 
    	) a UNION ALL
    SELECT
    	b.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '02' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    		2 
    	) b UNION ALL
    SELECT
    	c.* 
    FROM
    	(
    	SELECT
    		st.s_id,
    		st.s_name,
    		c.c_name,
    		sc.s_score 
    	FROM
    		student st
    		LEFT JOIN score sc ON sc.s_id = st.s_id
    		INNER JOIN course c ON c.c_id = sc.c_id 
    		AND c.c_id = '03' 
    	ORDER BY
    		sc.s_score DESC 
    		LIMIT 0,
    	2 
    	) c;
    

    在这里插入图片描述

    写法 2

    SELECT
    	a.s_id,
    	a.c_id,
    	a.s_score 
    FROM
    	score a 
    WHERE
    	( SELECT COUNT( 1 ) FROM score b WHERE b.c_id = a.c_id AND b.s_score > a.s_score ) <= 2 
    ORDER BY
    	a.c_id;
    

    在这里插入图片描述

    43. 统计每门课程的学生选修人数(超过5人的课程才统计)

    • 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
    SELECT
    	c.c_id,
    	COUNT( 1 ) 
    FROM
    	score sc
    	LEFT JOIN course c ON c.c_id = sc.c_id 
    GROUP BY
    	c.c_id 
    HAVING
    	COUNT( 1 ) > 5 
    ORDER BY
    	COUNT( 1 ) DESC,
    	c.c_id ASC;
    

    在这里插入图片描述

    44. 检索至少选修两门课程的学生学号

    SELECT
    	st.s_id 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    HAVING
    	COUNT( 1 )>= 2;
    

    在这里插入图片描述

    45. 查询选修了全部课程的学生信息

    SELECT
    	st.* 
    FROM
    	student st
    	LEFT JOIN score sc ON sc.s_id = st.s_id 
    GROUP BY
    	st.s_id 
    HAVING
    	COUNT( 1 )=(
    	SELECT
    		COUNT( 1 ) 
    FROM
    	course)
    

    在这里插入图片描述

    46. 查询各学生的年龄

    SELECT
    	st.*,
    	TIMESTAMPDIFF(
    		YEAR,
    		st.s_birth,
    	NOW()) 
    FROM
    	student st
    

    在这里插入图片描述

    47. 查询本周过生日的学生

    SELECT
    	st.* 
    FROM
    	student st 
    WHERE
    	WEEK (
    	NOW())+ 1 = WEEK (
    	DATE_FORMAT( st.s_birth, '%Y%m%d' ))
    

    在这里插入图片描述

    48. 查询下周过生日的学生

    SELECT
    	st.* 
    FROM
    	student st 
    WHERE
    	WEEK (
    		NOW())+ 1 = WEEK (
    	DATE_FORMAT( st.s_birth, '%Y%m%d' ));
    

    在这里插入图片描述

    49. 查询本月过生日的学生

    SELECT
    	st.* 
    FROM
    	student st 
    WHERE
    	MONTH (
    	NOW())= MONTH (
    	DATE_FORMAT( st.s_birth, '%Y%m%d' ));
    

    在这里插入图片描述

    50. 查询下月过生日的学生

    SELECT
    	st.* 
    FROM
    	student st 
    WHERE
    	MONTH (
    		TIMESTAMPADD(
    			MONTH,
    			1,
    		NOW()))= MONTH (
    	DATE_FORMAT( st.s_birth, '%Y%m%d' ));
    

    在这里插入图片描述


    【阿里巴巴开发手册】

    在这里插入图片描述

    点击预览在线版: 阿里巴巴开发手册


    内容偏向基础适合各个阶段人员的学习与巩固,如果对您还有些帮助希望给博主点个赞在这里插入图片描述支持一下,感谢!

    展开全文
  • 如何用3天时间快速摸清一个行业

    千次阅读 2021-02-18 11:50:40
    本文分为四个部分: 1.为什么要周内了解个行业? 2.要摸清那些核心因素? 3.如何针对性地了解核心要素? 4.比快速了解行业更重要的事。 、 为什么要周内了解个行业? 优秀的人厉害之处,就在于有强烈的...

    对于服务型咨询公司或职场人士来说,行业研究是一项必备的功课。这里为大家提供一些实用的思路和方法,使其更为高效,快速!在极短的时间内了解某一个行业。

    本文分为四个部分:

    1.为什么要一周内了解一个行业?
    2.要摸清那些核心因素?
    3.如何针对性地了解核心要素?
    4.比快速了解行业更重要的事。

    一、 为什么要一周内了解一个行业?

    优秀的人厉害之处,就在于有强烈的目标感,明确自己为什么行动,又想得到什么样的结果。
    对你来说,一周内了解一个行业,意味着什么?
    是一份漂亮的研究报告,还是职业生涯的重大转折?花3秒钟想一下,你想获得什么。

    1.因为老板、同事、朋友等外部原因,需要你一周内产出行业调研报告;
    比如,老板觉得最近短视频带货很火,让你研究一下短视频行业,下周给个行业报告,分析一下值不值得入驻。

    2.由于自身想转行、想学习、好奇等内部原因,让你想主动了解陌生行业:
    待在传统行业的你,觉得事多钱少没前途,想换个有发展空间的行业,打算一周内弄清楚这个行业该不该进入。

    如果是外部原因,你需要尽量搜集书面化、数据化的信息,搜索的内容不必太过深入,明确大致方向即可;
    如果是内部原因,则应该更注重实践和复盘,增加对整个行业的深入了解。

    二、要了解哪些核心因素?

    1.行业分析的基本框架
    在研究陌生行业时,一定不能忽略**「行业框架」→「市场分析」→「产品研究」→「竞争格局」→「监管政策」→「其他影响因素」**这6个大方面!
    如果把行业比作一个人,那么基本框架就相当于头部和四肢,是最基本的支撑点。

    2.了解这些框架有什么用?
    1)行业框架:判断行业是否正处风口,位于生命周期的哪个阶段,接下来走上坡路还是下坡路,现在进入是否还有红利。
    下图是行业生命周期曲线。探索期和衰退期有风险,不建议加入。成长期属于快速发展时期,适合创业人士,成熟期则适合普通人士进入,最好是依附龙头公司。
    在这里插入图片描述

    例1:十年前是房地产行业的成长期,那时只要拿块地,闭着眼都能赚钱。
    例2:当下互联网短视频、直播进入红利期,李子柒、李佳琦等撞上风口,一路起飞,收入千万。

    2)市场分析:市场大小直接决定盈利天花板。
    比如,一个既不是刚需,也不讨用户喜欢,纯利润还不高的行业,老板都不能保证年赚xx万,普通员工的收入就更一言难尽了。

    3)产品研究:产品是否具有发展潜力,会不会面临时代淘汰危机。
    例如,几年前MP3很火,但后来手机兴起,涵盖听歌功能,直接干掉了MP3。

    4)竞争格局 :了解行业蛋糕是如何被割分的,评估自己(或心仪公司)能分到多少份额。

    5)监管政策:一切行业都跟着国家政策走,顺则蒸蒸日上,逆则夹缝生存。

    6)其他影响因素:指地区、文化、经济、生态、人口等因素,做得好是赚钱加分项,但忽视的话,也可能是致命一击。
    看到这里,你应该已经知道,如何通过基本框架,来判断一个行业值不值得进入了。
    但最关键的来了,这些框架还是很泛,该怎么具体化操作?又该怎么挖掘相关信息呢?

    三、如何针对性了解核心要素?

    第一大板块:行业概况。
    6大关键要素:
    1.基本术语:基本的行业术语有哪些?专业名词有哪些?
    2.行业规模:行业整体规模和数据?行业年度经济收入?
    3.生命周期:处在行业生命周期的哪个阶段?行业发展是否有瓶颈?或者是否有行业天花板?
    4.发展历史:行业的发展历程和变迁怎样?行业发展趋势如何?未来上坡还是下坡?
    5.盈利模式:行业发展主要驱动力是什么?行业是哪种盈利模式?
    6.上下游供应:行业的供应结构如何?供应商数量与分布?

    这是指弄清楚行业的基本情况。如果把行业比作一个人,这就相当于是,了解他长什么模样,年龄多大,以前是怎样的,靠什么维持生活,以后会不会有出息。
    这样一说,行业规模、生命周期、发展历史等就不太难理解了,但什么是行业驱动力和盈利模式,大部分同学还是一知半解,所以我简单解释一下。

    驱动力主要看是供给驱动还是需求驱动。

    供给驱动对企业的技术要求较高,以「为用户提供最好的服务」为核心,就是哪个做得好买哪个。
    比如手机行业和互联网产品行业,尤其是APP类,产品经理基本会保持一周一迭代。
    需求驱动就要看受众群体大小,以及他们的痛点。
    例如医美行业逐渐火热,一是因为爱美是人的天性,不论男女老少,都可能做医美,受众群体广;

    二是时代逐渐开放,技术也更加成熟,人们对整形微调接受度更高,手术也更安全。
    至于盈利模式,我认为随着时代的发展,它从单纯的「卖产品」、「卖服务」、「卖品牌」三大类型,衍生出了「卖投资」、「卖文化」两类。
    「卖产品」、「卖服务」、「卖品牌」看字面意思不难理解,分别对应以产品为核心、以服务为核心、以品牌为核心的盈利模式。

    「卖投资」、「卖文化」这两点看着比较新颖,但其实,卖投资就是搞分销,招商加盟,比如微商、奶茶行业。至于卖文化,想想得到、混沌大学、知识星球等知识付费APP/平台就明白了。

    第二大板块:市场分析
    5大关键要素:

    1. 市场规模:市场规模大还是小?与其他行业相比算大算小?
      2.行业数据:行业大数据如何?有多少家企业、产品?
      3.用户群体:行业的主要用户是谁?群体大还是小?
      4.市场增长率:近几年市场增长率如何?市场利润率如何?
      5.财务报表:龙头企业的财务报表数据如何?
      这些关键词,其实就构成了市场大蛋糕的样子。
      市场规模是指蛋糕的尺寸大小,而行业数据是市场规模的具体数据呈现和支撑点。
      用户群体是指吃蛋糕的人,而市场增长率,就是判断这个蛋糕会越吃越多,还是越吃越小的指标。
      财务报表,主要是指阅读龙头公司的财务报表。因为这可以迅速了解这家企业的主要业务、主要客户、员工规模、战略方向、所有权性质、主要风险等,以此推出整个行业的情况。
      现在,重点选「用户群体」和「市场增长率」这两个来跟大家聊聊。
      做市场分析,最重要的就是,摸清楚你的用户群体是谁。本质上,是谁在使用你的产品,谁就是你的用户群体。

    第三大板块:产品研究
    (1)4大关键要素:
    1.产品概况:产品概况如何?产品数量和类型具体情况?
    2.产品需求:产品是否刚需?体验感如何?是否面临时代淘汰危机?
    3.产品技术:技术成熟度如何?行业产品技术发展、竞争行业技术发展怎样?
    4.产品形态:产品的主要形态如何?有形还是无形的?

    这主要是弄清楚,市场上的产品主要有哪些,是怎么分类的,占比多少,主要受什么影响。
    比如,互联网移动社交APP行业,可以分为综合平台(微信、QQ)、陌生人平台(探探)、兴趣、游戏、婚恋、职场等社交类型。
    很明显这类产品区别于实际物品,是可视化的无形产品,而影响其发展的主要是科学技术。

    (2)搜索方法/工具:可以自己市场调研,关注淘宝、天猫等产品分类,或者去实体店看。网络调查的话,可以在行业网站和百度查出来,一些行业报告中也会提及。

    第四大板块:竞争格局
    2大关键要素:

    1.竞争格局:龙头老大是谁?一家独大还是多头垄断,还是百花齐放?产品竞争如何?
    2.行业影响:是否有其他行业影响竞争?

    比如,互联网行业有BAT之称,B指字节跳动,A指阿里,T指腾讯。
    三家作为龙头公司,形成三足鼎立局面,在互联网未上市创业公司估值前30名的公司中,80%背后有BAT的身影。
    这些信息一般行业报告中就能获取,或者去行业协会的官网,平时记得多关注行业动态信息。

    第五大板块:监管政策
    (1)2大关键要素:
    1.中央文件:国务院文件、各部委文件如何?
    2.地方政策:地方政府文件如何?

    这是指,要时刻关注政府政策,改变风向,尤其是涉及到限制和处罚的内容。
    比如,向来火爆的海外代购,促生了很多职业代购,但随着去年颁布的电子商务法,线上代购要登记交税,同时电商平台承担连带责任,最高罚款200万。
    这时候,代购人士必须跟着政策走,不能再「肆意妄为」,就连电商平台,也面临着「连坐处罚」。

    (2)搜索方法/工具:
    多关注行业官网中的政策板块,就能快速获取这个内容。
    还可以上中国政府网,科技部、工信部、发改委、财政部、人力资源部、文旅部等部委

    第六大板块:其他影响因素
    1.地区布局,比如行政区划、交通运输、城郊影响、城市规模,南北差异等。
    2.经济水平,比如地区人口经济收入、消费能力等。
    3.人口分布,比如住宅区、工业区,交通要点分布等。
    4.生态环境,比如气候差异、天气因素、地形地势、风向、矿物山体等。
    5.文化水平,比如文化差异,风俗习惯等。
    这些因素,相对来说不那么重要,但也不可忽视。
    举个例子:
    你开了一家饭店,客流、交通位置等都很好,附近也只此一家饭店,但顾客却很少。

    调查后,你发现店里总是传来若有若无的异味。起初怀疑是卫生问题,后来才知道,几百米外有家酒厂,而饭店的位置正处于酒厂的下风向。
    以上问题,基本可依据搜索引擎解决,或者查询地区政务网。找当地人问问,也可能有意向不到的收获。

    四、比快速了解行业更重要的事

    我发现,从事咨询机构的同学大多反应很快,说什么都能迅速get到点,随便说的预测也八九不离十,总给人很「聪明」的感觉。
    实际上,他们也一样是普通人,智商比我们高不了多少。但因为经常进行「迅速了解陌生领域」这种练习,所以使他们,拥有优于常人的逻辑推理能力,和以小见大的洞察力。
    当然,你可能会问:
    这和我有什么关系,我只是想转行,又不从事咨询行业,有必要掌握这些能力吗?
    其实非常有必要。

    因为选择一份好的行业,本身就有很大概率决定今后的命运。

    对咨询机构来说,项目失败顶多损失一笔钱,而对我们普通人来说,选错一个行业或一份工作,可能动辄需要几年青春来纠错。

    **时间本身就是金钱。**不停地换工作、转行业,就像不断地堆积木,再推倒,再重堆。最后,折腾了十几年,还在原地踏步,跟那些应届毕业生抢工作,这才是最悲哀的事。

    尤其是出身贫寒的人,「从头来过」意味着一身清零,再加上结婚买房、父母养老等问题……试错成大到无法想象。

    这种情况下,具备迅速摸清一个陌生行业的能力,就显得极为重要了。

    这种能力,拆分开来,就是逻辑思维能力、洞察力、信息搜集和数据分析能力。

    想培养这些能力的同学,可以多研究几个行业,增加自己的实战能力。建议先从自己最熟悉的行业开始,摸清套路,再向外扩展。

    重申一下,本文所提到的方法,主要针对想转行、好奇、爱学习的人士,虽然用上面的方法可以快速了解这个行业的80%,但是二八定律无处不在,真正具有含金量的信息,往往在剩下的20%。

    这需要时间和经验的积累,从没了解和接触过这个行业的人,很难真正掌握核心信息。世界上也几乎不存在,几天就能完全了解一个行业的人。
    但是,这也足够支撑你和行业内人士闲聊一下午,为自己今后选择的行业做出正确的预判,或者给公司产出一份漂亮的研究报告了~

    展开全文
  • mysql查询时间段内的数据,并对相同日期(精确到或月)的数据进行,相加,相减,或选取其中一个数据。难点为时间段筛选和相同日期处理的先后顺序需要思考。
  • 用5字段代表5不同的时间单位(中间用空格隔开): 分 时 日 月 星期几 0 2 * * * 表示每天凌晨2点 */10 * * * * 每隔10分钟次 45 10 * * 1-5 每星期的星期到星期五的10:45分执行 · M-N 指定范围值 ·...
  • 职场的四个层级

    千次阅读 2019-03-21 14:41:41
    职场的四个阶层 1、动作层; 我们初入职场,基本都从这里开始,在个执行岗上,接活干活接活干活,重复那些动作。 不用背负什么重大责任,只做上级让自己做的就好了。这个阶层其实最轻松,压力最小。 任何...
  • 向AI转型的程序员都关注了这号????????????大数据挖掘DT机器学习 公众号:datayx本博客分享新人第次参加天池比赛的实况记录,比较完整地给出了数据预处理,缺失值补全,...
  • 3.1.3时间 用户可以给某个键设置生存时间,过期时间一个UNIX时间戳,到时间自动删除这键。 redisdb结构的expires字典保存了所有的键的过期时间,我们称这字典为过期字典。 3.1.4三种过期键删除策略 1)定时...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,篇文章足够。能换你一个收藏了吧?
  • . CAN协议概念 1.1 CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519以及ISO11898),是国际上应用...
  • 年级下册第单元思维导图数学

    千次阅读 2021-07-28 00:12:23
    250212002102410这大数的认识吧……是年级上册第单元,主要讲了亿以内、亿以上、计算器、算盘等.......还可以用思维导图来画,更清楚,有什么问题随时来问我人民教育出版社年级上册语文第单元思维导图怎么...
  • 如何在周内快速摸清一个行业?

    千次阅读 2020-07-30 12:20:07
    本文分为四个部分: 1、为什么要周内了解个行业? 2、要摸清哪些核心因素? 3、如何针对性地了解核心要素? 4、比快速了解行业更重要的事 、 为什么要周内了解个行业 优秀的人厉害之处,就在于有强烈的...
  • 你可能第次见到这么长的总结文,有点硬核,耐心阅读
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠它

    万次阅读 多人点赞 2021-03-26 11:11:21
    2)四个并列程序:分别为O(N),O(N^2),O(N^3),O(N*logN),整个程序时间复杂度为O(N^3),因为随着N的增长,其它项都会忽略 3)算法分析的目的是分析算法的效率以求改进 4)对算法分析的前提是算法必须正确 5)原地...
  • 在扩容时,将其中一个dictht上的键值对rehash到另一个dictht上面,完成之后释放空间并交换两dictht的角色。 typedef struct dict { dictType *type; void *privdata; dictht ht[2]; long rehashidx; /* rehashing ...
  • 精选 8 适合不同阶段的英语学习APP,完全免费
  • Python零基础入门的第一天——开发环境的搭建

    万次阅读 多人点赞 2022-08-02 12:29:48
    程序设计语言也叫编程语言,是计算机能够理解和识别用户意图的种交互体系,它按照特定规则组织计算机指令,使用计算机能够自动进行各种运算处理。
  • 作者 | 黑帽子 (微信:heimaozi668)实不相瞒,为了写这篇文章,我憋了有三时间。去年底,我实打实做了俩抖音壁纸号,把整套玩法亲自摸索了遍,为此我也花费了1299元成本,...
  • 8000字干货:那些很厉害的人是怎么构建知识体系的

    万次阅读 多人点赞 2019-09-29 11:18:27
    现在,小薇知道了一个时间管理的方法,叫作“时间管理象限”。 先问“前”,这里小薇可以问“为什么掌握时间管理象限对我很重要?”,答案可能是“做好时间管理,能帮助我合理安排任务,找到完成讲义开发的...
  • 从绩效管理发展的三阶段,研究一下绩效管理发展的趋势。自第次工业革命以来,人类社会经历了蒸汽时代、电气时代、信息时代、人工智能时代。绩效管理大致也经历了四大历程:考勤——绩效考核——绩效管理——绩效...
  • 超硬核!小白读了这篇文章,就能在算法圈混了

    万次阅读 多人点赞 2021-03-29 10:21:58
    作为只超级硬核的兔子,从来不给你说废话,只有最有用的干货!这些神级算法送给你 目录 第节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂...
  • 不知道 CSDN 上的其他小伙伴有没有类似的问题,我熬了一个大爷,肝出了这条学习路线,送给大家作为参考。 难在坚持。你要是对自己的自律性信得过,自学 Java 是没问题的。 互联网时代最不缺的就是学习资源,学习教程...
  • 亲密接触Redis-第一天

    万次阅读 多人点赞 2016-02-03 17:10:24
    Redis是一个NOSQL,NOSQL有许多种,它们分为: 列存储,如:Hbase、Cassandra这种 文档存储,如:MongoDB(首推) key-value存储,如:Berkeley DB、MemcacheDB、Redis,其中Redis最强 图存储,这块基本不用,有:...
  • 之前看了许许多多保研经验帖,如今我也写下这篇文章,希望帮助到各位学弟学妹们。 曾经的我是想出国的,但是有位学长(真的很...一个是夏令营情况,一个是九推的情况。 夏令营一般5月就要关注并报名和投材料了,...
  • Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析...这篇文章将抓取微博话题及评论信息,采用SnowNLP进行简单的情感分析及文本挖掘,包括随时间的情感分布。希望这篇基础性文章对您有所帮助
  • 有了「 目标 」,再做一定的「 规划 」,并且「 坚持 」做下去,我相信,「 成功的一天终会到来 」。 、团队要树立愿景   说了这么多,只是想建立一「 愿景 」。这「 愿景 」就是 —— 「 群人皆佬,共赴...
  • 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给...
  •    四天三夜的电赛在忙碌中结束了,今年为国赛,无论哪个方面都很重视电赛,也为我的大学生活留下了浓墨重彩的笔。谨以此写下这篇博客留念,本篇博客写下一些体会和感受。 如果上天再给我次机会,我一定会说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,186
精华内容 43,674
关键字:

一天分为四个时间段