数据库之语句、函数、表管理、索引、引擎

目录

  1. 术语
  2. SQL语句
    1. DDL、DML、DCL、约束
  3. 数据库管理
  4. 表管理
    1. 字段类型
    2. 表设计
    3. E-R图
    4. 三范式
    5. 增删改查表
  5. SQL语句
    1. 增删改查
    2. 多表关联
      1. 内连接
      2. 外链接
      3. 交叉连接
      4. 联合连接
      5. 自然连接
    3. 关键字、函数
    4. 字段索引
    5. 表引擎

一、RDBMS 术语

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

二、SQL语句、DDL、DML、DCL、约束

  1. DDL(Data Definition Languages)语句:数据定义语句
    1. 这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键词主要包括create、drop、alter等
  2. DML(Data ManipulationLanguage)语句:数据操纵语句
    1. 用于添加、删除、更新、查询数据记录,并检查数据完整性,常用的语句关键词主要包括 insert、delete、update、select等
  3. DCL(Data Control Language)语句:数据控制语句
    1. 用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke等
  4. 约束
    1. 约束是用来限定表中数据准确性、完整性、一致性、联动性的一套规则(作用)。在mysql中,约束保存在informationschema数据库的tableconstraints中
    2. 约束分类
      1. NOT NULL(非空约束)
      2. UNIQUE(唯一约束)
      3. PRIMARY KEY(主键约束)
      4. FOREIGN KEY(外键约束,对应的字段只能是主键或唯一约束修饰的字段)
      5. CHECK(检查约束)
      6. AUTO_INCREMENT(自动增长)
      7. ZEROFILL(零充值)
      8. DEFAULT(默认)
      9. UNSIGNED(无符号位)

三、创建、删除、选择数据库

  1. 创建:create database 数据库名;
  2. 删除:drop database 数据库名;
  3. 选择:use 数据库名

四.1、mysql表管理-数据类型

  1. 整数
    1. tinyint 微小整数  1个字节  -128至127
    2. smailint 小整数  2个字节  -32768至32767
    3. int 整数  4个字节
    4. bigint 大整数   8个字节
  2. 小数
    1. 定点数(小数点位数是固定的)
      1. decimal(p,s)p代表总位数   s代表小数点位数
    2. 浮点数(小数点位数是不固定的)
      1. 单精度:float(p,s) 4个字节
      2. 双精度:double(p,s) 8个字节
  3. 日期、时间
    1. date(只有日期,没有时间,eg:年月日)
    2. time(只有时间,没有日期,eg:时分秒)
    3. datetime (包含日期和时间,eg:年月日时分秒)
    4. timestamp(包含日期和时间,eg:年月日时分秒毫秒)
  4. 文本
    1. char(固定长度文本,eg:char(5))
    2. varchar(不固定文本,eg:varchar(5))
    3. text(大文本,无长度)
  5. 二进制
    1. bit

四.2  数据库表的设计

  1. 数据库设计基本步骤
    1. 需求分析阶段:分析客户的业务和数据处理需求
    2. 概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整
    3. 详细设计阶段:将E-R图转换为多张表,进行逻辑设计,并应用数据库设计的三大范式进行审核
    4. 代码编写阶段:选择具体的数据库进行物理实践,并编写代码实现前后端的数据存储应用

四.3  E-R图

四.4  范式

  1. 设计关系数据库时,需要遵守不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
  2. 最初范式定义了规范化的几个级别,范式用以定义具有最小冗余的表结构
  3. 三范式:
    1. 第一范式
      1. 如果每列都是不可再分的最小数据单元(院子单元),则满足第一范式。
      2. 目标是却表每列的原子性
    2. 第二范式
      1. 如果一个关系满足第一范式,并且除了主键以外的其他列,都完全依赖于主键,则满足第二范式。
      2. 要求每个表只描述一件事
    3. 第三范式
      1. 如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式。
      2. 要求表中不存在冗余字段                              

四.5   MYSQL创建、删除、更新表

  1. 创建
    1.  创建表的要素:表名、表属性、字段名、字段属性
    2. 示例:
             create table if not exists 'tablename'(
      
                           'id' int unsigned  auto_increment,
      
                          'title' varchar(100) not null,
      
                          'createTime'   date,
      
                         primary key ('id')
      
                   )engine=InnoDB default  charset=utf8;
    3. 解析:
      • auto_increment定义列为自增的属性,一般用于主键,数值会自动增加1
      • primary key 关键字用于定义列为主键
      • engine  设置存储引擎
      • charset  设置编码
  2. 删除
    1. 通用语法:
      1. drop table tablename;
      2. drop table [if exists] tablename1,tablename2;
    2. 解析
      1. 当你不再需要该表时,用drop
      2. 当你仍要保留该表时,但要删除所有记录时,用truncate
      3. 当你要删除部分记录时,同delete
    3. 说明
      1. dorp table table_name:删除表全部数据和表结构,立刻释放磁盘空间,不管是Innodb和MyISAM
      2. truncate table table_name:删除表全部数据,保留表结构,立刻释放磁盘空间,不管是Innodb和MyISAM
      3. delete from table_name:删除表全部数据,表结构不变,对于MyISAM会立刻释放磁盘空间,Innodb不会释放磁盘空间
      4. delete form table_name where xxx:带条件的删除,表结构不变,不管是Innodb和MyISAM都不会释放磁盘空间
      5. delete操作以后,使用optimize table table_name 会立刻释放磁盘空间,不管是Innodb和myisam
      6. delete form 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分的空间 
  3. 更新
    1. 查看表基本结构语句
      1. desc 表名
    2. 查看表详细结构语句
      1. show create table 表名
    3. 修改表名
      1. alter table 旧表名 rename to 新表名
    4. 修改字段的数据类型
      1. alter table 表名 modify 字段名  数据类型
    5. 修改字段名
      1. alter table 表名 change 旧字段名 新字段名 新数据类型
    6. 添加字段
      1. alter table 表名 add 新字段名 数据类型
    7. 添加有完成性约束条件的字段
      1. alter table 表名 add 新字段名 数据类型 约束 
    8. 在表的第一列添加一个字段
      1. alter table 表名 add 新字段名 数据类型 first
    9. 在标的指定列添加一个字段
      1. alter table 表名 add 新字段名 数据类型 after 字段名
    10. 删除字段
      1. alter table 表名 drop 字段名
    11. 修改字段的排列位置
      1. alter table 表名modify 字段1 数据类型 first|after 字段2
    12. 更改表的存储引擎
      1. alter table 表名 engine=新引擎名
    13. 删除表的外键约束
      1. alter table 表名 rop foreign key 外建名
    14. 删除数据库
      1. drop table [is exists] 表1,表2,表3, ┅;

五.1  MYSQL增删改查数据命令

  1. 插入语句 insert into
    1. 所有列都插入值(列-值同数,同序):insert into 表名 values (值1,值2,值3);
    2. 为特定的列插入值(可以指定顺序,列-值对应):insert into 表名(字段1,字段2) values (值1,值2);
    3. 一次性插入多条记录:Insert into 表名(字段1,字段2) values (值1,值2),(值1,值2);
  2. 删除语句
    1. 使用delete语句:delete form 表名 [where 条件];如果没有指定where字句,MySQL表中的所有记录将被删除
    2. 使用truncate语句(不能增加where条件,清空所有数据):truncate table 表名
  3. 修改语句
    1. 修改全部数据:update 表名 set 字段名=值;
    2. 修改特定数据:update 表名 set 字段名=值 where 字段名2=值;
    3. 多字段条件修改
      1. update 表名 set 字段名1=值1,字段名2=值2 [where 条件]   可以同时更新一个或多个字段
      2. eg:
        1. 当我们需要将字段中的特定字符串批量修改为其他字符串时:
        2. update 表名 set 字段名=replace(字段名,‘旧字符’,‘新字符’)[where 条件]
  4. 查询语句
    select 字段1,字段2
    from 表名
    where ...
    group by ...
    having ...
    order by ...
    
    通用语法:
            select 字段1,字段2 from 表名 where 条件 
            - 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件
            - SELECT 命令可以读取一条或者多条记录
            - 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
            - 可以使用 LIMIT 属性来设定返回的记录数
            - 可以使用order by 字段 desc/asc进行排序
            - 可以使用group by 字段名 进行分组
    执行顺序:
        from指定数据来源
        where 指定条件,进行筛选
        group by 将数据进行分组
        聚合函数
        having 筛选分组
        order by 排序

五.2 MYSQL常见的关键字、函数

  1. 关键字
    1. like 模糊查询
    2. between 在x和x之间
    3. order by 排序,升序(asc),降序(desc)
    4. select 查询
    5. distinct 去重
    6. where 对查询数据进行条件约束
      =                     等于
      <>或者!=                 不等于
      >                     大于
      <                     小于
      >=                    大于等于
      <=                    小于等于
      
    7. between and 在某个范围内

    8. LIKE 搜索某种模式

    9. and & or & not 逻辑运算符

    10. limit 分页

    11. in 规定多个值

    12. exists 存在

    13. as 别名

    14. having 字句(增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用)

    15. is null 空值

    16. is not null 非空

    17. group by 分组(筛选分组结果)

      1、在使用group by 字句时,可用having字句为分组统计进一步设置统计条件,
         having字句与group by字句的关系相当于where字句与select字句之间的关系
      2、余where字句的区别是,在having字句中是以聚合函数的统计结果为筛选条件
  2. 函数

    1. 聚合函数

      1. sum 求和

      2. count 统计个数

      3. max\min 最大值、最小值

      4. avg 平均值

        聚合函数 支持的数据类型 描述
        sum() 数字 对指定列中的所有非空值求总和
        avg() 数字 对指定列中的所有非空值求平均值
        min() 数字、字符、datetime 返回指定列中的最小数字、最小的字符串、最早的日期
        max() 数字、字符、datetime 返回指定列中的最大数字、最大的字符串、最近的日期
        count() 任意基于行的数据类型 统计结果集合中全部记录行的数量
    2. 日期和时间函数

      1. 返回当前日期

        1. curdate()

        2. current_date()

        3. curdate()+0 可以将当前日期转换为数值型

      2. 返回当前时间

        1. curtime()

        2. current_time()

        3. current_time()+0 可以将当前时间转换为数值型

      3. 返回当前日期和时间

        1. current_timestamp()

        2. lacaltime()

        3. now()

        4. sysdate()

      4. 获取月份

        1. month(date)

        2. monthname(date)

      5. 获取星期

        1. dayname(date)

        2. dayofweek(date)

        3. weekday(date)

        4. week(date)

        5. weekofyear(date)

      6. 获取天数

        1. dayofyear(date)

        2. dayofmonth(date)

      7. 获取年、季度、小时、分钟、秒

        1. year(date)

        2. quarter(date)

        3. minute(time)

        4. second(time)

    3. 数学函数

      1. 绝对值

        1. abs(数值)

      2. 符号

        1. sign(数值)

      3. 获取随机数

        1. rand(数值)

        2. rand

      4. 获取整数的函数

        1. ceil(数值)/ceiling(数值)

        2. floor(数值)

      5. 四舍五入函数

        1. round(数值)

        2. round(数值,小数位个数)

        3. truncate(数值,小数位个数)

      6. 求余数

        1. mod(数值,被除数)

      7. 幂运算函数

        1. pow(数值,小数位个数)

        2. power(数值,小数位个数)

        3. exp(数值)

        4. sqrt(数值)

      8. 角度弧度互换函数

        1. radians(数值)

        2. degrees(数值)

      9. 圆周率函数

        1. pi()

      10. 三角函数

        1. sin(数值)

        2. asin(数值)

        3. cos(数值)

        4. acos(数值)

        5. tan(数值)

        6. atan(数值)

        7. cot(数值)

    4. 字符串函数

      1. 计算字符数和字符串长度

        1. char_length(s) 字符

        2. length(s) 字节

      2. 合并字符串函数

        1. concat(s1,s2)如果一个字符为空,则值为空

        2. concat_ws(分隔符,s2,s3)

      3. 替换字符串函数

        1. insert(s1,s1的下标位置,截止数,s2代替字符)

        2. replace(s,原字符串,代替字符串)

      4. 截取字符串的函数

        1. left(s,左侧个数)

        2. right(s,右侧个数)

      5. 重复生成字符串ha函数

        1. repeat(s,n)

      6. 大小写转换函数

        1. lower(x)大--小

        2. lcase(x)大--小

        3. upper(x)小--大

        4. ucase(x)小--大

      7. 填充字符串的函数

        1. lpad(s1,len,s2)

        2. rpad(s1,len,s2)

      8. 删除空格函数

        1. ltrim(s)

        2. rtrim(s)

        3. trim(s)

      9. 获取子字符串

        1. subsring(s,n,len)

        2. mid(s,n,len)

      10. 返回指定位置字符串函数

        1. elt(n,s1,s2...)

      11. 返回指定字符串位置

        1. field(s,s1,s2...)

    5. 系统函数

      1. 获取mysql数据库版本号

        1. version()

      2. 查看当前用户的连接数

        1. connection_in()

      3. 查看当前所有数据库

        1. database()

        2. schema()

      4. 获取用户名的函数

        1. user()

        2. current_user()

        3. system_user()

        4. session_user()

五.3  MYSQL多表连接

主要分:内连接(等值连接),外连接(左向外连接,右向外连接),交叉连接,联合连接,自然连接

  1. 内连接(inner join)
    1. 有两种,显式和隐式
    2. 返回连接表中符合连接条件和查询条件的数据行
    3. 相连接的两张表地位平等
    4. 所谓的链接表就是数据库在做ch查询形成的中间表
      隐式的内连接,没有inner join, 形成的中间表为俩个表的笛卡尔积
          from字句后面直接出现多个表名,这种连接方式就是因室内连接
      显式的内连接,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积
          select * from table1 [inner] join table2 on table1.col = table2.col
    5. 如果一张表中在另一张表中不存在对应数据,则不做连接
  2.  外链接
    1. 外链接可以是左向外连接、右向外链接或全外连接(mysql不支持全外连接)

    2. 区别

      1. outer 关键字是可省略的

      2. 共同点是都返回符合连接条件和查询条件的数据行

      3. 不通点:

        1. 左外链接还返回左表中不符合连接条件但符合查询条件的数据行

        2. 右外连接还返回右表中不符合连接条件但符合查询条件的数据行

        3. 全外连接还返回左表中不符合连接条件但符合查询条件的数据行,并且还返回右表中不符合连接条件但符合查询条件的数据行。全外连接实际是左外连接和右外连接的数学集合(去掉重复),即全外=“左外 union 右外”

      4. 在from子句中指定外连接时,可以由下列几组关键字中的一组指定:

        1. left join 或 left outer join

          1. 左向外连接的结果集包括 left outer 子句中指定的做表的所有行,而不仅仅是连接列所匹配的行。

          2. 如果左表的某行在右表中没有匹配行,则在相关联的结果集合中右表的所有选择列表均为空值

        2. right join 或 right outer join

          1. 右向外连接是左向外连接的反向连接

          2. 将返回右表的所有行

          3. 如果右表的某行在左表中没有匹配行,则将为左表返回空值

        3. full join 或 full outer join 

          1. 完整外部连接返回左表和右表的所有行

          2. 当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值

          3. 如果表之间没有匹配行,则整个结果集行包含基表的数据值

      5. 外连接特点

        1. 做连接的两个表地位不平等,其中有一张是基础表

        2. 基础表中的每条数据必须出现,即使另一张表中没有数据与之匹配,也要用null补齐

        3. 左外连接时左表时基础表,右外连接时右表时基础表

        4. 语句中先出现的表为“左表”,后出现的表为“右表”

  3. 交叉连接

    - 交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
    - 交叉联接也称作笛卡尔积
    - 显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积
        - 隐式的交叉连接,没有CROSS JOIN
        - 显式的交叉连接,使用CROSS JOIN。
  4. 联合连接(union all)

    1. oracle、mysql均不支持

    2. 在数据分析中排错中比较常用

    3. 作用与特点

      1. 可以把多条查询语句所产生的结果集纵向连接为一体

      2. 有all关键词可以显示全部数据(即重复的也显示出来)

      3. 列的数量与类型都要兼容

  5. 自然连接(natural inner join)

    1. sql2标准中定义

    2. 几乎不用

五.4  MYSQL字段索引

  • MySQL做一年的建立对于mysql的高效运行是很很重的,索引可以大大提高MySQL的检索速度。
  • eg:
    • 如果合理的设计且使用索引的mysql是一辆兰博基尼的话,那么没有设计和使用苏欧锦的mysql就是一个脚蹬三轮车
  • 索引分:单列索引、组合索引
    • 单列索引:即一个索引值包含单个列,一个表可以由多个单列索引,但这不是组合索引。
    • 组合索引:即一个索引包含多个列。
  • 索引应用:
    • 该索引应用在sql查询语句的条件(一般作为where字句的条件)
    • 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
  • 索引缺点:
    • 过多的使用索引将会造成滥用。
    • 虽然缩影大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete。
    • 因为更新表时,mysql不仅要保存数据,还要保存一下索引文件。
    • 建立索引会占用磁盘空间的索引文件。
  1. 普通索引
    1.  这是最基本的索引,它没有任何限制
    2. 创建索引
      create index indexName on 表名(字段名(length));
      
      如果是char,varchar类型,length可以小于字段实际长度;
      如果是blob和text类型,必须指定length。
    3. 修改表结构(添加索引)
      alert table 表名 add index indexName(字段名)
    4. 创建表的时候,指定索引字段
      create table 表名(
          id int not null,
          字段名 varchar(16) not null,
          index [indexName] (字段名(length))
      );
    5. 删除索引
      drop index [indexName] on 表名;
  2. 唯一索引
    1. 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
      1. 创建索引
        create unique index indexName on mytable(username(length))
        
      2. 修改表结构
        alter table mytable add unique [indexName] (username(length))
      3. 创建表的时候直接指定
        create table mytable(
            id int not null,
            username varchar(16) not null,
            [indexName] (uesrname(length))
        );
  3. 使用alter命令添加和删除索引
    1. 有四种方式来添加数据表的索引:
      1. alter table tablename add primary key(columnlist)
        1. 该语句添加一个逐渐,这意味着索引值必须是唯一的,且不能为null。
      2. alter table tblname add unique indexname (column_list)
        1. 这条语句创建索引的值必须是唯一的(除了null外,null可能会出现多次)。
      3. table tblname add index indexname(column_list)
        1. 添加普通索引,索引值可出现多次。
      4. alter table tblname add fulltext indexname(column_list)
        1. 该语句指定了索引为 fulltext,用于全文索引。
  4. 使用alter 命令添加和删除主键
    1. 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(not null)
      1. alter table testalter_tbl modify i int not null;
      2. alter table testalter_tbl add primary key(i);
    2. 你可以使用alter命令删除主键
      1. alter table testalter_tbl drop primary key;
      2. 删除主键时只需指定primary key,但在删除索引时,你必须知道索引名。
  5. 显示索引信息
    1. 可以使用show index 命令来列出表中的相关的索引信息。可以通过添加\G 来格式化输出信息
      1. show index from table_name \G

五.5  mysql锁、表引擎

  • 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。
  • 在DBMS中,可以按照锁的粒度把数据库锁分为:
    • 行级锁(innodb引擎)
    • 表级锁(myisam引擎)
    • 页级索(bdb引擎)
  1. 行级锁
    1. 行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但是加锁的开销最大。行级锁分为共享锁和排它锁。
    2. 特点:
      1. 开销大,加锁慢
      2. 会出现死锁
      3. 锁粒度最小,发生锁冲突的概率最低,并发度也最高
  2. 表级锁
    1. 表级锁是mysql中锁定粒度最大的一种锁,表示多当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。最常用的myisam与innodb都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排它锁)。
    2. 特点:
      1. 开销小,加锁快
      2. 不会出现死锁
      3. 锁定粒度大,发生锁冲突的概率最高,并发度最低。
  3. 页级索
    1. 页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁
    2. 特点:
      1. 开销和加锁时间介于表级锁和行级锁之间
      2. 会出现死锁
      3. 锁定粒度介于表级锁和行级锁之间,并发度一般

猜你喜欢

转载自blog.csdn.net/is_chenzh/article/details/82114097