• MySQL数据库基础


    数据库的一些概念题:

    DB DBMS 和DBS三者之间的关系

    DBS(数据库系统) 包含DB(数据库)和DBMS(数据库管理系统)

    DB:是指datebase(数据库)
    DBS:是指datebase systerm (数据库系统)
    DBMS:是指datebase mangement systerm(数据库管理系统)
    区别:数据库就是存放数据的仓库,数据库管理系统就是用来管理数据库的,其中数据库系统是一个通称,包括数据库、数据库管理系统、数据库管理人员等的统称,是最大的范畴。

    常见存储引擎的类型

    需改表alter

    4.修改表结构:
            语法:
                1. 修改表名
                    ALTER TABLE 表名
                                        RENAME 新表名;
                2. 增加字段
                      ALTER TABLE 表名
                                          ADD 字段名  数据类型 [完整性约束条件…],
                                          ADD 字段名  数据类型 [完整性约束条件…];
                      ALTER TABLE 表名
                                          ADD 字段名  数据类型 [完整性约束条件…]  FIRST;
                      ALTER TABLE 表名
                                          ADD 字段名  数据类型 [完整性约束条件…]  AFTER 字段名;
                3. 删除字段
                      ALTER TABLE 表名
                                          DROP 字段名;
                4. 修改字段
                      ALTER TABLE 表名
                                          MODIFY  字段名 数据类型 [完整性约束条件…];
                      ALTER TABLE 表名
                                          CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
                      ALTER TABLE 表名
                                          CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

     外键的设置

    在员工表里面先设置 emp_id的字段然后再关联 emp表里面的字段

    1、安装mysql和navicat

    2、Mysql数据语法学习

    数据库的种类:关系型数据库和非关系型数据库

    mysql数据库的操作

    查看数据库
    
    show databases;
    
    show create database db1;
    
    select database();
    
    选择数据库
    
    USE 数据库名
    
    删除数据库
    
    DROP DATABASE 数据库名;
    
    修改数据库
    
    alter database db1 charset utf8;

     查入数据insert

    1. 插入完整数据(顺序插入)
        语法一:
        INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
    
        语法二:
        INSERT INTO 表名 VALUES (值1,值2,值3…值n);
    
    2. 指定字段插入数据
        语法:
        INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
    
    3. 插入多条记录
        语法:
        INSERT INTO 表名 VALUES
            (值1,值2,值3…值n),
            (值1,值2,值3…值n),
            (值1,值2,值3…值n);
    
    4. 插入查询结果
        语法:
        INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                        SELECT (字段1,字段2,字段3…字段n) FROM 表2
                        WHERE …;

    更新数据UPDATE

    语法:
        UPDATE 表名 SET
            字段1=值1,
            字段2=值2,
            WHERE CONDITION(条件);
    
    示例:
        UPDATE mysql.user SET password=password(‘123’) 
            where user=’root’ and host=’localhost’;

    一定要加where

    mysql表的操作

    表的数据类型:

    #1. 数字:
        整型:tinyinit  int  bigint
        小数:
            float :在位数比较短的情况下不精准
            double :在位数比较长的情况下不精准
                0.000001230123123123
                存成:0.000001230000
    
            decimal:(如果用小数,则用推荐使用decimal)
                精准
                内部原理是以字符串形式去存
    
    #2. 字符串:
        char10):简单粗暴,浪费空间,存取速度快
            root存成root000000
        varchar:精准,节省空间,存取速度慢
    
        sql优化:创建表时,定长的类型往前放,变长的往后放
                        比如性别           比如地址或描述信息
    
        >255个字符,超了就把文件路径存放到数据库中。
                比如图片,视频等找一个文件服务器,数据库中只存路径或url。
    
    
    #3. 时间类型:
        最常用:datetime
    
    
    #4. 枚举类型与集合类型
    enum('male','female')
    set('play','music','read','study')
    MariaDB [db1]> create table consumer( 
        -> name varchar(50),
        -> sex enum('male','female'),
        -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定范围内,多选一
        -> hobby set('play','music','read','study') #在指定范围内,多选多
        -> );

    表的约束

    #1、建立表关系:
        #先建被关联的表,并且保证被关联的字段唯一 #----- 父表--------
        create table dep(
            id int primary key,
            name char(16),
            comment char(50)
        );
    部门表和员工表    foreign key设置在员工表
    
        #再建立关联的表
        create table emp(
            id int primary key,
            name char(10),
            sex enum('male','female'),
            dep_id int,
            foreign key(dep_id) references dep(id) 
            on delete cascade # 删除同步 只要被关联的 ,关联的 也删除 解散it部门,其他关联it部门的员工也删除
            on update cascade # 更新同步,
        );

    表与表之间的关系

    分析步骤:
    #1、先站在左表的角度去找
    是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key(外键) 右表一个字段(通常是id)
    
    #2、再站在右表的角度去找
    是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
    
    #3、总结:
    #多对一:
    如果只有步骤1成立,则是左表多对一右表
    如果只有步骤2成立,则是右表多对一左表
    
    #多对多
    如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
    
    #一对一:
    如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可

    mysql字段的操作

    mysql表的查询

    单表查询和多表查询

    select count(学号)  as “总人数” FROM student;

    这个as可以写也可以不写
    单表查询:
        http://www.cnblogs.com/linhaifeng/articles/7267592.html
        1.单表查询的语法
        2.关键字的执行优先级(重点)
        3.简单查询
        4.where 约束
        5.分组查询:group by 在where之后查询
        6.having 过滤
        7.查询排序:order by
    8.限制查询得记录数:limit
        9.使用正则表达式查询

    多表查询:

    
    
    SELECT DISTINCT <select_list>
    FROM <left_table>
    <join_type> JOIN <right_table>
    ON <join_condition>
    WHERE <where_condition>
    GROUP BY <group_by_list>
    HAVING <having_condition>
    ORDER BY <order_by_condition>
    LIMIT <limit_number>

    内连接:只取两张表的共同部分
    select * from employee inner join department on employee.dep_id = department.id ; 左连接:在内连接的基础上保留左表的记录 select * from employee left join department on employee.dep_id = department.id ; 右连接:在内连接的基础上保留右表的记录 select * from employee right join department on employee.dep_id = department.id ; 全外连接:在内连接的基础上保留左右两表没有对应关系的记录 select * from employee full join department on employee.dep_id = department.id ; select * from employee left join department on employee.dep_id = department.id union select * from employee right join department on employee.dep_id = department.id ;

    7.4 使用事务保证数据完整性

    事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。

    注意:

    MySQL事务处理只支持InnoDB和Berkeley DB数据表类型

    ACID,指数据库事务正确执行的四个基本要素的缩写。
    包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
    一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性。
    使用场景:
        银行的交易系统

    原子性:执行事务要么都成功,要么都不成功

    一致性:执行后,保存数据的一致性

    隔离性:事务之间相互独立,互不影响

    持久性:数据永远存储在数据库中

    start transaction = begin等效

    start transaction;
    update user set balance=900 where name='wsb'; #买支付100元
    update user set balance=1010 where name='egon'; #中介拿走10元
    update user set balance=1090 where name='ysb'; #卖家拿到90元
    commit;
    
    #出现异常,回滚到初始状态
    start transaction;
    update user set balance=900 where name='wsb'; #买支付100元
    update user set balance=1010 where name='egon'; #中介拿走10元
    uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
    rollback; # 回滚到原来的状态
    commit;  # 只有提交了,事务操作才完成

    问题:有没有遇到脏读问题,怎么解决,用事务(隔离级别处理),事务是什么?

    查看默认事务隔离级别

    select @@tx_isolation;

     如何关闭和开启MySQL的自动提交?

    在MySQL中执行命令时,通常都直接被确定提交了。也就是说用户不用意识此事,所有的命令都会被自动COMMIT。特别是当存储引擎为MyISAM的情况下,本身它是不支持事务处理的,只要执行了命令,所有的命令部会被提交。
    
    这样的默认自动提交的功能就被称为自动提交功能。自动提交功能默认被置为ON的状态。但是,如果存储引擎为InnoDB 时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前可以执行ROLLBACK 命令回滚更新操作。
    
    用户可以将自动提交功能强制置为OFF。这样用户执行SQL语句后将不会被提交了,而执行COMMIT命令才提交,执行ROLLBACK命令回壤。
    
    下面是将自动提交功能置为ON以及置为OFF的具体语法。
    
    将自动提交功能置为ON
    
    SET AUTOCOMMIT=0;
    将自动提交功能置为OFF
    
    SET AUTOCOMMIT=1;
    我们将演示自动提交功能设置为OFF后,会出现的什么样的变化。置为OFF,我们向表user里插入一条数据后,看看是否能回滚。
    
    将自动提交功能设置为OFF,执行结果如下。
    
    mysql> SET AUTOCOMMIT=0;
    Query OK, 0 rows affected (0.00 sec)
    View Code

    MySQL的事务处理实现流程是什么?

    如果存储引擎为InnoDB 时,不需要

    将自动提交功能置为ON
    SET AUTOCOMMIT=0;
    1、关闭自动提交
    2、开始事务
    3、执行SQL语句操作
    4、要么rollback 要么commit
    如果存储引擎为InnoDB 时,当执行了START TRANSACTION或BEGIN命令(MySQL事务处理-删除后回滚)后,将不会自动提交了,只有明确执行了COMMIT命令后才会被提交,在这之前可以执行ROLLBACK 命令回滚更新操作。
    5、set autocommit=1;把提交变为初试状态

    7.5 使用DQL命令查询数据

    mysql语言的分类

    SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。
    
    1. 数据查询语言DQL
    数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
    子句组成的查询块:
    SELECT <字段名表>
    FROM <表或视图名>
    WHERE <查询条件>
    
    2 .数据操纵语言DML
    数据操纵语言DML主要有三种形式:
    1) 插入:INSERT
    2) 更新:UPDATE
    3) 删除:DELETE
    
    3. 数据定义语言DDL
    数据定义语言DDL用来创建数据库中的各种对象-----表、视图、
    索引、同义词、聚簇等如:
    CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
    | | | | |
    表 视图 索引 同义词 簇
    
    DDL操作是隐性提交的!不能rollback 
    
    4. 数据控制语言DCL
    数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
    数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
    1) GRANT:授权。
    
    
    2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
    回滚---ROLLBACK
    回滚命令使数据库状态回到上次最后提交的状态。其格式为:
    SQL>ROLLBACK;
    
    
    3) COMMIT [WORK]:提交。
    
    
        在数据库的插入、删除和修改操作时,只有当事务在提交到数据
    库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看
    到所做的事情,别人只有在最后提交完成后才可以看到。
    提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
    别说明这三种类型。
    
    
    (1) 显式提交
    用COMMIT命令直接完成的提交为显式提交。其格式为:
    SQL>COMMIT;
    
    
    (2) 隐式提交
    用SQL命令间接完成的提交为隐式提交。这些命令是:
    ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
    EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
    
    
    (3) 自动提交
    若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
    系统将自动进行提交,这就是自动提交。其格式为:
    SQL>SET AUTOCOMMIT ON;
    View Code

     练习:创建学生表、教师表、课程表、成绩表

    1、创建学生表:

    create table student(学号 int primary key not null ,姓名 char null,年龄 int not null,性别 enum('男','女'))

    2、创建教师表:

    create table teacher(教师编号 int primary key not null,教师姓名 char)

    3、创建课程表:与教师编号一对多关系

    create table class(课程编号 int primary key not null,

    课程名 char,教师编号 int,

    foreign key(教师编号) references teacher(教师编号) on delete cascade on update cascade);

    4、创建成绩表:成绩对应多个学生,成绩对应多个课程

    create table score(学号 int,课程编号 int,成绩 int,foreign key(学号) references student(学号) on delete cascade on update cascade,

    foreign key(课程编号) references class(课程编号) on delete cascade on update cascade);

    插入数据:

    插入学生数据:

    insert into student(学号,姓名,年龄,性别) values(1001,'张三',10,'男'),(1002,'李四',11,'女')

  • 相关阅读:
    c++读取文本文件
    C++在设计和使用智能指针
    spring mvc 控制器方法传递一些经验对象的数组
    unity3D实际的原始视频游戏开发系列讲座10它《战斗:外来入侵》在第一季度游戏开发
    Docker安装应用程序(Centos6.5_x64)
    VC和gcc在保证功能static对线程安全的差异变量
    POJ 1252 Euro Efficiency
    extjs_03_grid(添加数据)
    BZOJ 1212 HNOI2004 L语言 AC自己主动机(Trie树)+动态规划
    OpenGL开发时,fatal error C1083: 无法打开包括文件:“glglut.h”: No such file or directory
  • 原文地址:https://www.cnblogs.com/foremostxl/p/11112394.html
Copyright © 2020-2023  润新知