数据库学习中遇到的疑问

INSERT  
INTO `jobs`(`job_id`,`job_title`,`min_salary`,`max_salary`) 
VALUES ('AC_ACCOUNT','Public Accountant',4200,9000);
INSERT  
INTO jobs(job_id,job_title,min_salary,max_salary) 
VALUES ('AC_ACCOUNT','Public Accountant',4200,9000);

使用mysql,这两段插入语句都可以正确执行,但不明白为什么上一个要加反引号
希望能告诉我这个反引号需要在哪个版本,或者什么情况下使用
我在学习sql server的时候并没有讲需要加上反引号

mysql是这样的,反引号就是怕跟关键词特殊字符这些重复,sql server不需要

如果字段,表名都没有mysql关键字,那么可加,可不加,如果表名,字段中存在关键字,那就需要加反引号把关键字包含起来,这样就能确保查询的数据是你数据库的表名或者字段而不是mysql的关键字,比如下边这个describe是关键字,不加反引号就报错

img


加了就可以查询

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7702690
  • 你也可以参考下这篇文章:向MySQL数据库中插入数据,sql语句没问题,但插入失败也不报错?
  • 同时,你还可以查看手册:MySQL 函数和运算符 为全文索引添加用户定义的整理方式 中的内容
  • 除此之外, 这篇博客: 2021最新MySQL数据库面试题中的 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。 我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等

    在这里插入图片描述

    执行计划包含的信息 id 有一组数字组成。表示一个查询中各个子查询的执行顺序;

    • id相同执行顺序由上至下。
    • id不同,id值越大优先级越高,越先被执行。
    • id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。

    select_type 每个子查询的查询类型,一些常见的查询类型。

    idselect_typedescription
    1SIMPLE不包含任何子查询或union等查询
    2PRIMARY包含子查询最外层查询就显示为 PRIMARY
    3SUBQUERY在select或 where字句中包含的查询
    4DERIVEDfrom字句中包含的查询
    5UNION出现在union后的查询语句中
    6UNION RESULT从UNION中获取结果集,例如上文的第三个例子

    table 查询的数据表,当从衍生表中查数据时会显示 x 表示对应的执行计划id partitions 表分区、表创建的时候可以指定通过那个列进行表分区。 举个例子:

    create table tmp (
        id int unsigned not null AUTO_INCREMENT,
        name varchar(255),
        PRIMARY KEY (id)
    ) engine = innodb
    partition by key (id) partitions 5;
    
    

    type(非常重要,可以看到有没有走索引) 访问类型

    • ALL 扫描全表数据
    • index 遍历索引
    • range 索引范围查找
    • index_subquery 在子查询中使用 ref
    • unique_subquery 在子查询中使用 eq_ref
    • ref_or_null 对Null进行索引的优化的 ref
    • fulltext 使用全文索引
    • ref 使用非唯一索引查找数据
    • eq_ref 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联。

    possible_keys 可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。

    key 显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。

    TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中

    key_length 索引长度

    ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

    rows 返回估算的结果集数目,并不是一个准确的值。

    extra 的信息非常丰富,常见的有:

    1. Using index 使用覆盖索引
    2. Using where 使用了用where子句来过滤结果集
    3. Using filesort 使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
    4. Using temporary 使用了临时表 sql优化的目标可以参考阿里开发手册
    【推荐】SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是consts最好。 
    说明: 
    1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。 
    2) ref 指的是使用普通的索引(normal index)。 
    3) range 对索引进行范围检索。 
    反例:explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range还低,与全表扫描是小巫见大巫。
    
    
  • 您还可以看一下 CSDN就业班老师的【数据分析实战训练营】Mysql数据库课程中的 建表与定义字段约束小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    在MySQL中,反引号(`)被用来标识字段名、表名和别名等以避免这些名称与关键字冲突。在不使用反引号时,如果使用了MySQL的关键字来命名字段,表名或别名,MySQL将会产生语法错误。

    例如,以下SQL语句会产生语法错误:

    CREATE TABLE 'person' (
        'name' VARCHAR(255),
        'group' VARCHAR(255)
    );
    

    正确的写法是:

    CREATE TABLE `person` (
        `name` VARCHAR(255),
        `group` VARCHAR(255)
    );
    

    可以看到,在这个例子中,表名和字段名被反引号包裹,这样MySQL将不会把它们当成关键字解释。

    需要注意的是,这种情况随着MySQL版本的更新可能会变化,所以如果在开发中使用反引号,请确认MySQL版本是否支持使用反引号。另外,在SQL Server中并不需要使用反引号来避免关键字冲突,所以在学习SQL Server时可能没有接触到这种情况。

    如果需要在插入语句中使用反引号,可以这样写:

    INSERT INTO `person` (`name`, `group`) VALUES ('Tom', 'A');
    

    在这个例子中,字段名被反引号包裹,这样就能避免由于使用了MySQL的关键字作为字段名而导致的语法错误。

    关于性能优化问题,请参考参考资料中的内容。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^