日常积累--数据库基础知识 (MySQL)

MySQL数据库特点

较小的冗余度、较高的的数据独立性和易扩展性,并可为多个用户共享。

DBMS的主要功能

    操作对象:表
  1. 定义:DDL(数据库定义语言)create、alter、drop
  2. 操作:DML  insert、delete、update、select
  3. 保护:完整性、安全性
  4. 维护:表结构、数据

数据库系统DBS = DB + DBMS + 应用系统 + DBA + 用户

数据库发展的3个阶段

数据库类型
网状数据
层次数据库
关系数据库
数据库组织方式
网状模型
层次模型
关系模型
架构
图形结构
树形结构
简单二维表结构

数据管理技术的发展过程

人工管理阶段(20世纪50年代之前)
文件管理阶段(20世纪50年代末-60年代中)
数据库管理阶段(20世纪60年代末-现在)

实体-联系模型

实体:客观事物在信息世界中被称为实体
属性:描述实体的数据项
联系:反映事物内部或者事物之间的关系

名词解释

关系:二维表
元组:二维表的行(记录)
属性:二维表的列
域:属性的取值范围
关键字:关系中能唯一区分、确定不同元组的属性和属性组合
主键:唯一、不为空、不重复、针对一个表
外键:针对两个表

关系模式

关系模式:关系名(属性名1,属性名2,...,属性名n)
特点:规范化,属性不可再分割
           同一关系中,不允许出现相同的属性名
            同一关系中,元组和属性的顺序任意

关系运算

:行
:列
:从两个关系的笛卡尔积中选择属性间满足一定条件的元组,组成新的关系

关系的完整性约束

实体完整性:主键唯一、不重复、不为空
参照完整性(引用完整性):从表外键参照主表主键
域完整性(用户定义完整性):列的取值范围

范式(NF)

消除存储异常、减少数据冗余、保证数据的完整性和存储效率
一般为3NF
  1. 1NF:所有属性均为简单属性,即每个属性不可再分(无重复列)
  2. 2NF:如果关系R满足1NF,且每一个非主键字段完全依赖于主键,则称满足第二范式
  3. 3NF:如果关系R满足2NF,且非主键字段之间不存在依赖关系,则称R满足第三范式

E-R图

矩形——实体
椭圆——实体属性
菱形——实体间的联系

MySQL

数据库

查看现有数据库:show databases;
创建数据库:create database   <数据库名>;
删除数据库:drop database   <数据库名>;

建表

MySQL支持的数值类型:数值型、日期/时间型、字符串(字符)

   1.数值型  

        整数类型 int
        小数类型 decimal      格式:decimal(总长度,小数位)

    2.时间/日期型

      DATE: YYYY-MM-DD
      TIME: HH:MM:SS
      YEAR:YYYY
      DATETIME:YYYYY-MM-DD  HH:MM:SS
      TIMESTAMP(时间戳):YYYY MM DD HH MM SS

    3.字符串

        char、varchar、binary、varbinary、blob、text、enum、set
        格式:char(字符串长度)           定长
           varchar(字符串长度)           变长

4、创建表

create  table 表名(
                                属性名1  数据类型 [约束条件],
                                属性名2  数据类型 [约束条件],
                                属性名3  数据类型 [约束条件]
);                             /*  最后一个属性没有 ,*/

5、删除表

            drop table 表名1,表名2,...,表名n;

6、修改表

      添加属性(列):alter table 表名 add 属性名 数据类型;    /*alter ..  add*/
      删除属性:alter  table 表名 drop 属性名;/*alter ..  drop*/
      修改属性:alter table 表名 modify 属性名  数据类型;/*alter ..  modify*/
     修改字段名:alter table 表名 change 旧字段名 新字段名 数据类型;/*alter .. change*/

       显示表结构    desc 表名;

完整性约束

--实体完整性、

参照完整性、

用户自定义完整性约束

1、实体完整性约束

  •     添加主键约束(创建表时进行主键约束)
            (1)create table 表名(
                                        属性名1   数据类型    primary key,
                                        属性名2   数据类型,
                                        ...
                      );
                
           (2)create table 表名(
                                        属性名1   数据类型  ,
                                        属性名2   数据类型,
                                        ...
                                        constraint  主键约束的名字 primary key(属性名1)  /* 联合主键 primary key(属性名1,属性名2)*/
                      );

            (3)create table 表名(
                                        属性名1   数据类型 ,
                                        属性名2   数据类型,
                                        ...
                                        primary key(属性名1)     /* 联合主键 primary key(属性名1,属性名2)*/
                      );
  • 添加主键约束(已经存在的表)
     (1)alter table   表名   modify  列名  数据类型  primary key;
     (2)alter table   表名   add  primary key (列名);      /*联合主键  primary key(列名1,列名2)*/
     (3)alter  table  表名  add  constraint   主键约束名字  primary key(列名);      /*联合主键  primary key(列名1,列名2)*/

  • 删除主键的约束
    alter  table  表名  drop  primary key;

2、唯一性约束(unique)

        不允许有重复的值,保证数据的唯一性;
        可以有空值;
        在一个表中,可以有多个唯一约束;
        在默认情况下,唯一约束的名字和列名保持一致;
        添加唯一约束的列,系统默认给这个列添加一个唯一索引。
  • 创建表时创建唯一约束
       (1) create  table 表名(
                            列名1  数据类型,
                            列名2  数据类型,
                            constraint  唯一约束的名字 unique (列名)                            /*
                            );                                                                                     多个唯一约束: constraint  唯一约束的名字1 unique (列名1) ,
                                                                                                                        constraint  唯一约束的名字2 unique (列名2) ,
                                                                                                                         ....
                                                                                                                       */
    (2) create  table  表名(
                        列名1  数据类型  unique,
                        列名2  数据类型 ,
                        ...
                );

  • 对已经存在的表添加唯一约束
        alter table  表名 add  unqiue (列名);
  • 删除唯一约束
        alter  table  表名  drop  index  唯一约束名字;

3、域完整性约束(默认约束、非空约束)

  •     默认约束  default
        (1)创建表时默认约束 
                        create  table  表名(
                                        列名1   数据类型   default  '字符串类型或者日期类型的默认值',
                                        列名2   数据类型   default  数值型默认值,
                                        列名3  数据类型
                       );

        (2)对已存在的表添加默认约束
                    alter  table  表名  modify  列名  数据类型   default   默认值;

        (3)删除默认约束
                    alter  table  表名  modify  列名  数据类型;
  • 非空约束   not null
       (1)建表时设置
                    create  table  表名(
                                        列名1   数据类型  not null,
                                        列名2   数据类型   not null,
                                        列名3  数据类型
                       );

        (2)对已存在的表
                    alter  table  表名  modify  列名  数据类型   not null;

        (3)删除非空约束
                    alter  table  表名  modify  列名  数据类型;

3、参照完整性约束(primary key)

    表的外键值必须在主表中找到,主表中没有的数据,从表不能有操作
    若主表被从表参照,主表的记录将不允许删除,若删除数据,需先删除从表中依赖记录的数据
    外键构建于一个表的两个字段或两个表的两个字段之间的参照关系
    
       (1)建表时设置                        外键约束名:FK_名
                   create  table  表名2(
                                        列名1   数据类型 ,
                                        列名2   数据类型 ,
                                        列名3  数据类型,
                                        constraint  外键约束名  foreign key (从表的列名1) references  主表表名(列名1)
                       );
                PS:主表的列名和从表的列名可以不一样,但两个列的数据类型和内容必须一致

        (2)对已存在的表
                    alter  table  从表表名  add  constraint  外键约束的名字  foreign key (从表列名1)  references  主表表名(主表列名);

        (3)删除非空约束
                    alter  table  表名 drop  foreign key 外键约束的名字;

增删改查(insert、delete、alter、select)

1、Insert

      (1) insert  into 表名  (列名1,列名2,列名3,...)  values  (值1,值2,值3,...);
    (2)insert  into 表名   values  (值1,值2,值3,...);
    (2)insert  into 表名   values  (值1,值2,值3,...),(值1,值2,值3,...),(值1,值2,值3,...),...;

2、Delete

<di>删除的只是数据,保留表结构,drop删除数据与表结构 </di>
      (1) delete from 表名;
    (2)delete from 表名 where 条件;

3、Update...set...

      (1) update  表名 set  列名1 = 值1,列名2 = 值2,... ;
    (2)update  表名 set  列名 = 值  where 条件;

4、Select  (重点) 😎

       (1)select  列名 from 表名;/*执行顺序:先表后列*/

    (2)去重查询(distinct):select  distinct  列名 from 表名;

    (3)使用别名查询(as):select  列名1   as  '别名1',列名2  as  '别名2' ,... from 表名;

    (4)条件查询(where ... and ...):select  列名 from 表名 where 条件1 and 条件2;

    (5)范围   select  列名 from 表名 where 条件
                       条件:1) [not] between 开始值  and  结束值; /*包含开始值与结束值*/
                                  2) 列名  in  (值1,值2,值3,... ); /*只要满足其中一个就会有查询结果*/

    (6)字符通配符(like
              %  表示0个或多个字符
              _   表示一个字符

    (7)是否为空查询
            is null      is not null
        
    (8)聚合函数
            select  聚合函数 from 表名
            聚合函数:sum  avg  max  min ([distinct <列名>])        /*avg(默认保留4位小数)*/
                              count(*)     /*统计表中元组个数*/
                              count([distinct <列名>])        /*统计本列列值个数*/
                              /*除了  count(*) 之外,其他函数在计算过程中均忽略null值*/

    (9)行数限定
            select  列名1,列名2,... ,from 表名  limit [start,] nums ;   
            /*
            start:从第几行开始,可选,不写,则从0开始
            nums:总共要几行
            */    

    (10)数据分组   group by
            select  列名,聚合函数  from 表名 group by 列名;     

    (11)having
              select  列名,聚合函数  from 表名 group by 列名 having 条件;
            /*
            having 通常与 group by 子句一起使用
            相当于一个用于组的where条件,
            用于制定组的搜索条件,针对组。
            
            having可以包含聚合函数,但where不可以
            */ 

    (12)排序  order by(默认是 升序)
               降序:desc     升序:asc
               例:1)select  * from 表名 order by 列名 desc;
                      2)select  列名 from  表名 order by  列名1 asc ,列名2 desc;


MySQL函数

    (1)字符串函数
                length()     返回字符的字节长度
                char_length()    返回字符串的字符长度

                mid()   从某个位置获取某个长度的字符
                mid(列名,开始位置,要截取的长度)          /*开始位置最小值为1*/

    (2)数学函数
               round(参数)    实现四舍五入
               2个参数:round(数值,保留的小数位)
               1个参数:round(数值)     默认保留整数部分

                least()  求最小数字         
               greatest()   求取最大数字 
                /*上述两个函数与min(),max()的区别是,这两个函数必须传“具体数值”,例:least(1,2,3,4,5,6)*/

    (3)时间日期函数
               now()   可求得当前数据库服务器的当前日期时间
               current_date()   当前日期
               current_time()   当前时间

                to_days('日期')  将日期转化为天数
                dayofyear('日期')   该年已过了多少天
                week('日期')   当前时日是第几周

                例:select  now();

    (4)控制函数
                if(参数1,参数2,参数3); /* 参数1为空,输出参数3,输出参数2*/
              
                ifnull(参数1,参数2);     /*参数1为空,输出参数2,输出参数1*/

表连接

1、内连接

<di>返回的两个表中可以相互匹配的数据*/ </di>
       (1)select  表名1.列名,表名2.列名  from  表名1,表名2   where   表名1.列名 = 表名2.列名  and  条件1  and 条件2;
       (2)select  表名1.列名,表名2.列名  from   表名1  inner  join  表名2  on  表名1.列名 = 表名2.列名  and  条件1  and 条件2;
                innner join on   等值连接:条件中只包含等号“=”,没有其他符号
                                        非等值连接:条件中除了等号“=”之前,还有其他符号 >  <  >=  <=

2、外连接

<di>返回from子句提到的至少一个表或视图中的所有行*/ </di>
        左外连接:对连接条件中左边的表不加限制
        右外连接:对连接条件中右边的表不加限制

       (1)左外连接 left outer join : 包含左表所有行和连接所匹配的行,若右表中没有匹配行,则右表相应位置为null;
       (2)右外连接 left outer join : 包含右表所有行和连接所匹配的行,若左表中没有匹配行,则左表相应位置为null;

            select  表名.列名  from  表名 1  left outer join  表名2  on 表名1.列名 = 表名2.列名;

子查询

    select  列名 from 表名  where  列名  in (select 查询)

insert 与 select

/*将查询的结果插入到某一张表中*/
insert  into  表名  select查询;


update 与 select

update 表名 set 列名 where 列名 in (select查询)

delete 与 select

delete from  表名 where 列名 in (select 查询)

视图

/*
视图是一张虚表
对视图的更改会影响到实表
*/

create  view  视图名  as  select 语句;

alter  view  视图名  as  select语句;

索引

创建索引  create  [unoque] [cluster]  index  索引名  on 表名(列名); /*unique 唯一索引 , cluster 聚簇索引*/
修改索引  alter  index 旧索引名  rename  to  新索引名;
删除索引  drop index  索引名;

优点:加快查询速度、保证数据的唯一性、实现表与表之间的参照完整性、可以减少group by、order by、分组和排序的时间
缺点:降低了更新表时的速度,建立索引会占用磁盘空间(索引文件)




全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务