【数据库】1.mysql相关知识(一)

1. 常用数据库及基本知识

一般我们需要学习的常用数据库有三种:mysql、mongodb和redis

  • mysql:关系型数据库,每秒并发1.2k左右
  • mongodb:非关系型数据库(也就是文档型数据库,类似json,{}),每秒并发大概1.6W
  • redis:键值对数据库,每秒读的次数是11W,写的速度是8.1W

需要注意的是:
性能高低排行:redis > mongodb > mysql
可靠性高低排行:mysql > mongodb > redis
所以,数据库没有最好,只有最适合

MYSQL配置

  • 配置文件:C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin\mysqld\my.ini
    • port 端口号
    • basedir 安装目录
    • datadir 数据存放目录
    • charcter-set-server 字符集
    • sql-mode 语法模式
    • max-connections 最大连接数

MYSQL启动和停止

  • 启动:
    • net start MySQL
  • 停止:
    • net stop MySQL

通过命令行链接MYSQL

    mysql -uroot -p123456
    
    //也可以指定IP和端口
    mysql -h 127.0.0.1 -P 3306 -uroot -p123456

    //退出
    exit

查看有哪些数据库(mysql命令要分号;结尾)

    show databases;

切换数据库

    use test;

查看当前数据库

    select database();

查看当前数据库有哪些表

    show tables;

查看表的结构

    desc 表名;

    //返回的结果结构如下:
    +---------+------------+----------+---------+---------+------------------+
    |  Field  |    Type    |   Null   |   Key   | Default | Extra            |
    +---------+------------+----------+---------+---------+------------------+
    |   id    |  int(11)   |    No    |   PRI   | NULL    | auto_increment   |
    |  name   |varchar(50) |    YES   |         | NULL    |                  |
    |parent_id|  int(11)   |    YES   |         | NULL    |                  |
    +---------+------------+----------+---------+---------+------------------+

  • Field 字段的名字
  • Type 数据类型
    • int 代表整形
    • float 浮点型(小数)
    • varchar 可变字符串(全称:variable character)。最大255。假设设定字符串为4个字符长度,如果不可变字符串的话,字符长度为2,也会占用4个长度,长度为3,也会占用4个长度。而可变字符串,是几个字符就站几个长度,这样节省空间。
  • Null 是否为空
  • Key 是否为主键,PRI表示主键。
    • 主键:这个表中的某个键,不能重复,可以唯一表示一个记录,一张表能有多个主键,如果主键多个,就表示联合主键,也就是说只要这个联合主键唯一就可以了。
    • 外键:别的表中的主键。外键也可以是这张表的主键。
  • Default 默认值
  • Extra 其他

以后这些东西,后面会详细说明

表的操作注意事项

  • 如果存在外键,就说明存在父子表,添加数据应该先添加父表数据再添加子表数据,删除数据应该先删除子表数据再删除父表数据。
  • 主键可以唯一表示一条记录,主键可以一个,也可以多个。如果主键多个,则表示联合主键,也就是说只要这个联合主键唯一就可以了。

2. 数据完整性

  • 为了实现数据完整性,需要检验数据库表中的每行和每列数据是否符合要求
  • 在创建表的时候,应该保证以后的数据输入是正确的,错误的数据不允许输入

2.1 域完整性

不同的字段需要设置为各种合适的类型,比如年龄就是整数类型

  • 列类型
    • 数值型
      • 整数型
        • tinyint 1个字节
        • smallint 2个字节
        • mediumint 3个字节
        • int 4个字节
        • bigint 8个字节
      • 小数型
        • 浮点
          • float 最大长度32位
          • Double 最大长度64位
        • 定点
          • decimal 用于计算的,比如js中小数计算不太精确,可以使用这种类型实现精确计算
    • 字符串型
      • set 集合,不可重复,比如标签
      • enum 枚举类型
      • blob 二进制类型,比如存一个图片、视频、音频
      • text 文本,字符比较多
      • varchar 可变长度
      • char 不可变长度
    • 日期时间型
      • year 年
      • timestamp 时间戳,毫秒数,从1970-01-01 00:00:00 UTC开始
      • time 时间
      • date 日期
      • datetime 日期时间

2.2 默认值

  • 默认值是指如果用户没有指定值的情况下记录的此字段提供一个预先设定的值

比如:可以把居住地默认值设置为北京

3.2 非空约束

  • 我们可以指定某个字段不能不输入,必须提供一个非空的值

比如:姓名字段不能为空

3.实体完整性

什么叫实体,就是一行行的记录,一个记录就是一个实体

3.1主键约束

3.1.1 主键
  • 表中一列或者几列组合的值能用来唯一标识表中的每一行,这样的列或者列组合称为表的主键,主键表的数据不能重复。

如果两列或者多列组合起来唯一标识表中的每一行,则该主键又称为“组合键”

主键的选择标准
  1. 最少性:尽量选择单个键作为主键
  2. 稳定性,由于主键是用来在两个表间建立连接的,所以不能经常更新,最好就是不更新
3.1.3 唯一约束
  • 唯一约束是指某个字段值是唯一的,在所有的记录中不能有重复的值

学生的身份证号可以设置为唯一的约束

3.1.4 标识列
  • 当表中没有合适的列作为主键时,可以考虑增加标志列,标识列是一个无实际业务含义的列,仅仅用来区分每条记录。
  • 标识列的值是自动生成的,不能在该列上输入数据

思考:如果标识列id的初始值为1,增长量为3,则输入3行数据后,再删除1行,下次再输入数据行的时候,标识值自动插入的值是多少?

3.1.5 外键约束
  • 一个表的外键必须引用一个表的主键
  • 住表没有记录,子表不能添加相应的记录
  • 修改和删除住表记录,必须先修该或删除子表的记录

4. SQL

  • SQL:结构化查询语句
  • 使用SQL原因:使用界面操作数据库不方便,所以需要通过应用程序去操作数据库
  • SQL组成
    1. DDL 数据库定义语言,主要用在定义或改变表的结构、数据类型、表之间的链接和约束等初始化工作上,大多数在简历表的时候使用。主要的命令有:
      • CREATE
      • ALTER
      • DROP
      • 。。。
    2. DML 数据库操作语言,主要用来对数据库里的数据进行操作的语言,主要有4条命令:
      • SELECT
      • UPDATE
      • INSERT
      • DELETE
    3. DCL 数据库控制语言,用来设置或更改数据库用户或角色权限的语句,包括grant、revoke等语句
  • 语句必须要分号结尾
  • 要养成大写的习惯(虽然小写也支持)

4.1 DDL

  • 示例代码
    -- 关键字要大写
    CREATE TABLE student
    (
    id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(64) NOT NULL,
    age INT(64) DEFAULT NULL,
    city VARCHAR(64) DEFAULT '北京'
    )
    -- SELECT表示查询的意思,*代表查询所有列
    SELECT * FROM student;
    -- 查询student表的结构
    DESC student;
    -- 如何增加表里的字段
    ALTER TABLE student ADD COLUMN idcard VARCHAR(64) NULL;
    -- 如何修改表里的字段
    ALTER TABLE student MODIFY idcard VARCHAR(18) NOT NULL;
    -- 删除表里的字段
    ALTER TABLE student DROP idcard;
4.1.1 创建
4.1.1.1 创建表
  • 创建表:CREATE TABLE student()
    • 注意:如果表名是关键字,就应该有反引号引起来
      • 举例:CREATE TABLE table()
4.1.1.2 创建记录
  • 每条记录的创建格式为:filed type null key default extra
    • filed 为字段名
    • type 数据类型
    • null 是否为null
    • key 是否为主键
    • default 默认值是多少
    • extra 其他,比如自动增长就是AUTO_INCREMENT
    • 举例:id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT
4.1.2 查询
4.1.2.1 查询列
  • 查询列:
    • 查询某一列:SELECT 列名 FROM 表名
      • 举例:SELECT name FROM student
    • 查询某几列:SELECT 列名1,列名2 FROM 表名
      • 举例:SELECT id,name,age FROM 表名
    • 查询所有列:SELECT * FROM 表名
      • 举例:SELECT * FROM student
    • 在某个条件下查询: SELECT 列名1,列名2,列名3,… FROM 表名 WHERE ADD/OR/NOT等条件语句
      • 举例:SELECT
4.1.2.2 查询表结构
  • 查询表的结构:DESC 表名
    • 举例:DESC student
4.2.3 修改(增删改查)
4.2.3.1 增加字段(新增列)
  • 增加表里的字段(新增列)
    • 格式:ALTER TABLE 表名 ADD CLOUMN <+记录的创建格式>
      • 举例:ALTER TABLE student ADD CLOUMN idcard VARCHAR(64) NULL;
    • “ALTER TABLE 表名”中的ALTER TABLE代表“修改表”
4.2.3.2 修改字段
  • 修改表里的字段
    • 格式: ALTER TABLE 表名 MODIFY <+记录的创建格式,只写需要修改的条件即可>
      • 举例:ALTER TABLE student MODIFY idcard VARCHAR(18) NOT NULL;
4.2.3.3 删除字段
  • 删除表里的字段
    • 格式:ALTER TABLE 表名 DROP 字段名
      • 举例:ALTER TABLE student DROP idcard;
4.2.3.4 增加约束条件
  • 增加主键
    • 格式:ALTER TABLE 表名 ADD PRIMARY KEY(要成为主键的列名)
      • 举例: ALTER TABLE student ADD PRIMARY KEY(id)
  • 增加唯一的约束
    • 格式:ALTER TABLE 表名 ADD UNIQUE INDEX 新的约束字段名称 (约束字段)
      • 举例: ALTER TABLE student ADD UNIQUE INDEX uq_studentz-idcard (idcard)
  • 增加默认约束
    • 格式:ALTER TABLE student MODIFY CLOUMN city 类型 DEFAULT ‘默认值’
      • 举例:ALTER TABLE student MODIFY CLOUMN city VARCHAR(64) DEFAYKR ‘南京’;
  • 主外键
    • 格式:ALTER TABLE 添加外键的表名 ADD CONSTRAINT 新增的外键名 FOREIGN KEY(当前表对应外键的键名) REFERENCES 目标数据库名.目标表名(目标键名)
      • 举例:ALTER TABLE score ADD CONSTRAINT fk_score_student_id FOREIGN KET(student_id) REFERENCES studb.student(id)
## 以上属于DDL(Data Definition Language,数据库定义语言),不需要背诵,一般都是视图操作,如果需要SQL语言代码,直接导出转储SQL文件即可
## 下面的DML(Data Manipulation Language, 数据库操作语言),需要牢记

4.2 DML

4.2.1 插入数据行
4.2.1.1 语法
    INSERT [INTO] 表名 [(列名)] VALUES (值列表)
  • []内的可以省略
  • 列名跟值列表要一一对应,每一对的顺序先后没关系
4.2.1.2 向学生表中插入一条记录,姓名张三,身份证号123456,年龄30,城市杭州
    INSERT INTO student(name,idcard,age,city) 
    VALUES('张三','123456',30,'杭州');
4.2.1.3 注意事项
  • 每次插入一行数据,不能只插入一部分数据,插入的数据是否有效将按照整行的完整性要求来检验
  • 每个数据值的数据类型、精度、位数必须与对应的列名精确匹配
  • 不能为标识符指定值
    • 比如上例中不能写id,因为id是标志位,由数据库自己维护,不能由你来写
  • 如果某字段设置不能为空,则必须要插入数据
  • 插入数据时要符合检查性约束的要求
  • 有缺省值的列,可以用DEFAULT关键字来代替插入实际的值
4.2.2 更新数据行
4.2.2.1 语法
    UPDATE 表名 SET 列名 = 更新值[WHERE 更新条件]
4.2.2.2 更新ID等于1的学生年龄改为40,城市改为上海
    UPDATE sudent SET age=40,city='上海' WHERE id=1 OR name='张三';
4.2.2.3 注意事项
  • 可以一次更新多列,用逗号隔开
  • 可以指定更新条件,如果有多个条件,用and or not
4.2.3 删除数据行
4.2.3.1 语法
    DELETE FROM 表名 WHERE 条件
4.2.3.2 删除id为2的数据
    DELETE FROM student WHERE id = 2;
4.2.3.3 注意事项
  • 删除是整行删除,所以不需要提供列名
  • 如果你要删除的表示主表,那需要先删除子表
4.2.4 截断表
4.2.4.1 语法
    TRUNCATE TABLE 表名;
4.2.4.2 截断student表
    TRUNCATE TABLE student;
4.2.4.3 截断与删除的区别
  • 截断也是删除整个表,跟DELETE一样
  • 区别:
    • 截断会重置标志种子,而DELETE FROM 不会
      • 比如当前表的id作为标识符,id为5,DELETE FROM后,再增加,id为6,但是TRUNCATE后id又从1开始
    • 截断不写入日志,没有备份;DELETE FROM写入日志,有备份
4.2.5 数据查询(重点)
  • 查询就是从客户端发出的查询请求数据库服务器,并从数据库返回查询结果的过程
  • 每次查询从表中提取数据,并且按照表的方式呈现出来
  • 查询产生的表示虚拟表,不会保存起来
4.2.5.1 精确查询
4.2.5.1.1 语法
    SELECT <列名> [AS] [别名]
    FROM <表名>
    [WHERE <查询条件表达式>]
    [ORDER BY <排列的列名>[ASC或DESC]]
4.2.5.1.2 查询北京的学生,并按照id正序排列
    SELECT id,name,city AS home //这样就相当于给city取了别名叫做home,返回的结果中city列页就变成了home列。当然别名可以省略AS,直接写成city home
    FORM student
    WHERE city='北京'
    ORDER BY id ASC;
4.2.5.1.3 先按照课程编号升续排,如果一样,按照课程成绩降序排
    SELECT * 
    FROM score
    ORDER BY course_id ASC,grade DESC;
4.2.5.1.4 查询某个字段为空的所有行
  • 使用 ‘字段 IS NULL’ 作为条件语句
  • 不为空就是 ‘字段 NOT NULL’
    SELECT *
    FROM student
    WHERE level IS NULL
4.2.5.1.5 常量列(添加常量列)
SELECT id,name,city,'中国' as country
FROM student
WHERE city='北京'
ORDER BY id DESC
//返回的结果就是
id  name  city  country
5   陈七   北京  中国
4   赵六   北京  中国
1   张三   北京  中国
//这样就多出来一个country列,值为常量'中国'
4.2.5.1.6 分页(极其常用)
  • 语法:
    • limit 索引,个数
      • 注意索引从0开始
    SELECT id,name
    FROM student
    limit 0,3 //从第0条开始,取3条
4.2.5.1.7 去重(查询同学们都来自哪些不同的城市)
  • DISTINCT 关键字,表示唯一的
    SELECT DISTINCT city 
    FROM student;
    //出来的结果就是
    city
    北京
    杭州
4.2.5.2 模糊查询
4.2.5.2.1 通配符
  • 主要使用关键字LIKE,以及符号%和_
    • LIKE 表示模糊查询
    • %表示任意长度的字符(0或大于0)
      • '%郭’表示最后一个字是郭,前面任意
      • '%郭%'表示含有郭,前后任意
      • '郭%'表示第一个字是郭,后面任意
    • _表示字符,一个_表示一个字符,—两个_表示两个字符
      • '郭_'表示两个字,郭开头,后面的字随意
      • '__郭’表示三个字,郭结尾,前面的子随意
  • 举例:
    SELECT * 
    FROM student
    WHERE name LIKE '%郭'
4.2.5.2.2 BETWEEN AND
  • 查询某一列在指定的规范内的记录,包括两个边界
    SELECT * FROM score WHERE grade BETWEEN 80 ADN 100;
    //包括80 跟 100
4.2.5.2.3 IN
  • 查询某一列中的值在列出的内容列表中
    SELECT * FROM student WHERE city IN ('北京','杭州','上海');
4.2.5.2.4 IS NULL
  • 为空 IS NULL
  • 不为空 IS NOT NULL

4.3 DCL

4.3.1 创建用户
    CREATE USER 用户名@访问地址 IDENTIFIED BY '密码'
    CREATE USER user1@localhost IDENTIFIED BY '12345'
4.3.2 授予权限
    GRANT 权限1,权限2,..ON 数据库.* TO 用户名
    GRANT CREATE,DROP ON db1.* TO user1@localhost;//赋予创建和删除的权限
4.3.3 查看用户权限
    SHOW GRANTS FROM 用户名
    SHOW GRANTS FROM user1@localhost
4.3.4 删除用户
    DROP USER 用户名
    DROP USER yuhua
4.3.5 修改密码
    UPDATE USER SET PASSWORD=PASSWORD('password') WHERE User='username' and Host='localhost';
    FLUSH PRIVILEGES;

4.3 函数

4.3.1 字符函数
函数名称描述
CONCAT字符串连接
CONCAT_WS使用指定的分隔符进行字符串连接
FORMAT数字格式化
LOWER转小写字母
UPPER转大写字母
LEFT返回字符串最左边n个字符
RIGHT返回字符串最右边的n个字符
LENGTH返回字符串的长度
SUBSTR截取字符串
INSTR计算子字符串在父字符串的位置索引
TRIM去除字符串前后空格
LTRIM去除字符串左边的空格
RTRIM去除字符串右边的空格
LPAD往左补齐
RPAD往右补齐
REPLACE替换
4.3.1.1 CONCAT(a,b)
  • 把a和b字符拼接起来
SELECT CONCAT(age,city) AS agecity FROM student;
//返回的结果是
agecity
40上海
40北京
30杭州
20北京
30上海
4.3.1.2 CONCAT_WS(拼接符号a,b)
  • 把a和b用拼接符号拼接起来
SELECT CONCAT_WS('-',age,city) AS agecity FROM student;
//返回的结果是
agecity
40-上海
40-北京
30-杭州
20-北京
30-上海
4.3.1.3 FORMAT(数字,保留的小数位数)
  • 数字格式化
  • 整数位每三位加一个逗号,
    SELECT FORMAT(100000,2) AS newNum;
    //返回的结果是
    newNum
    100,000.00
4.3.1.4 LOWER(字符串)
  • 返回小写的字符串
SELECT LOWER('YUHUA');
//返回
LOWER('YUHUA')
yuhua


SELECT LOWER('YUHUA') AS name;
//返回
name
yuhua
4.3.1.5 UPPER(字符串)
  • 返回大写的字符串
SELECT UPPER('yuhua');
//返回
UPPER('yuhua')
YUHUA


SELECT UPPER('yuhua') AS name;
//返回
name
YUHUA
4.3.1.6 LEFT(字符串,n)
  • 取字符串最左边的n个字符
    SELECT LEFT('yuhua',2);
    //返回表格
    LEFT('yuhua',2)
    yu



    SELECT LEFT('yuhua',2) AS leftstr;
    //返回表格
    leftstr
    yu
4.3.1.7 RIGHT(字符串,n)
  • 取字符串最右边的n个字符
    SELECT RIGHT('yuhua',3);
    //返回表格
    RIGHT('yuhua',3)
    hua


    SELECT RIGHT('yuhua',3) AS rightstr;
    //返回表格
    rightstr
    hua
4.3.1.8 LENGTH(字符串)
  • 返回字符串长度
    SELECT LENGTH("yuhua");
    //返回表格(注意,所有结果都是表格)
    LENGTH("yuhua")
    5


    SELECT LENGTH("yuhua") AS len;
    //返回表格
    len 
    5


4.3.1.9 SUBSTR的四种用法
  • SUBSTR(字符串 FROM 开始截取的索引 FOR 截取的长度)

    • 注意,这里的索引从1开始(回忆一下:哪里的索引从0开始?答:分页中limit的索引从0开始)
        SELECT SUBSTR('yuhua' FROM 2 FOR 3) AS namestr;
        //返回结果
        namestr
        uhu
    
  • SUBSTR(字符串,开始截取的索引,截取的长度)

    • 与上面的相同
  • SUBSTR(字符串 FROM 开始截取的索引)

    • 这个没有截取的位数,说明是截取到末尾
        SELECT SUBSTR('yuhua' FROM 2) AS namestr;
        //返回结果
        namestr
        uhua
    
  • SUBSTR(字符串,开始截取的索引)

    • 与上面的相同
4.3.1.10 INSTR(父字符串,子字符串)
  • 计算子字符串在父字符串的位置索引,索引从1开始
    SELECT INSTR('yuhua','ua') as childStrIndex;
    //返回表格
    childStrIndex
    4
4.3.1.11 TRIM(字符串)
  • 去除字符串前后的空格
    SELECT TRIM(' YU HUA ') as trimStr;
    //返回结果
    trimStr
    YU HUA
4.3.1.12 LTRIM(字符串)
  • 去除字符串左边的空格
    SELECT LTRIM(' YU HUA ') as trimStr;
    //返回结果
    trimStr
    YU HUA 
4.3.1.13 RTRIM(字符串)
  • 去除字符串右边的空格
    SELECT RTRIM(' YU HUA ') as trimStr;
    //返回结果
    trimStr
     YU HUA
4.3.1.14 LPAD(字符串,向左补齐成几位,从哪个索引位置开始补齐)
  • 向左补齐
    SELECT LPAD('yuhua',10,'0') AS lyuhua;
    //返回的结果是
    lyuhua
    00000yuhua
4.3.1.15 RPAD(字符串,向右补齐成几位,从哪个索引位置开始补齐)
  • 向右补齐
    SELECT RPAD('yuhua',10,'0') AS ryuhua;
    //返回的结果是
    ryuhua
    yuhua00000
4.3.1.16 REPLACE(被替换的字符串,被替换的内容,替换成的内容)
  • 替换
    SELECT REPLACE('yuhua','hua','shuaihua') AS newName;
    //返回的结果是
    newName
    yushuaihua
4.3.1.17 姓名首字母大写,其他字母小写,然后用_拼接
SELECT CONCAT_WS('_',UPPER(SUBSTR(name,1,1)),LOWER(SUBSTR(name,2))) 
FROM student;
4.3.2 数学函数
函数名称描述
CEIL向上取整
FLOOR向下取整
DIV???
MOD取余(取模)
POW幂运算
POWER幂运算
ROUND四舍五入
TRUNCATE数字截取
4.3.2.1 CEIL(数字) 向上取整
    SELECT CEIL(1.2) AS intNum;
    //返回结果
    intNum
    2
4.3.2.2 FLOOR(数字) 向下取整
    SELECT FLOOR(1.7) AS intNum;
    //返回结果
    intNum
    1
4.3.2.3 DIV 取整数部分
    SELECT 2 DIV 3 AS res;
    //返回结果是
    res
    0

    SELECT 10 DIV 3 AS res;
    //返回结果是
    res
    3

    SELECT 9 DIV 2 AS res;
    //返回结果是
    res
    4

    SELECT 5 DIV -3 AS res; 
    //返回结果是
    res
    -1
4.3.2.4 MOD(被除数,除数) 取余(取模)
    SELECT MOD(3,2) AS res;
    //返回结果是
    res
    1
4.3.2.5 POWER(x,y) 与 POW(x,y) 都是x^y 幂运算
    SELECT POW(2,3) as res;

    SELECT POWER(2,3) as res;

    //返回的结果都是
    res
    8
4.3.2.6 ROUND(数值,精确到的小数位数) 四舍五入
  • 第二个参数可以省略,省略就成了精确到个位
    SELECT ROUND(2.56) AS res;
    //返回的结果是
    res
    3


    SELECT ROUND(2.56,1) AS res;
    //返回的结果是
    res
    2.6
4.3.2.7 TRUNCATE(数值,要截取的位数) 数值截取(截取小数部分)
  • 第二个参数不可以省略,省略就报错
  • 第二个参数为负数的时候,就是对整数取整,并且舍去小数。具体看下例:
    SELECT TRUNCATE(2.5682,2) AS res;
    //返回的结果是
    res
    2.56

    SELECT TRUNCATE(234.548,-2) AS res;
    //返回结果是
    res
    200
4.3.3 日期函数
函数名称描述
NOW当前日期和时间
CURDATE当前日期
CURTIME当前时间
DATE_ADD日期变化
DATEDIFF计算日期差
DATE_FORMAT日期格式化
YEAR获取年
MONTH获取月
DAY获取日
HOUR获取小时
MINUTE获取分钟
SECOND获取秒数
4.3.3.1 NOW()
  • 当前的日期时间
    SELECT NOW() AS res;
    //返回的结果是
    res
    2019-09-17 13:20:52
4.3.3.2 CURDATE()
  • 当前的日期
    SELECT CURDATE() AS res;
    //返回的结果是
    res
    2019-09-17
4.3.3.3 CURTIME()
  • 当前的日期
    SELECT CURTIME() AS res;
    //返回的结果是
    res
    13:20:52
4.3.3.4 DATE_ADD(date,INTERVAL expr type)
  • 作用:函数向日期添加指定的时间间隔。
  • 参数:
    • data:表示基准时间
    • INTERVAL expr type:表示时间的增量
      • type可以取一下的值:
Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
  • 举例:在当前基础上增加2天,返回一个新的时间
    SELECT DATE_ADD(NOW(),INTERVAL 2 DAY) AS res;
    //返回的结果是
    res
    2019-09-19 13:59:01
4.3.3.5 DATEDIFF(日期A,日期B) 日期差
  • 日期A - 日期B 的差值
    SELECT DATEDIFF('2008-12-30','2008-12-29') AS res;
    //返回的结果是
    res
    1

    SELECT DATEDIFF('2008-12-29','2008-12-30') AS res;
    //返回的结果是
    res
    -1
4.3.3.6 DATE_FORMAT(date,format) 日期/时间格式化
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')

结果为:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635
  • format的格式有如下几种:
格式描述
%a缩写星期名
%b缩写月名
%c月,数值
%D带有英文前缀的月中的天
%d月的天,数值(00-31)
%e月的天,数值(0-31)
%f微秒
%H小时 (00-23)
%h小时 (01-12)
%I小时 (01-12)
%i分钟,数值(00-59)
%j年的天 (001-366)
%k小时 (0-23)
%l小时 (1-12)
%M月名
%m月,数值(00-12)
%pAM 或 PM
%r时间,12-小时(hh:mm:ss AM 或 PM)
%S秒(00-59)
%s秒(00-59)
%T时间, 24-小时 (hh:mm:ss)
%U周 (00-53) 星期日是一周的第一天
%u周 (00-53) 星期一是一周的第一天
%V周 (01-53) 星期日是一周的第一天,与 %X 使用
%v周 (01-53) 星期一是一周的第一天,与 %x 使用
%W星期名
%w周的天 (0=星期日, 6=星期六)
%X年,其中的星期日是周的第一天,4 位,与 %V 使用
%x年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y年,4 位
%y年,2 位
4.3.3.7 获取年月日
SELECT YEAR(NOW());//2019
SELECT MONTH(NOW());//9
SELECT DAY(NOW());//17
SELECT HOUR(NOW());//14
SELECT MINUTE(NOW());//13
SELECT SECOND(NOW());//5

4.3.3.8 STR_TO_DATE(日期,格式)
  • 格式化日期
SELECT STR_TO_DATE('2019-9-10','%Y-%m-%d') AS newDate;
//返回结果
newDate
2019-09-10
  • 格式化时间符号
    | 格式符 | 功能 |
    | — | — |
    | %Y | 4位的年份 |
    | %y | 2位的年份 |
    | %m | 月份(01,02) |
    | %c | 月份(1,2) |
    | %d | 日(01,02) |
    | %H | 小时(24小时制) |
    | %h | 小时(12小时制) |
    | %i | 分钟(00,01) |
    | %s | 秒(00,01) |
4.3.4 自定义函数
  • 自定义函数是对MySQL的扩展,使用方式和内置函数相同
  • 函数必须要有参数的括号和返回值
  • 函数可以接受任意类型的值,页可以接受这些类型的参数
  • 函数体由合法的SQL语句组成
  • 函数体可以是简单的SELECT语句或INSERT语句,如果是符合结构要用BEGIN…END
  • 函数体页可以包含生命、循环和流程控制
  • 返回值只能有一个
4.3.4.1 创建(定义)一个函数
  • 语法:
    CREATE FUNCTION 函数名称() RETURNS 返回值类型 函数体
  • 注意:
    • 定义函数的时候要有RETURNS
    • 函数体要包含RETURN
    • 函数体多条语句要用BEGIN…END包裹
  • 举例:
    • 例1:返回中文的当前时间
        CREATE FUNCTION ZHNOW(format VARCHAR(64)) RETURNS VARCHAR(64)
        RETURN DATE_FORMAT(NOW(),format);
    
        //函数执行
        SELECT ZHNOW('%Y年%m月%d日 %H点%i分%s秒');
    
    • 例2:添加一个用户,返回其ID
        CREATE FUNCTION ADD_USER(nameVal VARCHAR(64)) RETURNS INT
        BEGIN
            INSERT INTO student(name) VALUES(nameVal);
            RETURN LAST_INSERT_ID();
        END
    
        SELECT ADD_USER('小鱼儿');
    

4.4 数据库其他操作

4.4.1 每个客户端连接上服务器后产生的一个连接ID
    SELECT CONNECTION_ID();
    //返回连接ID
    CONNECTION_ID()
    5
4.4.2 获取当前数据库名称
    SELECT DATABASE();
    //返回当前数据库名称
    DATABASE()
    studb
4.4.3 获取数据库版本
    SELECT VERSION();
    //返回当前数据库版本
    VERSION()
    5.5.29
4.4.4 获取数据库当前登录的用户信息
    SELECT USER();
    //返回当前登录的用户信息
    USER()
    root@localhost
4.4.5 获取最近一次插入的信息的ID
    SELECT LAST_INSERT_ID();
    //返回最近一次插入的信息的ID
    LAST_INSERT_ID()
    5
4.4.6 将字符串抽象成MD5
    SELECT MD5('yuhua');
    //返回结果
    MD5('yuhua')
    e3e6fa5586cdb4bd0cf4facf17bed233
4.4.7 获取指定用户的密码(该密码是加密过的密码)
    SELECT PASSWORD('root');
    //返回的结果是
    PASSWORD('root')
    *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

4.5 流程控制

4.5.1 IF语句
  • 语法:IF(条件,成功执行的语句,失败执行的语句)
  • 举例:
SELECT IF(1>2,'YES','NO');
//返回结果
IF(1>2,'YES','NO')
NO
4.5.2 CASE语句
  • 语法:
    CASE 要判断的字段或表达式
    WHEN 表达式1 THEN 要显示的值
    WHEN 表达式2 THEN 要显示的值
    ELSE 要显示的值
    END
  • 举例:
    SELECT 
    CASE city
    WHEN '杭州' THEN '新一线'
    WHEN '北京' THEN '一线'
    WHEN '上海' THEN '一线'
    WHEN '广州' THEN '一线'
    ELSE '其他'
    END
    FROM student;

4.7 常用例子举例

4.7.1 把学生表中的邮箱由小写改成大写
    UPDATE student SET email = UPPER(email);

4.6 注意点

  • +号
    • 只能用来加数字,能转成数字的转成数字后相加,不能转成数字的变成0相加
      • 1+1结果为2
      • 1+'1’结果为2
      • 1+'a’结果为0
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值