这里用了(My)SQL 这样的标题,目的是在介绍标准SQL 的同时,也将一些MySQL 在标准SQL 上的扩展一同介绍给读者。希望读者看完本节后,能够对标准SQL 的基本语法和MySQL 的部分扩展语法有所了解。

2.2.1 SQL 分类

SQL 语句主要可以划分为以下3 个类别。

  • DDL(Data Definition Language)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create、drop、alter 等。

  • DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括insert、delete、update和select 等。

  • DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。常用的语句关键字主要包括grant、revoke 等。

2.2.2 DDL 语句

简单来说,DDL 就是对数据库内部的对象进行创建、删除、修改等操作的语言。它和DML 语句的最大区别是DML 只是操作表内部的数据,而不涉及表的定义、结构的修改,更不会涉及其他对象。DDL 语句更多地是由数据库管理员(DBA)使用,开发人员一般很少使用。

下面通过一些例子来介绍MySQL 中常用DDL 语句的使用方法。

1.创建数据库

启动MySQL 服务之后,输入以下命令连接到MySQL 服务器:

[root~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

在以上命令行中,mysql 代表客户端命令,“-u”后面跟连接的数据库用户,“-p”表示需要输入密码。 如果数据库设置正常,并输入了正确的密码,将看到上面一段欢迎界面和一个“mysql>”提示符。在欢迎界面中说明了以下几部分内容。

  • 命令的结束符,用“;”或者“\g”结束。
  • 客户端的连接ID,这个数字记录了MySQL 服务到目前为止的连接次数;每一个新连接都会自动加1,本例中是31。
  • MySQL 服务器的版本和类型,本例中是“8.0.11 MySQL Community Server - GPL”,说明是8.0.11 的社区发行版。
  • 通过“help;”或者“\h”命令来显示帮助内容,通过“\c”命令来清除命令行buffer。在mysql>提示符后面输入所要执行的SQL 语句,每个SQL 语句以分号(;)或者“\g”结束,按回车键执行。

因为所有的数据都存储在数据库中,因此需要学习的第一个命令是创建数据库,语法如下所示:

CREATE DATABASE dbname

例如,创建数据库test1,命令执行如下:

mysql> create database test1;
Query OK, 1 row affected (0.00 sec)

可以发现,执行完创建命令后,下面有一行提示“Query OK, 1 row affected (0.00 sec)”,这段提示可以分为3 个部分。“Query OK”表示上面的命令执行成功。读者可能会觉得奇怪,又不是执行查询操作,为什么显示查询成功?其实这是MySQL 的一个特点,所有的DDL 和DML(不包括SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了。“1 rowaffected”表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。

如果已经存在这个数据库,系统会提示:

mysql> create database test1;
ERROR 1007 (HY000): Can't create database 'test1'; database exists

这时,如果需要知道系统中都存在哪些数据库,可以用以下命令来查看:

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
5 rows in set (0.00 sec)

可以发现,在上面的列表中除了刚刚创建的test1 外,还有另外4 个数据库,它们都是安装MySQL 时系统自动创建的,其功能分别如下。

  • information_schema:主要存储系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。每个用户都可以查看这个数据库,但根据权限的不同看到的内容不同。

  • performance_schema:MySQL 5.5 引入的系统库,用于存储系统性能相关的动态参数表。

  • sys:MySQL 5.7 引入的系统库,本身不记录系统数据,基于information_schema 和performance_schema 之上,封装了一层更加易于调优和诊断的系统视图。
  • mysql:存储系统的用户权限信息。

在查看系统中已有的数据库后,可以用如下命令选择要操作的数据库:

USE dbname

例如,选择数据库test1:

mysql> use test1
Database changed

然后再用以下命令来查看test1 数据库中创建的所有数据表:

mysql> show tables;
Empty set (0.00 sec)

由于test1 是刚创建的数据库,还没有表,所以显示为空。命令行下面的“Empty set”表示操作的结果集为空。如果查看一下mysql 数据库里面的表,则可以得到以下信息:

mysql> use mysql

mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+--------------------------+
33 rows in set (0.00 sec)

2.删除数据库 删除数据库的语法很简单,如下所示:

drop database dbname;

例如,要删除test1 数据库可以使用以下语句:

mysql> drop database test1;
Query OK, 0 rows affected (0.00 sec)

可以发现,提示操作成功后,后面却显示“0 rows affected”,这个提示的含义是前一次MySQL 操作所影响的记录行数,通常只对增删改操作生效,drop 等DDL 操作通常显示“0 rowsaffected”。

注意:数据库删除后,下面的所有表数据都会全部删除,所以删除前一定要仔细检查并做好相应备份。

3.创建表

在数据库中创建一张表的基本语法如下:

CREATE TABLE tablename (
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
…
column_name_n column_type_n constraints)

因为MySQL 的表名是以文件的形式保存在磁盘上的,所以表名的字符可以用任何文件名允许的字符。column_name 是列的名字;column_type 是列的数据类型;constraints 是这个列的约束条件,在后面的章节中会详细介绍。

例如,创建一个名称为emp 的表。表中包括ename(姓名)、hiredate(雇用日期)和sal(薪水)3 个字段,字段类型分别为varchar(10)、date、int(2)(关于字段类型将会在第 3 章中介绍):

mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected (0.02 sec)

表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:

DESC tablename

例如,查看emp 表,将输出以下信息:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

虽然desc 命令可以查看表定义,但是其输出的信息还是不够全面。为了得到更全面的表定义信息,有时就需要查看创建表的SQL 语句,可以使用如下命令查看:

mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE 'emp' (
'ename' varchar(20) DEFAULT NULL,
'hiredate' date DEFAULT NULL,
'sal' decimal(10,2) DEFAULT NULL,
'deptno' int(2) DEFAULT NULL,
KEY 'idx_emp_ename' ('ename')
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.02 sec)
ERROR:
No query specified
mysql>

从上面创建表的SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。“\G”选项的含义是使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录。

4.删除表

表的删除命令如下:

DROP TABLE tablename

例如,要删除数据库emp 可以使用以下命令:

mysql> drop table emp;
Qu ery OK, 0 rows affected (0.00 sec)

5.修改表 对于已经创建好的表,尤其是已经有大量数据的表,如果需要做一些结构上的改变,可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。

因此,在大多数情况下,表结构的更改都使用alter table 语句,以下是一些常用的命令。

(1)修改表类型,语法如下:

ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]

例如,修改表emp 的ename 字段定义,将varchar(10)改为varchar(20):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(2)增加表字段,语法如下:

ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]

例如,在表emp 中新增加字段age,类型为int(3):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

(3)删除表字段,语法如下:

ALTER TABLE tablename DROP [COLUMN] col_name

例如,将字段age 删除掉:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(4)字段改名,语法如下:

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]

例如,将age 改名为age1,同时修改字段类型为int(4):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
mysql> alter table emp change age age1 int(4) ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp
-> ;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age1 | int(4) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

注意:change 和modify 都可以修改表的定义,不同的是change 后面需要写两次列名,不方便。但是change 的优点是可以修改列名称,modify 则不能。

(5)修改字段排列顺序。

前面介绍的字段增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选项first|aftercolumn_name,这个选项可以用来修改字段在表中的位置,ADD 增加的新字段默认是加在表的最后位置,而CHANGE/MODIFY 默认都不会改变字段的位置。 例如,将新增的字段birth date 加在ename 之后:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

修改字段age,将它放在最前面:

mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | | |
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

注意:CHANGE/FIRST|AFTER COLUMN 这些关键字都属于MySQL 在标准SQL 上的扩展,在其他数据库上不一定适用。

(6)更改表名,语法如下:

ALTER TABLE tablename RENAME [TO] new_tablename

例如,将表emp 改名为emp1,命令如下:

mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.00 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'sakila.emp' doesn't exist
mysql> desc emp1;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | | |
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

本文截选自刚刚上架的《深入浅出MySQL 数据库开发 优化与管理维护》 第3版,翟振兴,张恒岩,崔春华,黄荣,董骐铭著。

  • 基于官方的MySQL 5.7版本进行全面修订,新增了大量8.0新特性。
  • 新增数据库自动化运维章节,可帮助读者轻松搭建自己的RDS。
  • 全面改写“架构篇”,复制/中间件/高可用更贴实战。

本书是同名经典畅销图书的升级版,基于MySQL 5.7版本进行了内容改写,同时穿插介绍了MySQL 8.0版本的重要功能,此外还增加了高可用架构、数据化自动运维、数据库中间件等主题介绍和应用实践。

本书分为“基础篇”“开发篇”“优化篇”“管理维护篇”和“架构篇”,其内容源自网易公司多位资深数据库专家数年的经验总结和MySQL数据库的使用心得。本书以实用性和可操作性为主旨,章节安排合理有序,内容丰富全面,讲解由浅入深,还提供了大量的一线工作实例。

无论是数据库初学人员,还是有一定经验的数据库管理/维护/开发人员,都可以在阅读本书的过程中或有匪浅。本书还适合作为数据库相关专业的参考用户,以及相关培训机柜的培训教材。

本书内容:

  • 基础篇 
    MySQL的安装与配置 
    SQL基础 
    MySQL支持的数据类型 
    MySQL中的运算符 
    常用函数
  • 开发篇 
    表类型(存储引擎)的选择 
    选择合适的数据类型 
    字符集 
    索引的设计和使用 
    开发常用数据库对象 
    事务控制和锁定语句 
    SQL中的安全问题 
    SQL Mode及相关问题 
    MySQL分区
  • 优化篇 
    SQL优化 
    锁问题 
    优化MySQL Server 
    磁盘I/O问题 
    应用优化 
    PS/SYS数据库 
    故障诊断
  • 管理维护篇 
    MySQL高级安装和升级 
    MySQL中的常用工具 
    MySQL日志 
    备份与恢复 
    MySQL权限与安全 
    MySQL监控 
    MySQL常见问题和应用技巧 
    自动化运维系统的开发
  • 架构篇
  • MySQL复制
  • 高可用架构
  • MySQL中间件

(My)SQL 使用入门相关推荐

  1. SQL查询入门(下篇)

    引言 在前两篇文章中,对于单表查询和多表查询的概念做出了详细的介绍,在本篇文章中会主要介绍聚合函数的使用和数据的分组. 简介 简单的说,聚合函数是按照一定的规则将多行(Row)数据汇总成一行的函数.对 ...

  2. SQL查询入门(中篇)

    引言 在前篇文章中(SQL查询入门(上篇),我对数据库查询的基本概念以及单表查询做了详细的解释,本篇文章中,主要说明SQL中的各种连接以及使用范围,以及更进一步的解释关系代数法和关系演算法对在同一条查 ...

  3. sql xml 入门

    /* sql xml 入门:--by jinjazz--http://blog.csdn.net/jinjazz1.xml: 能认识元素.属性和值2.xpath: 寻址语言,类似windows目录的查 ...

  4. 今晚直播丨国产数据库入门:openGauss数据库的基本管理和SQL语句入门

    国产数据库入门:openGauss数据库的基本管理和SQL语句入门 - 08/13 简介: 本讲座通过实验,学习管理openGauss数据库和SQL语言的使用: 通过学习基本的openGauss数据库 ...

  5. sql server 入门_SQL Server查询调整入门

    sql server 入门 This article will cover some essential techniques for SQL query tuning. Query tuning i ...

  6. sql server 入门_SQL Server中的数据挖掘入门

    sql server 入门 介绍 (Introduction) In past chats, we have had a look at a myriad of different Business ...

  7. sql server 入门教程

    sql server 入门教程 1.创建数据库 1)鼠标右键数据库选项,点击新建数据库 2)命名数据库 根据自己业务情况取一个自定义数据库名字,比如:my_database 3)查看数据库 如果添加没 ...

  8. PostgreSQL修炼之道之SQL语言入门(四)

    目录 第三章 SQL语言入门(二) 3.4 查询语句 3.4.1 单表查询语句 3.4.2 过滤条件的查询 3.5 其他SQL语句 3.5.1 INSERT INTO... SELECT语句 3.5. ...

  9. sql server 入门篇

    sql server入门篇 一.创建数据库 二.修改数据库 三.删除数据库 四.数据表创建 五.数据表数据修改(增.删.改) 六.数据表查询 七.数据表操作 一.创建数据库 1.格式 CREATE D ...

  10. SQL Server入门(四) 官网关于 SQL Server初级入门教程

    原文http://www.shareblogs.top/444/ 学习内容 这些教程将帮助你理解 SSMS 中提供的信息以及如何利用其功能. 熟悉 SSMS 的最好方式是进行实践演练. 这些教程将使你 ...

最新文章

  1. 第三课.python编程基础(二)
  2. ACID+CAP+BASE+Transaction(事务)
  3. vue中使用baidushare分享到微信无法显示bug解决方案
  4. springboot集成themeleaf报Namespace 'th' is not bound
  5. Python基础之数据类型(一)
  6. 这周开发工作时间及内容、思考和阅读的内容
  7. grep与sed批量处理多个文件中的字符串的方法
  8. Python+Requests+Pytest+YAML+Allure实现接口自动化
  9. fiddler基础入门
  10. mysql 事务操作详细实例介绍
  11. nginx源码分析——configure脚本
  12. NUC1016 斐波那契数列【打表】
  13. Google I/O 2016到底讲了啥
  14. 整理 深入理解RunLoop
  15. 微信小程序云开发教程-产品原型的意义
  16. 五句话介绍计算机英语,用英语描写电脑优点(5个句子)和缺点(5个句子),一共10句话哦....
  17. 红外遥控接收头 的引脚参数
  18. 前端高级进阶13本经典书籍
  19. simulink仿真结果出现振荡
  20. 剖析 Microsoft.AspNetCore.Identity 的精髓 —— 前言

热门文章

  1. 创维E900V22E_卡刷固件及升级说明
  2. 微生物组-宏基因组分析专题技术研讨会(2023.3)
  3. 计算机如何安装程序,怎么禁止电脑安装任何软件?禁止计算机安装程序的方法(图文)...
  4. HDU1411求四面体体积
  5. 解开“艾达之谜”:关于第一位程序员你所不知的故事
  6. 高精地图落地 | InstaGraM:实时端到端矢量化高精地图新SOTA!
  7. docker监控方案
  8. 特征工程——推荐系统里的特征工程
  9. (软考高级)信息系统项目管理师过关经验
  10. 中断向量,中断向量表 ,中断服务函数