zoukankan      html  css  js  c++  java
  • 数据库的操作

    一、DDL:操作数据库、表

    一、操作数据库(CRUD)
        1、C(Create):创建
            * 创建数据库:
                * create database 数据库名称;
            * 创建数据库,判断不存在,再创建:
                * create database if not exists 数据库名称;
            * 创建数据库,并指定字符集
                * create database 数据库名称 character set 字符集名;
    
            * 练习:创建db4数据库,判断是否存在,并制定字符集为gbk
                * create database if not exists db4 character set gbk;
        2、R(Retrieve):查询
            * 查询所有数据库的名称:
                * show databases;
            * 查询某个数据库的字符集:查询某个数据库的创建语句
                * show create database 数据库名称;
        3、U(Update):修改
            * 修改数据库的字符集
                * alter database 数据库名称 character set 字符集名称;
        4、D(Delete):删除
            * 删除数据库
                * drop database 数据库名称;
            * 判断数据库存在,存在再删除
                * drop database if exists 数据库名称;
        5、使用数据库
            * 查询当前正在使用的数据库名称
                * select database();
            * 使用数据库
                * use 数据库名称;
    
    二、操作表
        1、C(Create):创建
            1、语法:
                create table 表名(
                    列名1 数据类型1,
                    列名2 数据类型2,
                    ...
                    列名n 数据类型n,
                );
                * 注意:最后一列,不需要加逗号(,)
                * 数据库类型:
                    1int:整数类型
                        * age int,
                    2double:小数类型
                        * score double(5,2)
                    3、date:日期,只包含年月日,yyyy-MM-dd
                    4、datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
                    5、timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd HH:mm:ss
                        * 如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
                    6、varchar:字符串
                        * name varchar(20):姓名最大20个字符
                        * zhangsan 8个字符 张三 2个字符
    
    
                * 创建表
                    create table student(
                        id int,
                        name varchar(32),
                        age int,
                        score double(4,1),
                        birthday date,
                        insert_time timestamp,
                    );
                * 复制表
                    * create table 表名 like 被复制的表名;
        2、R(Retrieve):查询
            * 查询某个数据库中所有的表名称
                * show tables;
            * 查询表结构
                * desc 表名;
        3、U(Update):修改
            1、修改表名
                alter table 表名 rename to 新的表名;
            2、修改表的字符集
                alter table 表名 character set 字符集名称;
            3、添加一列
                alter table 表名 add 列名 数据类型;
            4、修改列名称 类型
                alter table 表名 change 列名 新列名 新数据类型;
                alter table 表名 modify 列名 新数据类型;
            5、删除列
                alter table 表名 drop 列名;
        4、D(Delete):删除
            * drop table 表名;
            * drop table if exists 表名;
    
        5、约束
            * 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
            * 分类:
                1、主键约束:primary key
                2、非空约束:not null
                3、唯一约束:unique
                4、外键约束:foreign key
            * 非空约束:not null
                1、创建表时添加约束
                    CREATE TABLE stu(
                        id INT,
                        NAME VARCHAR(20) NOT NULL -- name为空
                    );
                2、创建表完后,添加非空约束
                    ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
                3、删除name的非空约束
                    ALTER TABLE stu MODIFY NAME VARCHAR(20);
            * 唯一约束:unique,值不能重复
                1、创建表时,添加唯一约束
                    CREATE TABLE stu(
                        id INT,
                        phone_number VARCHAR(20) UNIQUE -- 添加了唯一的约束
                    );
                    * 注意mysql中,唯一约束限定的列的值可以有多个null
                2、删除唯一约束
                    ALTER TABLE stu DROP INDEX phone_number;
                3、在创建表后,添加唯一约束
                    ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
            * 主键约束:primary key。
                1、注意:
                    1、含义:非空且唯一
                    2、一张表只能有一个字段为主键
                    3、主键就是表中记录的唯一标识
                2、在创建表时,添加主键约束
                    create table stu(
                        id int primary key, -- 给id添加主键约束
                        name varchar(20)
                    );
                3、删除主键
                    -- 错误 alter table stu modify id int;
                    ALTER TABLE stu DROP PRIMARY KEY;
                4、创建完表后,添加主键
                    ALTER TABLE stu MODIFY id INT PRIMARY KEY;
                5、自动增长:
                    1、概念:如果某一列是数值类型的,使用auto_increment可以来完成值得自动增长
                    2、在创建表时,添加主键约束,并且完成主键自增长
                    create table stu(
                        id int primary key auto_increment, -- 给id添加主键约束
                        name varchar(20)
                    );
                    3、删除自动增长
                    ALTER TABLE stu MODIFY id INT;
                    4、添加自动增长
                    ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
            * 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
                1、在创建表时,可以添加外键
                    * 语法:
                        create table 表名(
                            ...
                            外键列
                            constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
                        );
                2、删除外键
                    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
                3、创建表之后,添加外键
                    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
                4、级联操作
                    1、添加级联操作
                        语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
                                FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
                    2、分类:
                        1、级联更新:ON UPDATE CASCADE
                        2、级联删除:ON DELETE CASCADE

    二、DML:增删改表中数据

    1、添加数据:
        * 语法:
            * insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
        * 注意:
            1、列名和值要一一对应。
            2、如果表名后,不定义列名,则默认给所有列添加值
                insert into 表名 values(值1,值2,...值n);
            3、除了数字类型,其他类型需要使用引号(单双都可以)引起来
    2、删除数据:
        * 语法:
            * delete from 表名 [where 条件]
            * 注意:
                1、如果不加条件,则删除表中所有记录。
                2、如果要删除所有记录
                    1、delete from 表名; -- 不推荐使用。有多少条记录就会执行多少次删除操作
                    2、truncate table 表名; -- 推荐使用,效率更高 先删除表,然后再创建一张一样的表。
    3、修改数据:
        * 语法:
            * update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
    
        * 注意:
            1、如果不加任何条件,则会将表中所有记录全部修改。

    三、DQL:查询表中的记录

    * select * from 表名;
    
    1、语法:
        select
            字段列表
        from
            表名列表
        where
            条件列表
        group by
            分组字段
        having
            分组之后的条件
        order by
            排序
        limit
            分页限定
    
    2、基础查询
        1、多个字段的查询
            select 字段名1,字段名2... from 表名;
            * 注意:
                * 如果查询所有字段,则可以使用*来替代字段列表。
        2、去除重复:
            * distinct
        3、计算列
            * 一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
            * ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
                * 表达式1:哪个字段需要判断是否为null
                * 如果该字段为null后的替换值。
        4、起别名:
            * as:as也可以省略
    
    3、条件查询
        1、where子句后跟条件
        2、运算符
            * >、<、<=、>=、=、<>
            * BETWEEN...AND
            * IN(集合)
            * LIKE:模糊查询
                * 占位符:
                    * _:单个任意字符
                    * %:多个任意字符
            * IS NULL:null值不能使用【=/!=】判断,使用【IS NULL/IS NOT NULL】判断
            * and 或 &&
            * or 或 ||
            * not 或 !
    
    4、排序查询
        * 语法:order by子句
            * order by 排序字段1 排序方式1, 排序字段2 排序方式2...
        * 排序方式:
            * ASC:升序,默认的。
            * DESC:降序。
        * 注意:
            * 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
    
    5、聚合函数:将一列数据作为一个整体,进行纵向的计算
        1、count:计算个数
            1、一般选择非空的列:主键
            2、count(*)
        2、max:计算最大值
        3、min:计算最小值
        4、sum:计算和
        5、avg:计算平均值
        * 注意:聚合函数的计算,排除null值
            解决方案:
                1、选择不包含非空的列进行计算
                2、IFNULL函数
    
    6、分组查询:
        1、语法:group by 分组字段;
        2、注意:
            1、分组之后查询的字段:分组字段、聚合函数
            2、where和having的区别?
                1、where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
                2、where后不可以跟聚合函数,having可以进行聚合函数(聚合函数可以取别名)的判断
    
    7、分页查询
        1、语法:limit 开始的索引,每页查询的条数;
        2、公式:开始的索引=(当前的页面-1)*每页显示的条数
        3、limit是一个MySQL"方言"

    四、DCL:管理用户,授权

    1、管理用户
        1、添加用户:
            * 语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
        2、删除用户:
            * 语法:DROP USER '用户名'@'主机名';
        3、修改用户密码
            * UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
                UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
            * SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
                SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
            * mysql中忘记了root用户的密码?
                1、cmd -- > net stop mysql 停止mysql服务
                    * 需要管理员运行该cmd
                2、使用无验证方式启动mysql服务:mysqld --skip-grant-tables
                3、打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
                4、use mysql;
                5、update user set password = password('你的新密码') where user = 'root';
                6、关闭两个窗口
                7、打开任务管理器,手动结束mysqld.exe的进程
                8、启动mysql服务
                9、使用新密码登录。
        4、查询用户:
            1、切换到mysql数据库
                USE mysql;
            2、查询user表
                SELECT * FROM USER;
            * 通配符:%表示可以在任意主机使用用户登录数据库
    
    2、权限管理:
        1、查询权限:
            * SHOW GRANTS FOR '用户名'@'主机名';
                SHOW GRANTS FOR 'lisi'@'%';
        2、授予权限:
            * grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
                GRANT ALL ON *.* TO 'zhangsan'@'localhost';
        3、撤销权限
            * revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
                REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';

    五、数据库的备份和还原

    语法:
        * 备份:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
        * 还原:
            1、登录数据库
            2、创建数据库
            3、使用数据库
            4、执行文件。source 文件路径

    六、多表查询

    1、内连接查询
        1、隐式内连接
            * 例如:
                * SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
        2、显示内连接
            * 语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件
            * 例如:
                * SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
    2、外连接查询
        1、左外连接:
            * 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
            * 查询的是左表所有数据以及其交集部分。
        2、右外连接:
            * 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
            * 查询的是右表所有数据以及其交集部分。
    3、子查询
        * 概念:查询中嵌套查询,称嵌套查询为子查询。
        * 子查询不同情况
            1、子查询的结果是单行单列的:
                * 子查询可以作为条件,使用运算符去判断。运算符:> >= < <= =
                SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
            2、子查询的结果是多行单列的:
                * 子查询可以作为条件,使用运算符in来判断
                SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');
            3、子查询的结果是多行多列的:
                * 子查询可以作为一张虚拟表参与查询
                SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id;

    七、事务

    1、事务的基本介绍
        1、概念:
            * 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
        2、操作:
            1、开启事务:start transaction;
            2、回滚:rollback;
            3、提交:commit;
        3、MySQL数据库中事务默认自动提交
            * 事务提交的两种方式:
                * 自动提交:
                    * mysql就是自动提交的
                    * 一条DML(增删改)语句会自动提交一次事务。
                * 手动提交:
                    * Oracle数据库默认是手动提交事务
                    * 需要先开启事务,再提交
            *修改事务的默认提交方式:
                * 查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
                * 修改默认提交方式:set @@autocommit = 0;
    2、事物的四大特征:
        1、原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
        2、持久性:当事务提交或回滚后,数据库会持久化的保存数据。
        3、隔离性:多个事务之间。相互独立。
        4、一致性:事务操作前后,数据总量不变
    3、事务的隔离级别(了解)
        * 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
        * 存在问题:
            1、脏读:一个事务,读取到另一个事务中没有提交的数据
            2、不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
            3、幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
        * 隔离级别:
            1、read uncommitted:读未提交
                * 产生的问题:脏读、不可重复读、幻读
            2、read committed:读已提交(Oracle)
                * 产生的问题:不可重复读、幻读
            3、repeatable read:可重复读(MySQL默认)
                * 产生的问题:幻读
            4、serializable:串行化
                * 可以解决所有的问题
            * 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
            * 数据库查询隔离级别:
                * select @@tx isolation;
            * 数据库设置隔离级别:
                * set global transaction isolation level 级别字符串;
  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/linding/p/13541257.html
Copyright © 2011-2022 走看看