MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(1)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MYSQL必知必会,详尽入门,一文帮你学会SQL必知必会(1)

数据库的概念和术语

按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合


抓住   长期存储   +   方便管理大量数据   (支持并发访问)  相比磁盘更加快速


数据库:数据库是一些关联表的集合;


数据表:表是数据的矩阵;


列:一列包含相同类型的数据;


行:或者称为记录是一组相关的数据;


主键:主键是唯一的;一个数据表只能包含一个主键;   (primary key 非空去重唯一性)


外键:外键用来关联两个表,来保证参照完整性;MyISAM存储引擎本身并不支持外键,只起到注 释作用;而innodb完整支持外键;    (foreign key 存储在从表, 从表和主表的关系列,关联列)


复合键:或称组合键;将多个列(字段) 指定为一个索引键;


索引:用于快速访问数据表的数据;索引是对表中的一列或者多列的值进行排序的一种结构;     (抓住. 索引是为了方便排序的一列或多列数据)

    SQL语言和组成

    用于存取数据以及查询、更新和管理关系数据库系统。SQL是关系数据 库系统的标准语言


    抓住一点,  SQL就是用来操作数据库的一门语言就OK,关系型数据库标准语言


    SQL 命令包含:   DQL、DML、DDL、DCL以及TCL   本文仅介绍实操部分

    DDL


    Data Define Languge - 数据定义语言, 用于定义  数据库,数据表


    show :  展示当前已有的数据库或者表


    show databases;     显示所有数据库

    show databases;
    # 显示所有数据库
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | hello              |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    | xiaojie            |
    +--------------------+
    7 rows in set (0.00 sec)
    • show tables;  显示当前选择数据库的所有数据表
    use tangyujie;
    Database changed
    show tables;
    Empty set (0.00 sec)
    • use 数据库名称;   指定选择一个数据库, 选择具体的数据库操作
    use test;
    # 指定选择一个数据库
    Database changed
    • create :创建一个数据库或者一个表
    • create database 数据库名;    不安全的创建一个数据库 (如果表已经存在会报错)
    • 加 if not exists 检测, 如果数据库已存在就不创建,否则创建 (不会报错, 只是提示)
    create database if not exists tangyujie;
    # 创建tangyujie数据库如果不存在
    Query OK, 1 row affected (0.00 sec)
    show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | hello              |
    | mysql              |
    | performance_schema |
    | sys                |
    | tangyujie          |
    | test               |
    | xiaojie            |
    +--------------------+
    8 rows in set (0.00 sec)
    • create table 表名;    不安全的创建一个表 (如果表已经存在会报错)
    • 加 if not exists 检测, 如果数据表已存在就不创建,否则创建  (不会报错, 只是提示)
    create table if not exists STU (
      id int,
      name varchar(10),
      age tinyint
    ) engine = innodb default charset = utf8mb4;
    show tables;
    +---------------------+
    | Tables_in_tangyujie |
    +---------------------+
    | stu                 |
    +---------------------+
    1 row in set (0.00 sec)
    • drop :删除表、数据库对象或者视图
    • drop table 表名;        不安全的删除一个表 (如果表不存在会报错)
    • 加上if exists  检测,  如果表不存在不会报错 (会提示waring)
    drop table stu;
    Query OK, 0 rows affected (0.01 sec)
    show tables;
    Empty set (0.00 sec)
    drop table if exists stu;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    • drop database 数据库名;        不安全的删除一个库 (如果库不存在会报错)
    • 加上if exists  检测,  如果表不存在不会报错 (会提示waring)
    • 注意:删库跑路不是吹出来的,不要轻易使用drop
    drop database tangyujie;
    Query OK, 0 rows affected (0.01 sec)
    show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | hello              |
    | mysql              |
    | performance_schema |
    | sys                |
    | test               |
    | xiaojie            |
    +--------------------+
    7 rows in set (0.00 sec)
    • alter :修改现有的数据库对象,例如 修改表的属性或者字段 (列)
    • desc 数据表名;   展示数据表的表结构
     desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    • alter  table  指定表名 add 新列名 列类型(类型长度); 添加一列字段\
    • 新增一列grade varchar(5); 等级列, 成绩等级
    alter table stu add grade varchar(5);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    | grade | varchar(5)  | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    • alter table  指定表名  modify  指定列名(字段)  新的类型(新的长度)    -- 修改类型
    • 将  grade 改为 int 类型的 成绩
    alter table stu modify grade int(11);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    | grade | int(11)     | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    • alter  table 指定表名  change  旧的列名  新的列名  新类型(类型长度)  --修改列名+类型
    • 将 grade 列改成  addr 列 类型改成  varchar(10);
    alter table stu change grade addr varchar(10);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    | addr  | varchar(10) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)
    • alter  table  指定表名  drop  指定列名;   -- 将指定列删除
    alter table stu drop addr;
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    desc stu;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int(11)     | YES  |     | NULL    |       |
    | name  | varchar(10) | YES  |     | NULL    |       |
    | age   | tinyint(4)  | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)

    DML

    • Data Manipulate Language - 数据操作语言  (记录的增删改查)
    • insert :插入记录
    • insert  into  指定表(指定列)  values(指定值);
    • 指定插入一条记录 id 1001 name = 孙悟空 age = 100
    insert into stu(id, name, age) values(1001, '孙悟空', 100);
    Query OK, 1 row affected (0.01 sec)
    select * from stu;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    +------+-----------+------+
    1 row in set (0.00 sec)
    • values  赋值顺序需要和指定列顺序保持一致
    insert into stu(name, id, age) values('沙和尚', 1002, 100);
    Query OK, 1 row affected (0.00 sec)
    select * from stu;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    +------+-----------+------+
    2 rows in set (0.00 sec)
    • 不指定列, 默认按照所有列顺序插入 values
    insert into stu values(1003, '白龙马', 100);
    Query OK, 1 row affected (0.00 sec)
    select * from stu;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    | 1003 | 白龙马    |  100 |
    +------+-----------+------+
    3 rows in set (0.00 sec)
    • update :更新记录
    • update  表名  set  字段1 = 值1 字段2 = 值2  where 条件指定记录; 
    • 指定设置 id = 1003的 记录 name = 猪八戒  (跟新记录) 
    update stu set name = '猪八戒' where id = 1003;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    select * from stu;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    | 1003 | 猪八戒    |  100 |
    +------+-----------+------+
    3 rows in set (0.00 sec)
    delete :删除记录
    delete from 表名 where 条件指定记录;
    指定删除id = 1003的记录

    DQL

    Data Query Language - 数据查询语言
    select :从一个或者多个表中检索特定的记录
    数据准备
    select * from stu;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    | 1003 | 猪八戒    |  100 |
    | 1004 | 白龙马    |  100 |
    | 1006 | 哪吒      |   88 |
    | 1004 | 观音      |   99 |
    | 1009 | 白骨精    |   78 |
    +------+-----------+------+
    7 rows in set (0.00 sec)
    • select 指定列查询
    • select 指定列1, 指定列2, 指定列3...  from 表名;
    • 指定查询 stu 表中的name + age 列信息
    select name, age from stu;
    +-----------+------+
    | name      | age  |
    +-----------+------+
    | 孙悟空    |  100 |
    | 沙和尚    |  100 |
    | 猪八戒    |  100 |
    | 白龙马    |  100 |
    | 哪吒      |   88 |
    | 观音      |   99 |
    | 白骨精    |   78 |
    +-----------+------+
    7 rows in set (0.00 sec)
    • select 条件查询
    • select   *   from  表名   where  条件指定查询记录
    • 条件指定查询 id = 1003的记录 
    select * from stu where id = 1003;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1003 | 猪八戒    |  100 |
    +------+-----------+------+
    1 row in set (0.00 sec)
    • select 去重查询
    • select distinct 指定去重列 from 表名;
    • 按照id号进行去重查询
    select id from stu;
    +------+
    | id   |
    +------+
    | 1001 |
    | 1002 |
    | 1003 |
    | 1004 |
    | 1006 |
    | 1004 |
    | 1009 |
    +------+
    7 rows in set (0.00 sec)
    select distinct id from stu;
    +------+
    | id   |
    +------+
    | 1001 |
    | 1002 |
    | 1003 |
    | 1004 |
    | 1006 |
    | 1009 |
    +------+
    6 rows in set (0.00 sec)

    select 排序查询 (查询后排序)

    select   *  from  stu  order by    指定列1 排序规则, 指定列2 排序规则;

    排序规则:默认升序, asc   指定升序   desc 指定降序

    先按照 id 升序排序, id  相同再按照 age 降序排序  

    select * from stu order by id asc, age desc;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    | 1003 | 猪八戒    |  100 |
    | 1004 | 白龙马    |  100 |
    | 1004 | 观音      |   99 |
    | 1006 | 哪吒      |   88 |
    | 1009 | 白骨精    |   78 |
    +------+-----------+------+
    7 rows in set (0.00 sec)
    • select 起别名
    • select 指定列1  别名,  指定列2 别名... from stu;
    • 将 age 取个别名为年龄  
    select age '年龄', name from stu;
    +--------+-----------+
    | 年龄   | name      |
    +--------+-----------+
    |    100 | 孙悟空    |
    |    100 | 沙和尚    |
    |    100 | 猪八戒    |
    |    100 | 白龙马    |
    |     88 | 哪吒      |
    |     99 | 观音      |
    |     78 | 白骨精    |
    +--------+-----------+
    7 rows in set (0.00 sec)
    • select 聚合函数分组查询

    • select 聚合函数名(指定列) from 表名;  指定对于表每一列进行聚合函数
    • 查询一下表中所有的  age 和  age 最大 最小值
    select sum(age) from stu;
    +----------+
    | sum(age) |
    +----------+
    |      665 |
    +----------+
    1 row in set (0.00 sec)
    select min(age) from stu;
    +----------+
    | min(age) |
    +----------+
    |       78 |
    +----------+
    1 row in set (0.00 sec)
    select max(age) from stu;
    +----------+
    | max(age) |
    +----------+
    |      100 |
    +----------+
    1 row in set (0.00 sec)

    select    指定分组字段   聚合函数(指定字段)  from  表名  group by 指定分组字段

    注意:分组也就意味着去重,一旦分组之后, 就会按照分组列进行去重,

    一旦去重之后意味着什么?  我们跟随着去重列一同显示出来的其他列也必须是聚合在一起的

    上述这句话必须理解清楚,你想想,分组前是很多行,分组之后进行了去重,记录需要从多条记录压缩成一条记录,也就意味着,我们需要聚合多条记录.

    依照age 进行 分组, 将多条记录聚合压缩成分组记录, 名字同组的联在一起,并且统计同组人数

    select age, count(*), group_concat(`name`) from stu group by age;
    +------+----------+-----------------------------------------+
    | age  | count(*) | group_concat(`name`)                    |
    +------+----------+-----------------------------------------+
    |   78 |        1 | 白骨精                                  |
    |   88 |        1 | 哪吒                                    |
    |   99 |        1 | 观音                                    |
    |  100 |        4 | 孙悟空,沙和尚,猪八戒,白龙马             |
    +------+----------+-----------------------------------------+
    4 rows in set (0.00 sec)
    • select 分页查询

    何为分页    limit n, m;  从 n 条记录开始显示m条记录

    • select   *   from    limit    起始记录数, 每页的记录数
    • 起始记录数目如何计算, 是每一页的记录数的整数倍
    • eg: 查看第一页的记录,和查看第二页的记录  (每页记录数为3)
    select * from stu limit 0,3;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1001 | 孙悟空    |  100 |
    | 1002 | 沙和尚    |  100 |
    | 1003 | 猪八戒    |  100 |
    +------+-----------+------+
    3 rows in set (0.00 sec)
    select * from stu limit 3,3;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1004 | 白龙马    |  100 |
    | 1006 | 哪吒      |   88 |
    | 1004 | 观音      |   99 |
    +------+-----------+------+
    3 rows in set (0.00 sec)
    select * from stu limit 6,3;
    +------+-----------+------+
    | id   | name      | age  |
    +------+-----------+------+
    | 1009 | 白骨精    |   78 |
    +------+-----------+------+
    1 row in set (0.00 sec)

    如上分别是查看第一页 第二页,第三页的 记录


    相关实践学习
    如何快速连接云数据库RDS MySQL
    本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    相关文章
    |
    13天前
    |
    SQL 关系型数据库 MySQL
    基于SQL Server / MySQL进行百万条数据过滤优化方案
    对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
    32 9
    |
    12天前
    |
    SQL 存储 缓存
    MySQL的架构与SQL语句执行过程
    MySQL架构分为Server层和存储引擎层,具有高度灵活性和可扩展性。Server层包括连接器、查询缓存(MySQL 8.0已移除)、分析器、优化器和执行器,负责处理SQL语句;存储引擎层负责数据的存储和读取,常见引擎有InnoDB、MyISAM和Memory。SQL执行过程涉及连接、解析、优化、执行和结果返回等步骤,本文详细讲解了一条SQL语句的完整执行过程。
    31 3
    |
    19天前
    |
    SQL Oracle 关系型数据库
    【YashanDB 知识库】如何将 mysql 含有 group by 的 SQL 转换成崖山支持的 SQL
    在崖山数据库中执行某些 SQL 语句时出现报错(YAS-04316 not a single-group group function),而这些语句在 MySQL 中能成功执行。原因是崖山遵循 SQL-92 标准,不允许选择列表中包含未在 GROUP BY 子句中指定的非聚合列,而 MySQL 默认允许这种操作。解决办法包括:使用聚合函数处理非聚合列或拆分查询为两层,先进行 GROUP BY 再排序。总结来说,SQL-92 更严格,确保数据一致性,MySQL 在 5.7 及以上版本也默认遵循此标准。
    |
    1月前
    |
    SQL 存储 关系型数据库
    MySQL原理简介—10.SQL语句和执行计划
    本文介绍了MySQL执行计划的相关概念及其优化方法。首先解释了什么是执行计划,它是SQL语句在查询时如何检索、筛选和排序数据的过程。接着详细描述了执行计划中常见的访问类型,如const、ref、range、index和all等,并分析了它们的性能特点。文中还探讨了多表关联查询的原理及优化策略,包括驱动表和被驱动表的选择。此外,文章讨论了全表扫描和索引的成本计算方法,以及MySQL如何通过成本估算选择最优执行计划。最后,介绍了explain命令的各个参数含义,帮助理解查询优化器的工作机制。通过这些内容,读者可以更好地理解和优化SQL查询性能。
    |
    3月前
    |
    SQL 存储 关系型数据库
    MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
    本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
    |
    SQL 存储 关系型数据库
    MySQL下使用SQL命令进行表结构与数据复制实践
    MySQL下使用SQL命令进行表结构与数据复制实践
    176 0
    |
    SQL 关系型数据库 MySQL
    MySQl数据库第八课-------SQL命令查询-------主要命脉2
    MySQl数据库第八课-------SQL命令查询-------主要命脉
    104 0
    |
    SQL 关系型数据库 MySQL
    MySQl数据库第八课-------SQL命令查询-------主要命脉 1
    MySQl数据库第八课-------SQL命令查询-------主要命脉
    140 0
    |
    SQL 存储 开发框架
    MySQl数据库第六课-------SQl命令的延续------快来看看
    MySQl数据库第六课-------SQl命令的延续------快来看看
    110 0
    |
    SQL 存储 NoSQL
    MySQl数据库第五课 --------在SQl的简单命令--------学习学习
    MySQl数据库第五课 --------在SQl的简单命令--------学习学习

    热门文章

    最新文章