MySQL数据库基本操作总结(不断更新中......)

技术交流QQ群:1027579432,欢迎你的加入!

欢迎关注我的微信公众号:CurryCoder的程序人生

  • 1.登录mysql数据库: mysql -u root -p 输入密码

  • 2.登出mysql数据库: \q

  • 3.关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

  • 4.RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:

    • 数据以表格的形式出现
    • 每行是各种记录名称
    • 每列是记录名称所对应的数据域
    • 许多的行和列组成一张表单
    • 若干的表单组成database
  • 5.相关基本概念

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


    数据表.png
    • 表头(header): 每一列的名称;
    • 列(col): 具有相同数据类型的数据的集合;
    • 行(row): 每一行用来描述某条记录的具体信息;
    • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
    • 键(key): 键的值在当前列中具有唯一性。
  • 7.启动mysql数据库:

net start mysql
  • 8.列出 MySQL 数据库管理系统的数据库列表:
 show databases;
  • 9.选择要操作的mysql数据库,使用该指令后所有的mysql命令都只针对该数据库:
user 数据库名;
  • 10.列出已经选中的某个mysql数据库中的所有的数据表:
show tables;
  • 11.显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息:
show columns from 数据表名;
  • 12.显示数据表的详细索引信息,包括PRIMARY KEY(主键):
show index from 数据表名;
  • 13.输出Mysql数据库管理系统的性能及统计信息:
    show table status from 数据库名;    // 显示某个数据库中的所有表的信息
    show table status from 数据库名 like 'runob%';  // 表名以runob开头的表的信息
    show table status from 数据库名 like 'runob%'\G;  // 加上\G,查询结果按列打印
  • 14.创建数据库:
create database 数据库名;
  • 15.删除数据库:
drop database 数据库名;
  • 16.MySQL中的数据类型

  • MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

    • 数值类型

      • MySQL支持所有标准SQL数值数据类型,这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。


        基本整数类型.png
    • 日期和时间类型

      • 表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。TIMESTAMP类型有专有的自动更新特性,将在后面描述。


        日期时间类型.png
    • 字符串类型

      • 字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
      • BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
      • BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
      • 有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。


        字符串类型.png
  • 17.创建数据表

  • 创建MySQL数据表需要下面的信息:

    • 表名
    • 表字段名
    • 定义每个表字段
  • 创建表的语法如下:

    create table [if not exists] 表名(
        字段名称  数据类型,
        ...
        字段名称  数据类型
    )[表选项]
    表选项包括:字符集设定charset/character set、校对集设定collate具体字符集、engine具体存储引擎
    create table demo_table(
        demo_id int not null auto_increment,
        demo_title varchar(100) not null,
        demo_author varchar(40) not null,
        demo_date date,
        primary key(demo_id)   // 注意此处不要加,sho
    )engine=InnoDB default charset=utf8;
    
  • 18.删除数据表

  • 语法格式: drop table 数据表名;

    drop table demo_table;
    
  • 19.删除表内数据

  • 语法格式: delete from 表名 where 删除条件;

    // 删除学生表内姓名是张三的记录
    delete from student where name="张三";
    
  • 20.清除表内数据,但是表的结构不变,用truncate

  • 语法格式: truncate table 表名;

    truncate table student;   // 删除student表中的数据,但是保留数据表的结构
    
  • 当不再需要某个表的时候,用drop

  • 当仍然要保留该表时,但要删除所有记录时,用truncate

  • 当要删除部分记录时,用delete

  • 21.插入数据

  • 语法格式如下:

    insert into 表名
    (字段1,字段2, 字段3,...字段n)
    values
    ("学习python", "菜鸟教程", now());
    // 实例
    insert into demo_table
    (demo_id, demo_title, demo_auto, date)
    values
    (1, "player1", "库里", "1989-3-14");
    
  • 当所有列都要添加数据时,可以使用下面的语法:

    insert into 数据表名
    values
    (0, "playe2", "哈登", "1991-3-7-2");
    
  • 同时插入多条数据时,使用下面的方法:

    insert into 数据表名
    (字段1, 字段2, ..., 字段n)
    values
    (1, "player1", "库里", "1989-3-14")
    (2, "playe2", "哈登", "1991-3-7-2")
    
  • 读取数据表:

    select from demo_table;
    
读取数据表.png
  • 22.查询数据
  • 语法格式:
    select 字段名1, 字段名2, ...,字段名n 
    from 数据表名 
    [where clause] 
    [limit n] [offset m];
    
    • select *:返回所有记录
    • limit n:返回n条记录
    • offset m:跳过m条记录,默认m=0,单独使用不起作用
    • limit n,m:相当于limit m offset n:从第n条记录开始,返回m条记录
  • MySQL中的简单查询语句总结:
        select * from 表名;  /* 查询表所有数据 */
        select 字段名 from 表名;  /* 查询表字段数据 */
        select * from 表名 where 字段名 = "字段所对应的值";  /* 查询表字段下条件数据 */
        select * from 表名 where 字段名 like "需要匹配的字符%需要匹配的字符";   /* 模糊查询表下数据 */
        select * from 表名 where id between "1" and "5";   /* 查询表下字段范围数据 */
        select * from 表名 where name in ("字段1所对应的值", "字段2所对应的值");  /* 查询表字段下固定条件数据 */
        select distinct 字段名 from 表名;  /* 查询去重值 */
        select * from 表名 where 字段1 = "字段1所对应的值" and 字段2 > "字段2所对应的值";  /*查询表下范围条件数据*/
        select * from 表名 where 字段1 = "字段1所对应的值" or 字段1 = "字段1所对应的值" ; /* 查询表下条件不同值 */
        select * from 表名 order by 字段名;  /* 查询表下条件不同值 */
        select * from 表名 order by 字段名 desc;   /* 查询表下值排序结果 */
        select * from 表名 limit 2;   /* 查询表下范围数据 */
        select 字段名 as zzz from 表名;  /*别名查询表下数据*/
    
查询表所有数据.png

查询表字段数据.png

查询表字段下条件数据.png

模糊查询表下数据.png

查询表下字段范围数据.png

查询表字段下固定条件数据.png

查询去重值.png

查询表下范围条件数据.png

查询表下条件不同值.png

查询表下值排序结果.png

查询表下值排序降序结果.png

查询表下范围数据.png

别名查询表下数据.png
  • 关联查询语法:
        select 字段 from 表1 left join 表2 on 条件(一般是表1和表2之间的关联条件);  // 左关联:left join on 左边的表为主表 
        select 字段 from 表1 right join 表2 on 条件(一般是表1和表2之间的关联条件);  // 右关联:right join on 右边的表为主表 
    
  • 23.where子句
  • 有条件地从表中选取数据,可将where子句添加到select语句中,语法格式如下:
    select 字段1, 字段2, ..., 字段N from 表1, 表2, ... [where 条件1 [and [or]] 条件2 .....
    
    操作符.png
    • 查询语句中你可以使用一个或者多个表,表之间使用逗号分割,并使用where语句来设定查询条件
    • 可以在where子句中指定任何条件
    • 可以使用and或者or指定一个或多个条件
    • where子句也可以运用于sql的detele或者update命令
    • where子句类似于程序语言中的if条件,根据MySQL表中的字段值来读取指定的数据
  • 在MySQL数据表中读取指定的数据,where子句是非常有用的,使用主键来作为where子句的条件查询是非常快速的,如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据


    where条件查询.png
  • MySQL的where子句的字符串比较是不区分大小写的。 你可以使用binary关键字来设定where子句的字符串比较是区分大小写的!
    select * from demo_table where binary demo_author = "Curry";
    select * from demo_table where binary demo_author = "curry";
    
  • 24.update查询
  • 需要修改或更新MySQL中的数据,可以使用update命令来操作,语法格式如下:
    update 表名 set 字段1  = 新的值, 字段2 = 新的值 [where 从句];
    
    update查询语句.png
  • update语句作用:
    • 可以同时更新一个或多个字段
    • 可以在where子句中指定任何条件
    • 可以在一个单独表中同时更新数据
  • update替换某个字段中的某个字符,语句如下:
    update 表名 set 字段1 = replace(字段1, "旧的字符串", "新的字符串") [where 从句];
    
    update替换某个字段中的某个字符.png
  • 25.delete语句
  • 使用delete from命令来删除MySQL数据表中的记录,语法如下:
delete from 表名 [where 从句];
  • 说明:
    • 如果没有指定where从句,mysql表中的所有记录都会被删除
    • 可以在where从句中指定任何条件
    • 可以在单个表中一次性删除记录
  • delete、truncate、drop三者的区:
    • delete和truncate仅仅是删除表中的数据,表的结构还是会保留;drop是连表的数据和表结构一起删除。
    • delete是DML语句,操作完后如果不想提交事务还可以回滚;truncate和drop是DDL语句,操作完成后马上生效,不能回滚。
    • 执行速度上,drop>truncate>delete


      删除前.png

      删除后.png
  • 26.like子句
  • 经过上面的那些SQL语句可以知道,使用select来读取数据,同时可以在select语句中使用where从句来获取指定的记录。where从句中可以使用等号=来设定获取数据的条件,如"demo_autho"="库里"。但是有时候需要获取demo_date字段中含有"19"字符的所有记录,这时候需要在where从句中使用SQL语句中的like子句。SQL like子句中使用%来表示任意字符,类似于UNIX或正则表达式中的*,如果没有使用%,like子句与=的效果是一样的
  • like子句的语法如下:
select * from 表名 where 需要匹配的字段 like "要匹配的字符%要匹配的字符";
  • like匹配/模糊匹配,会与%和_结合使用:
    • '%a' // 以a结尾的数据
    • 'a%' // 以a开头的数据
    • '%a%' // 含有a的数据
    • '_a_' // 三位且中间字母是a的
    • '_a' // 两位且结尾字母是a的
    • 'a_' // 两位且开头字母是a的


      like子句.png
  • 27.union操作符----用于连接两个以上的select语句的结果组合到一个结果集合中。多个select语句会删除重复的数据。
  • union语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
  • union all语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
  • 使用形式如下:
        select 字段1 from 表名 union select 字段1 from 表名 order by 字段1;
        select 字段1 from 表名 union all select 字段1 from 表名 order by 字段1;
    
表1.png

表2.png

union实例.png

union all.png

带有where的union all.png
  • 28.order语句
  • 需要对读取的数据进行排序,可以使用MySQL的order by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
  • 语法格式:
        select 字段1, 字段2, ..., 字段n from 表1, 表2, ... order by 字段1, 字段2, ..., 字段n ASC(默认)/DESC;
    
order by.png

降序.png
  • 29.group by子句
  • group by语句根据一个或多个列对结果集进行分组,在分组的列上可以使用count,sum,avg等函数。
  • 语法格式:
select 字段名, function(字段名) from 表名 where 字段名 operator 字段对应的值 group by 字段名;
  • 千万注意字段名被``来包裹,不是''这个单引号!!!
    创建表.png

    插入数据.png

    查表.png

    group by.png
  • with rollup可以实现分组统计数据基础上再进行相同的统计(sum avg count)


    with rollup.png
  • 30.join语句的使用
  • 使用MySQL中的join语句在两个或多个表中查询数据,可以在select update delete语句中使用MySQL的join来联合多表查询,join按照功能可以分三大类:
    • inner join(内连接/等值连接):获取两个表中字段匹配关系的记录
    • left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录
    • right jon(右连接):获取右表所有记录,即使左表没有对应匹配的记录


      创建表1.png

      创建表2.png

      插入数据1.png

      插入数据2.png

      查询表1.png

      查询表2.png
  • 使用inner join来连接上面的两张表,读取runoob_tbl中所有的runoob_author字段在tcount_tbl表之后对应的runoob_count字段值:


    inner join表示.png

    inner join.png
  • left join会读取左表中的全部数据,即使右边表中无对应的数据,下面的实例中runoob_tbl是左表,tcount_tbl是右表


    left jon表示.png

    left join.png
  • right join会读取右表中的全部数据,即使左边表中无对应的数据,下面的实例中runoob_tbl是左表,tcount_tbl是右表


    right join表示.png

    right join.png
  • 31.NULL值的处理
  • MySQL使用select命令及where子句来读取数据表中的数据,但是当提供的查询条件字段为NULL时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:
    • IS NULL:当列的值是NULL,此运算符返回true
    • IS NOT NULL:当列的值不为NULL, 运算符返回true
    • <=>:比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true


      创建表.png

      插入数据.png

      查询数据.png
  • = 和 != 运算符是不起作用的


    不起作用.png
  • 查找数据表中runoob_test_tbl列是否为NULL,必须使用is null和is not null


    is null.png

    is not null.png
  • 32.MySQL中的正则表达式
  • 前面我们使用MySQL中的like ...%语句进行模糊匹配,MySQL中同样支持正则表达式的匹配,MySQL中使用regexp操作符来进行正则表达式匹配,下面是正则模式可应用于regexp操作符中。


    reg exp操作符.png
  • 实例1:查找name字段中以'st'为开头的所有数据
        select name from 表名 where name regexp '^st';
    
  • 实例2:查找name字段中以'ok'为结尾的所有数据
        select name from 表名 where name regexp 'ok$';
    
  • 实例3:查找name字段中包含'mar'字符串的所有数据
        select name from 表名 where name regexp 'mar';
    
  • 实例4:查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据
        select name from 表名 where name regexp '^[aeiou]|ok$';
    
  • 33.MySQL中的事务
  • MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,又要删除和该人员相关的信息,如信箱,文章等等。这样,这些数据库操作语句就构成一个事务!
    • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
    • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
    • 事务用来管理 insert,update,delete语句
  • 一般来说,事务是必须满足4个条件(ACID): 原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
    • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
    • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
  • 注意:在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作。因此要显式地开启一个事务务须使用命令BEGIN或START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交
  • 事务控制语句:
    • BEGIN 或 START TRANSACTION 显式地开启一个事务;
    • COMMIT也可以使用COMMIT WORK,二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
    • ROLLBACK也可以使用ROLLBACK WORK,二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
    • SAVEPOINT identifier,SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
    • RELEASE SAVEPOINT identifier删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
    • ROLLBACK TO identifier 把事务回滚到标记点;
    • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ U NCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
  • MySQL事务处理主要有两种方法:
    • 1.用BEGIN, ROLLBACK, COMMIT来实现
      • BEGIN 开始一个事务
      • ROLLBACK 事务回滚
      • COMMIT 事务确认
    • 2.直接用SET来改变MySQL的自动提交模式
      • SET AUTOCOMMIT=0 禁止自动提交
      • SET AUTOCOMMIT=1 开启自动提交
  • 事务实战如下:


    创建表.png

    查询表.png

    开始事务.png

    插入数据.png

    提交事务.png

    事务提交后—查询表.png

    回滚操作.png
  • 34.MySQL中的alter命令
  • 当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL alter命令。


    创建表.png

    查询字段.png
  • 删除、添加或修改表中字段
    • 使用alter命令及drop子句来删除上面的表的i字段,如果数据表中只剩余一个字段则无法使用drop来删除字段:


      删除字段.png
    • 使用add子句来向表中增加字段,下面是添加字段i,并定义数据类型,执行下面命令后,i字段会自动添加到数据表字段的末尾。


      添加字段.png
    • 指定新增字段的位置,可以使用MySQL提供的关键字first(设定位第一列),after 字段名(设定于某个字段之后)。


      指定位置增加字段.png

      指定位置增加字段1.png
  • 修改字段类型和名称:如果需要修改字段类型及名称, 你可以在alter命令中使用modify或change子句
    • 使用change子句, 语法有很大的不同。在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:


      修改字段类型和名称.png
    • 把字段c的类型从char(1)改为char(10),使用下面的命令:


      改变字段类型.png
  • 修改字段默认值


    修改字段默认值.png

    删除默认值.png
  • 修改数据表的类型


    修改数据表类型.png
  • 修改表名


    修改表名字.png
  • 修改存储引擎
        alter table 表名 engine=myisam;
    
  • 删除外键约束
        alter table 表名 drop foreign key 外键名;
    
  • 35.MySQL中的索引
  • MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
  • 索引的分类:
    • 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
    • 组合索引:即一个索引包含多个列。
  • 创建索引时,你需要确保该索引是应用在SQL查询语句的条件(一般作为WHERE子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
  • 索引的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
  • 普通索引
    • 创建索引
      create index 索引名 on 表名 (列名);
      
    • 添加索引(修改表结构)
      alter table 表名 add index 索引名(列名);
      
    • 删除索引
      drop index 索引名 on 表名;
      
    • 显示索引信息
      show index from 表名;\G
      
  • 唯一索引
    • 创建索引
          create unique index 索引名 on 表名(列名);
      
    • 添加索引
          alter table 表名 add unique 索引名(列名);