实验1

1.1.5 思考1

SQL 语法规定,双引号括定的符号串为对象名称,单引号括定的符号串为常量字符串,那么什么情况下需要用双引号来界定对象名呢?请实验验证。

实验目的

验证双引号在ANSI_QUOTES 模式下有不同的作用。如果启用了 ANSI_QUOTES 模式,则双引号不能用来表示字符串,而只能用来表示对象;如果没有启用 ANSI_QUOTES 模式,则双引号可以用来表示字符串。

实验内容

MySQL 不是默认了 ANSI_QUOTES 模式,这个模式需要手动设置。可以通过以下语句来查看或修改当前的 sql_mode:

1
2
3
4
5
6
-- 查看当前的 sql_mode
SELECT @@sql_mode;

-- 修改当前的 sql_mode
SET sql_mode = 'ANSI_QUOTES'; -- 启用 ANSI_QUOTES 模式
SET sql_mode = ''; -- 关闭 ANSI_QUOTES 模式

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
SET sql_mode = 'ANSI_QUOTES';
SELECT @@sql_mode;
SELECT `first_name` FROM employees; -- 是各种人名
SELECT "first_name" FROM employees; -- 是各种人名
SELECT 'first_name' FROM employees; -- 全是first_name

SET sql_mode = '';
SELECT `first_name` FROM employees; -- 是各种人名
SELECT "first_name" FROM employees; -- 全是first_name
SELECT 'first_name' FROM employees; -- 全是first_name
SELECT @@sql_mode;

简写代码如下

1
2
3
4
SET sql_mode = 'ANSI_QUOTES';
SELECT @@sql_mode,`first_name`,"first_name",'first_name' FROM employees;
SET sql_mode = '';
SELECT @@sql_mode,`first_name`,"first_name",'first_name' FROM employees;

实验结果

image.png

image.png

  1. 在ANSI_QUOTES模式下时,双引号所代表的都是对象,可以从employees表中取到各种数据
  2. 在空白模式下,双引号所代表的是字符串,无法从employees表中取到各种数据
  3. 不论在ANSI_QUOTES模式下还是在空白模式下,反引号所代表的都是对象,单引号所代表的都是字符串

结论与分析

  1. 验证的方法是在 SQL 语句中使用双引号来界定对象名,并执行 SQL 语句,看是否能正确运行。如果能正确运行,说明双引号的作用是有效的;如果报错,说明双引号的作用是无效的或者不被支持
  2. 在 MySQL 中,对象名就是指数据库中的组成部分,比如表,索引,视图等的名字
  3. 对象是用来标识和引用数据库中的组成部分,字符串是用来表示文本或者其他数据

1.1.5 思考2

数据库对象的完整引用是“服务器名.数据库名.模式名.对象名”,但通常可以省略服务器名和数据库名,甚至模式名,直接用对象名访问对象即可。请设计相应的实验验证基本表及其列的访问方法。

实验目的

验证可以省略服务器名和数据库名,甚至模式名,直接用对象名访问对象

实验内容

1
2
SELECT * FROM new_schema.dept_emp; -- 省略服务器名和数据库名,得到所有的数据
SELECT * FROM dept_emp; -- 省略服务器名和数据库名和模式名,得到表中的所有数据

实验结果

image.png

image.png

输入上面两行代码,所得到的结果都是一样的,这说明我们可以使用完整引用,也可以使用省略的引用来访问表中的数据

结论与分析

在 SQL Server 中,数据库对象的完整引用是“服务器名.数据库名.模式名.对象名”。

  • 数据库名:指定了包含该对象的数据库的名称。
  • 模式名:指定了包含该对象的模式的名称。模式是一组逻辑结构,用于组织和管理数据库中的对象。
  • 对象名:指定了要访问的对象(例如表、视图或存储过程)的名称。

我们既可以使用完整引用,也可以使用省略部分引用的方式来访问数据。