5.1. 数据库和表的基本操作

5.1.1. 查看数据库系统的所有数据库

备注

对于 SQL Server 来说,获取一些基本信息常常需要使用系统定义的存储过程。

5.1.1.1. SQL Server 下查看数据库系统的所有数据库

查看数据库(系统)的所有数据库有以下方法:

  • 通过存储过程 sp_databases (注意:该存储过程是系统级的,在任意数据库都可以使用且效果一样)

  • 通过查询 sys.databases

5.1.1.1.1. sp_databases

-- 系统存储过程 : 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
表 5.1.1 sp_databases 运行结果

DATABASE_NAME

DATABASE_SIZE

REMARKS

bladex_boot

16384

NULL

bladex_boot_copy

4472832

NULL

bladexbootbak

1654784

NULL

cbbs

16384

NULL

learning_sql_server

16384

NULL

master

7552

NULL

model

16384

NULL

msdb

21824

NULL

tempdb

73728

NULL

5.1.1.1.2. 查询 sys.databases

通过执行查询命令 SELECT name AS database_name,database_id,collation_name FROM sys.databases 来查看所有数据库。

表 5.1.2 查询 sys.databases 的运行结果

database_name

database_id

collation_name

master

1

Chinese_PRC_CI_AS

tempdb

2

Chinese_PRC_CI_AS

model

3

Chinese_PRC_CI_AS

msdb

4

Chinese_PRC_CI_AS

bladex_boot

5

Chinese_PRC_CI_AS

bladex_boot_copy

6

Chinese_PRC_CI_AS

learning_sql_server

7

Chinese_PRC_CI_AS

cbbs

8

Chinese_PRC_CI_AS

bladexbootbak

9

Chinese_PRC_CI_AS

5.1.1.2. MySQL 下查看数据库系统的所有数据库

MySQL 下的查看方法为: show databases

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| ...                 |
| yggl                |
+---------------------+
20 rows in set (0.00 sec)

5.1.2. 使用数据库系统中的某个数据库

使用 use 关键字使用或更换使用的数据库,这个是 sql 通用的命令关键字。

命令形如 use target_database


备注

这个方法通用于 SQL Server 和 MySQL 。

5.1.3. 查看数据库的全部表

5.1.3.1. SQL Server 下查看数据库的全部表

有以下方法

  • 通过存储过程 sp_tables (注意:该存储过程是系统级的)

  • 通过查询 sys.tables

备注

由于 sp_tables 的实现代码长且复杂,同时如果不带参数地执行该存储过程,那么其结果将包含该库的所有表(一般来说我们只需要看 dbo 部分的表)。同时为节省篇幅,所以不将其展示。sp_tables 存储过程 1

5.1.3.1.1. 使用带有参数的 sp_tables

不带有参数的 sp_tables 运行产生的结果比较不具备可用性且没有目的性。

让我们通过定义看看 sp_tables 的参数有哪些:

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 : 表的类型,有 TABLEVIEW 以及 SYSTEM TABLE

注意

sp_tables null,null,null,null 是等同于 sp_tables 的。

-- 执行存储过程
sp_tables NULL,dbo,NULL,"'TABLE'"
GO
表 5.1.3 执行带参数的 sp_tables 的运行结果

TABLE_QUALIFIER

TABLE_OWNER

TABLE_NAME

TABLE_TYPE

REMARKS

learning_sql_server

dbo

books

TABLE

NULL

learning_sql_server

dbo

Customers

TABLE

NULL

learning_sql_server

dbo

OrderItems

TABLE

NULL

learning_sql_server

dbo

Orders

TABLE

NULL

learning_sql_server

dbo

Products

TABLE

NULL

learning_sql_server

dbo

Vendors

TABLE

NULL

5.1.3.1.2. 查询 sys.tables

-- 执行查询
SELECT name,type,type_desc FROM sys.tables
GO
表 5.1.4 查询 sys.tables 的运行结果

name

type

type_desc

books

U

USER_TABLE

Customers

U

USER_TABLE

OrderItems

U

USER_TABLE

Orders

U

USER_TABLE

Products

U

USER_TABLE

Vendors

U

USER_TABLE


5.1.3.2. MySQL 下查看数据库的全部表

  • use target_database;

  • show tables;

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)

5.1.4. 查看表结构

5.1.4.1. SQL Server 下查看表结构

让我们通过定义看看 sp_tables 的参数有哪些:

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 : 指定列名(只能一列)

-- 查看表结构
sp_columns books
GO
-- 查看表的某列的结构
sp_columns books,dbo,NULL,"book_id"
GO

5.1.4.2. MySQL 下查看表结构

show create table table_name;

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)

备注

show create database database_name;


1

所有的系统级存储过程都可以在 SQL Server 的系统数据库的系统存储过程中找到。