# 数据库和表的基本操作 ## 查看数据库系统的所有数据库 :::{note} 对于 SQL Server 来说,获取一些基本信息常常需要使用系统定义的存储过程。 ::: ### SQL Server 下查看数据库系统的所有数据库 查看数据库(系统)的所有数据库有以下方法: - 通过存储过程 `sp_databases` (注意:该存储过程是系统级的,在任意数据库都可以使用且效果一样) - 通过查询 `sys.databases` #### sp_databases ```sql -- 系统存储过程 : sp_databases ALTER procedure [sys].[sp_databases] as set nocount on select DATABASE_NAME = db_name(s_mf.database_id), DATABASE_SIZE = convert(int, case -- more than 2TB(maxint) worth of pages (by 8K each) can not fit an int... when sum(convert(bigint,s_mf.size)) >= 268435456 then null else sum(convert(bigint,s_mf.size))*8 -- Convert from 8192 byte pages to Kb end), REMARKS = convert(varchar(254),null) from sys.master_files s_mf where s_mf.state = 0 and -- ONLINE has_dbaccess(db_name(s_mf.database_id)) = 1 -- Only look at databases to which we have access group by s_mf.database_id order by 1 GO ``` ```{eval-rst} .. csv-table:: sp_databases 运行结果 :file: ../result-file/sp_databases.csv :header-rows: 1 :align: center ``` #### 查询 sys.databases 通过执行查询命令 `SELECT name AS database_name,database_id,collation_name FROM sys.databases` 来查看所有数据库。 ```{eval-rst} .. csv-table:: 查询 sys.databases 的运行结果 :file: ../result-file/sys.databases.csv :header-rows: 1 :align: center ``` ### MySQL 下查看数据库系统的所有数据库 MySQL 下的查看方法为: `show databases` ```mysql mysql> show databases; +---------------------+ | Database | +---------------------+ | information_schema | | ... | | yggl | +---------------------+ 20 rows in set (0.00 sec) ``` ```{raw} html
``` ## 使用数据库系统中的某个数据库 使用 `use` 关键字使用或更换使用的数据库,这个是 sql 通用的命令关键字。 命令形如 `use target_database` ```{raw} html
``` :::{note} 这个方法通用于 SQL Server 和 MySQL 。 ::: ## 查看数据库的全部表 ### SQL Server 下查看数据库的全部表 有以下方法 - 通过存储过程 `sp_tables` (注意:该存储过程是系统级的) - 通过查询 `sys.tables` :::{note} 由于 sp_tables 的实现代码长且复杂,同时如果不带参数地执行该存储过程,那么其结果将包含该库的所有表(一般来说我们只需要看 dbo 部分的表)。同时为节省篇幅,所以不将其展示。{download}`sp_tables 存储过程 <../result-file/sp_tables.sql>` [^id11] ::: #### 使用带有参数的 sp_tables 不带有参数的 sp_tables 运行产生的结果比较不具备可用性且没有目的性。 让我们通过定义看看 sp_tables 的参数有哪些: ```sql stored procedure learning_sql_server.sys.sp_tables @table_name nvarchar(384) = null, @table_owner nvarchar(384) = null, @table_qualifier sysname = null, @table_type varchar(100) = null, @fUsePattern bit = 1 ``` sp_tables 的参数: - `table_name` : 表名 - `table_owner` : 表的所有者;(一般查询的都为 dbo ,还有 sys 和 INFORMATION_SCHEMA) - `table_qualifier` : 对象限定符; **对象限定符的数据库名称部分必须是当前数据库的名称** ,一般 null 。 - `table_type` : 表的类型,有 `TABLE` 和 `VIEW` 以及 `SYSTEM TABLE` :::{attention} `sp_tables null,null,null,null` 是等同于 `sp_tables` 的。 ::: ```sql -- 执行存储过程 sp_tables NULL,dbo,NULL,"'TABLE'" GO ``` ```{eval-rst} .. csv-table:: 执行带参数的 sp_tables 的运行结果 :file: ../result-file/sp_tables.csv :header-rows: 1 :align: center ``` #### 查询 sys.tables ```sql -- 执行查询 SELECT name,type,type_desc FROM sys.tables GO ``` ```{eval-rst} .. csv-table:: 查询 sys.tables 的运行结果 :file: ../result-file/sys.tables.csv :header-rows: 1 :align: center ``` ```{raw} html
``` ### MySQL 下查看数据库的全部表 - use target_database; - show tables; ```mysql mysql> use employees; Database changed mysql> show tables; +----------------------+ | Tables_in_employees | +----------------------+ | current_dept_emp | | departments | | dept_emp | | dept_emp_latest_date | | dept_manager | | employees | | salaries | | titles | +----------------------+ 8 rows in set (0.00 sec) ``` ## 查看表结构 ### SQL Server 下查看表结构 让我们通过定义看看 sp_tables 的参数有哪些: ```sql stored procedure learning_sql_server.sys.sp_columns @table_name nvarchar(384), @table_owner nvarchar(384) = null, @table_qualifier sysname = null, @column_name nvarchar(384) = null, @ODBCVer int = 2 ``` sp_tables 的参数有: - `table_name` : 表名 - `table_owner` : 表的所有者;(一般查询的都为 dbo ,还有 sys 和 INFORMATION_SCHEMA) - `table_qualifier` : 对象限定符; **对象限定符的数据库名称部分必须是当前数据库的名称** ,一般 null 。 - `column_name` : 指定列名(只能一列) ```sql -- 查看表结构 sp_columns books GO -- 查看表的某列的结构 sp_columns books,dbo,NULL,"book_id" GO ``` ### MySQL 下查看表结构 `show create table table_name;` ```mysql mysql> show create table departments; +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | departments | CREATE TABLE `departments` ( `dept_no` char(4) NOT NULL, `dept_name` varchar(40) NOT NULL, PRIMARY KEY (`dept_no`), UNIQUE KEY `dept_name` (`dept_name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) ``` :::{note} `show create database database_name;` ::: [^id11]: 所有的系统级存储过程都可以在 SQL Server 的系统数据库的系统存储过程中找到。