博客
关于我
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
阅读量:797 次
发布时间:2023-02-10

本文共 3699 字,大约阅读时间需要 12 分钟。

MySQL 查询优化指南

1. 基本查询操作

在MySQL中,SELECT 语句是用来查询数据库中的数据。基本语法格式如下:

SELECT 
<字段1,字段2,…>
FROM
<表名>
WHERE
<表达式>

1.1 查询表中所有数据

要查询表中所有数据,可以使用 * 来表示所有字段。以下是两种常见查询方式:

  • 进入指定数据库查询

    首先进入目标数据库(这里以 linzhongniaoDatabase 为例):

    mysql> use linzhongniaoDatabase

    然后执行查询:

    mysql> select * from test;
  • 直接查询库下的表

    如果已知数据库和表名,可以直接查询:

    mysql> select * from linzhongniao.test;
  • 1.2 根据指定条件查询表的部分数据

    要根据条件查询数据,可以在 WHERE 子句中添加条件。

  • 查看表中前2行数据

    使用 LIMIT 关键字指定返回的行数:

    mysql> select * from linzhongniao.test limit 2;
  • 查询指定字段

    仅查询某一字段的数据:

    mysql> select name from linzhongniao.test;
  • 根据条件查询数据

    使用 WHERE 子句添加查询条件:

    mysql> select * from linzhongniao.test where id='1';

    注意:在字符串值周围使用单引号,否则可能会导致错误。

    示例错误

    mysql> select * from linzhongniao.test where name=wwn1314;ERROR 1054 (42S22): Unknown column 'wwn1314' in 'where clause'

    示例正确

    mysql> select * from linzhongniao.test where name='wwn1314';

    多个条件可以使用 ANDOR 连接:

    mysql> select * from linzhongniao.test where id='2' and name='linzhongiao';

    或者:

    mysql> select * from linzhongniao.test where id='2' or name='linzhongiao';
  • 1.3 指定固定条件范围查询

    可以通过 WHERE 子句指定字段的范围。

  • 多个条件 AND 取交集

    例如,查询 id 在 2 到 4 之间的数据:

    mysql> select * from linzhongniao.test where id>2 and id<4;
  • 多个条件 OR 取并集

    例如,查询 id 大于 2 或小于 4 的数据:

    mysql> select * from linzhongniao.test where id>2 or id<4;
  • 1.4 排序查询

    可以通过 ORDER BY 关键字对结果进行排序。

  • 按升序查询

    例如,按 id 升序查询:

    mysql> select * from linzhongniao.test order by id desc;

    结果会从大到小返回:

    示例输出

    +----+-------------+| id | name         |+----+-------------+|  5 | xiaozhang   ||  4 | woshishei   ||  3 | lisi        ||  2 | wwn1314     ||  1 | linzhogniao |+----+-------------+
  • 按降序查询

    例如,按 id 降序查询:

    mysql> select id,name from test order by id desc;
  • 2. 多表查询

    2.1 创建关联表

    以下是创建多表关系的示例:

  • 学生表

    mysql> CREATE TABLE student (    ->    Sno int(10) NOT NULL COMMENT '学号',    ->    Sname varchar(16) NOT NULL COMMENT '姓名',    ->    Ssex char(2) NOT NULL COMMENT '性别',    ->    Sage tinyint(2) NOT NULL DEFAULT '0' COMMENT '年龄',    ->    Sdept varchar(16) DEFAULT NULL COMMENT '系别',    ->    PRIMARY KEY (Sno),    ->    KEY index_Sname (Sname)    -> );
  • 课程表

    mysql> CREATE TABLE course (    ->    Cno int(10) NOT NULL COMMENT '课程号',    ->    Cname varchar(64) NOT NULL COMMENT '课程名',    ->    Ccredit tinyint(2) NOT NULL COMMENT '学分',    ->    PRIMARY KEY (Cno)    -> );
  • 选课表

    mysql> CREATE TABLE SC (    ->    SCid int(12) NOT NULL AUTO_INCREMENT COMMENT '主键',    ->    Cno int(10) NOT NULL COMMENT '课程号',    ->    Sno int(10) NOT NULL COMMENT '学号',    ->    Grade tinyint(2) NOT NULL COMMENT '成绩',    ->    PRIMARY KEY (SCid)    -> );
  • 2.2 插入数据

  • 学生表插入数据

    mysql> insert into student values('0001','张三','男','22','计算机网络');
  • 课程表插入数据

    mysql> insert into course values(1001,'linux中高级运维','3');
  • 选课表插入数据

    mysql> insert into SC(Sno,Cno,Grade) values(0001,1001,3);
  • 2.3 查询数据

  • 联合查询

    查询学生成绩和课程名,可以使用联合查询:

    mysql> select student.Sno,student.Sname,SC.Grade,course.Cname from student,course,SC where student.Sno=SC.Sno and course.Cno=SC.Cno;
  • 按学号排序

    mysql> select student.Sno,student.Sname,SC.Grade,course.Cname from student,course,SC where student.Sno=SC.Sno and course.Cno=SC.Cno order by Sno;
  • 3. 查询性能优化

    3.1 使用 explain 获取执行计划

    EXPLAIN 语句用于分析查询性能,帮助优化 SQL 语句。

  • 表中没有索引

    mysql> explain select * from test where name='nimei'\G

    输出示例

    *************************** 1. row ***************************id: 1select_type: SIMPLEtable: testtype: ALLpossible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 5Extra: Using where
  • name 列创建索引

    mysql> create index index_name on test(name);
  • 优化后的查询

    mysql> explain select * from test where name='nimei'\G

    输出示例

    *************************** 1. row ***************************id: 1select_type: SIMPLEtable: testtype: refpossible_keys: index_namekey: index_namekey_len: 20ref: constrows: 1Extra: Using where
  • 通过索引优化,可以显著提升查询性能。

    转载地址:http://pqffk.baihongyu.com/

    你可能感兴趣的文章
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>