MySQL 基础

作者:Gakki

1. 基础

1.1 数据库管理系统(数据库软件)

  • 关系型数据库(RDBMS)
  1. Oracle 数据库
  2. MySQL 数据库
  3. SQL server 数据库
  4. PostgreSQL
  5. SQLite
  • 非关系型数据库(NoSQL)
  1. Redis(最好的缓存数据库)
  2. MongoDB(最好的文档型数据库)
  3. Elasticsearch(最好的搜索服务)
  4. Cassandra(最好的列式数据库)
  5. HBase(优秀的分布式、列式数据库)

2. MySQL 的 DDL 操作

2.1 DDL 解释

  • DDL(Data Definition Language):数据定义语言,该语言部分包括以下内容:
    • 对数据库的常用操作;
    • 对表结构的常用操作;
    • 修改表的结构。

2.2 对数据库的常用操作

  1. 查看所有的数据库:show database;
  2. 创建数据库:create database [if not exists] 数据库名字 [charset = utf-8];
  3. 切换数据库:use 数据库名字;
  4. 删除数据库:drop database [if exists] 数据库名字;

2.3 对表结构的常用操作 - 其他操作

  1. 查看当前数据库的所有表名称:show tables;
  2. 查看指定某个表的创建语句:show create table 表名;
  3. 查看表结构:desc 表名;
  4. 删除表:drop table 表名;

2.4 对表结构的常用操作 - 修改表结构格式

2.4.1 添加列

  • 语法格式:alter table 表名 add 列名 类型(长度) [约束];
  • 举例:
    • 为 student 表添加一个新的字段为:系别 dept ,类型为 varchar(20);
    • alter table student add dept varchar(20);

2.4.2 修改列名和类型

  • 语法格式:alter table 表名 change 旧列名 新列名 类型(长度) [约束];
  • 举例:
    • student 表 dept 字段更换为 department varchar(30);
    • alter table student change dept department varchar(30);

2.4.3 删除列

  • 语法格式:alter table 表名 drop 列名
  • 举例:
    • 删除 student 表中 department 这一列;
    • alter table student drop department;

2.4.4 修改表名

  • 语法格式:rename table 表名 to 新表名
  • 举例:
    • 将 student 表改为 stu;
    • rename table student to stu

3. MySQL 的 DML 操作

3.1 概念

  1. DML(Data Manipulation Language) 是数据操作语言,主要对 Mysql 的数据进行增删改;
  2. 关键字:insert(插入)、update(更新)、delete(删除)、truncate(删除)

3.2 操作

3.2.1 数据插入

  • 关键字:insert
  • 格式:
    • 方式1:insert into 表名(列名1,列名2,……)value (值1,值2,……)
    • 方式2:insert into 表名 value (值1,值2,……)

3.2.2 数据修改

  • 关键字:update
  • 格式:
    • 方式1:update 表名 set 字段名 = 值,字段名 = 值,……
    • 方式2:update 表名 set 字段名 = 值,字段名 = 值,…… where ……

3.2.3 数据删除

  • 关键字:delete、truncate
  • 格式:
    • 方式1:delete from 表名 注:这种方式会将整个表的数据全部删除
    • 方式2:delete from 表名 where ……
    • 方式3:truncate 表名 注:这个是清空整个表,本质上可以理解为删除了表,并创建新表,和 delete 不同。

4. MySQL 的约束

⭐⭐⭐4 . 1 主键约束

  • 关键字:primary key
  • 特点:
    1. 一个表只有一个主键(包含联合主键);
    2. 添加了主键约束的列不能为空,并且值不能重复;
    3. 主键可以唯一的标识表中的一行数据,目的是提高查询的效率;
  • 使用:create table emp ( eid int primary key; name varchar(20); deptId int; salary double );

⭐4.2 自增长约束

  • 关键字:auto_increment
  • 特点:
    1. 自增长约束和主键一起使用;
    2. 自增长约束默认是从 1 开始增长;
    3. 每次添加数据,自增长的值加 1;
  • 使用:create table t_user ( id int primary key auto_increment, name varchar(20) );
  • delete 和 truncate 自增长的特点:
    1. delete 删除数据之后,自增长的值会被保留,从上一个断点持续增长;
    2. truncate 是将表删除,然后重新创建新表。所以清空数据之后,自增是 1 开始。

⭐4.3 非空约束

  • 关键字:not null
  • 特点:
    1. 添加非空约束的列不能为空;
    2. 真正的空是 NULL,不是 'NULL', 也不是 '';
  • 使用:create table t_user ( id int varchar(20) not null, address varchar(29) not null);

⭐4.4 唯一约束

  • 关键字:unique
  • 特点:
    1. 添加唯一约束之后,该列的值不能重复;
    2. 虽然不能重复,但是添加唯一的约束的列可以为 NULL,因为 NULL 不等于 NULL;
  • 使用:create table t_user ( id int, name varchar (20), phone number varchar(20) unique;

⭐4.5 默认约束

  • 关键字:default
  • 特点:
    1. 添加约束的列如果没有指定值,则为默认值;
  • 使用:create table t_user ( id int, name varchar(20), address varchar(20) default '北京' );

4.6 零填充约束

  • 关键字:zerofill
  • 特点:
    1. 当给数值类型设置该约束,则左边不够指定的整形长度时,则自动补充0;
    2. 默认零填充约束的数据 int(10);
    3. 指定零填充约束的列为 unsigned 类型,即无符号类型;
  • 使用:create table t_user ( id int zerofill, name varchar(20) );

5. MySQL 的 DML 操作

5.1 简单查询

  1. 查全表:select * from 表名;
  2. 指定字段查询:select 列名, 列名 from 表名;
  3. 别名查询:
    • 列别名:select pid as ‘商品id’, pname '商品名字', price from product;
    • 列别名:select pname, price +10 as new price from product;
    • 表别名:select pid as '商品id'', pname '商品名字', price from product as p;
  4. 去重查询:
    • 关键字:distinct
    • 操作:
      • 去除重复行:select distinct * from 表名;
      • 去除重复的列:select distinct 列名 from 表名;

5.2 运算符操作

  1. 算数运算符:+、-、*、/、%;
  2. 比较运算符:<、>、<=、>=、!=、=、in、not in、like、is null、is not null;
  3. 逻辑运算符:and(&&)、or(||)、not
  4. 位运算符(了解):&、|、^、<<、>>、~;

5.3 排序查询

  • 关键字:order by asc | desc;
  • 注:asc:升序(默认),desc:降序;
  • 特点:
    1. 如果 oder by 后面跟一个字段,则只会按照该字段的值进行排序,该字段必须为数值类型或者英文和数字字符串类型或者'2025-01-03';
    2. 如果 oder by 后面跟多个字段:order by c1,c2;解释: 先按照 c1 来排序,如果 c1 相同,则按照 c2 排序;
  • 操作:
    1. 使用价格排序(降序)select * from product order by price desc;
    2. 在价格排序(降序)的基础上,以分类排序(降序)select * from product order by price desc, category_id desc;

5.4 聚合查询

  • 关键字:
    1. count();如:count(*),count(1)注:如果列有 null 值,则不会进行统计;
    2. sum();如:sum(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
    3. max();如:max(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
      4.min();如:min(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
    4. avg();如:avg(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
  • 注:一般情况下,聚合函数和分组会结合一起使用;

5.5 分组查询

  • 关键字:group by
  • 特点:
    1. 分组可以理解为将一张表格拆分成多张表,拆分的依据就是分组字段;
    2. 分组可以根据一个字段,也可以根据多个字段,如果是一个字段,则该字段相同就会分到同一组,如果是多个字段,则多个字段都相同才能分到同一组。
    3. 分组之后,select 的后面只可以跟组分字段和聚合操作。
  • 注:
    1. 一般情况下,聚合函数和分组会结合一起使用;
    2. 分组之后,对分组后的操作进行条件判断不能使用 where,必须使用 having;
      SQL 执行顺序
    3. 这是我们实际上 SQL 执行顺序:我们先执行from,join来确定表之间的连接关系,得到初步的数据;where对数据进行普通的初步的筛选;group by 分组;各组分别执行having中的普通筛选或者聚合函数筛选。然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段将查询结果去重distinct;最后合并各组的查询结果,按照order by的条件进行排序。

5.6 分页显示

  • 关键字:limit
  • 操作:
    1. 查询 product 表的前 5 条记录:select * from product limit 5;
    2. 从第 4 条开始显示,显示 5 条:select * from product limit 3,5;

6. MySQL 多表操作

6.1 前言

  1. 多表关系:1对1关系(很少用);1对多关系(很常见);多对多关系(注意:多对多关系必须有中间表 )
  2. 外键【foreign key】约束
    • 术语:主表、从表、外键列;
    • 创建方式:
      • 方式一:在创建表的同时创建外键约束;
      • 方式二:在创建表之后,通过修改表结构的方式来添加外键约束;
    • 特点:
    1. 主表的数据可以随便添加,从表的外键列数据必须依赖主表;
    2. 主表的数据如果被从表依赖,则不能删除,而从表的数据可以随便删除;

6.2 多表联合查询

  1. 交叉连接查询
    • 特点:形成一个笛卡尔集;
  2. 内连接查询:
    • 隐式内连接:select * from A B where 条件;
    • 显式内连接:select * from A inner join B on 条件;
    • 特点:求两张表的交集;
  3. 外连接查询:
    • 左外连接
      • 关键字:left join
      • 特点:将左表的数据全部输出,如果右边有对应的数据则输出,没有对应的数据,则输出 null。
    • 右外连接
      • 关键字:right join
      • 特点:将右表的数据全部输出,如果左边有对应的数据则输出,没有对应的数据,则输出 null。
    • 完全连接
      • 关键字:full join
      • 特点:返回左表和右表的所有数据,并使用 null 值填充缺失的数据;oracle 支持,mysql 不太支持,可以使用 union 关键字来实现。
      • 方式一:select * from student s full join record r on s.id = r.student_id;
      • 方式二:
        select * from student left join record on student.id = record.student_id 
        union 
        select * from student right join record on student.id = record.student_id; 
    
  4. 子查询
    • 概念:select 的嵌套
    • 查询类型:
      • 将子查询结果当作一个值:一行一列;
      • 将子查询的结果当成多个值:一列多行;
      • 将子查询的结果当做一张表:一行多列或者多行多列;
    • 关键字:
      • ALL:表示全部满足;
      • ANY / SOME:只要有一个满足即可;
      • IN:表示范围内的只要有匹配即可;
      • EXISTS:如果查询有结果,则返回 true;否则返回 false;
  5. 自关联查询
    • 概念:一张表自己和自己关联;
    • 特点:表必须起别名。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 8,090评论 5 115
  • @[toc] 视图是什么 视图在数据库中的作用类似于窗户,用户可以通过这个窗口看到只对自己有用的数据。既保障了数据...
    夜雨流云阅读 1,094评论 0 2
  • MySQL [TOC] 注释 单行注释: -- 多行注释 :/* */ SQL分类 DDL :Data Defin...
    一昂Jone阅读 315评论 0 0
  • SQL基础 SQL又叫结构化查询语言,分为三大类,分别是:DDL(数据定义语言),DML(数据操作语言),DCL(...
    木_Python阅读 304评论 0 0
  • 1、什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2、什么是 M...
    明_27bf阅读 786评论 0 0

友情链接更多精彩内容