SQL简介
我们对数据库已经有了一个感性认识,了解了数据库表以及表之间的几种关系。我们已经针对几个简单的场景设计了blog
、user
等几张数据表。在一个具体数据库(比如MySQL)中如何来描述表的结构和表之间的关系呢?这就是需要接下来讲的结构化查询语言(SQL, Structured Query Language)了。SQL是关系式数据库管理系统的标准语言,我们可以通过来对关系型数据库进行操作,创建表的内部结构与关联关系,并对表数据进行各种操作。
为什么要学习SQL
我们知道,现在的Web开发中我们引入了各种ORM(Object Relation Mapping)框架。通过ORM框架,我们可以基本屏蔽SQL的相关信息,直接通过面向对象的方式对数据库进行操作,ORM框架自身会为我们自动生成对应的SQL语句(这正是Mapping的意思)。那么我们为什么依赖还是需要学习SQL呢?
学习SQL对于我们编写更好程序还是是非常重要的:
- 由架构生成的SQL语句往往比较低效,当我们遇到效率上的瓶颈时,自己重写SQL语句往往是有效的解决方案
- 直接通过面向对象的方式操作数据库往往会大大增加数据库的操作数,导致程序与数据库之间的通信数量大大增加,这往往会造成数据库压力过大,甚至宕机。如果我们了解SQL,可以通过优化程序的方式减少数据库的压力
- 开发时可能会遇到一些SQL相关的问题,如果不了解SQL的话可能会花费大量的时间,但是如果学习过SQL后就能够很容易的发现。例如
from
是SQL的一个关键字,如果我们将为某个对象的属性名取名为from
,此时直接运行框架为我们生成的SQL语句将会抛出错误。如果了解SQL的话看到错误就能很快的发现问题并解决。
总而言之,如果你想成为一个优秀的Java Web开发者,学习SQL是非常必要的。
SQL包含哪些内容
SQL主要包含两部分内容:
数据定义语言(Data Definition Language, DDL)
负责数据结构定义与数据库对象定义的语言。新建、更改或者删除数据库表等对数据库表的操作都属于数据定义语言的范围。
数据操纵语言 (Data Manipulation Language, DML)
负责对数据库对象运行数据访问工作,包括查询、插入、更新与删除数据,是进行数据操纵时与数据库系统交互的指令。
安装MySQL Server
学习具体的SQL语法之前,我们先熟悉一个开源的数据库实现MySQL。在熟悉MySQL的过程中来学习SQL语法,能够让我们看到实际的操纵效果,加深我们的理解。我们先来装MySQL服务器吧。
我们选择MySQL的开源社区版——MySQL Community Server。在MySQL官方下载页面选择合适的平台和版本,进行下载。
Mac环境
Mac环境我们一般选择DMG格式的安装包,下载完成后,按提示进行安装即可。
Windows环境
Windows环境下,我们根据系统选择相应的ZIP格式安装包。
下载完成后解压到合适的位置中,我们将解压后的地址假设为MYSQL_HOME
。解压完成后,我们需要将MySQL的bin目录添加至环境变量Path中。进入控制面板 -> 所有控制面板项 -> 系统 -> 高级 -> 环境变量,在Path后添加;MYSQL_HOME/bin
,修改环境变量的详细步骤不再赘述,可参照Java开发环境安装与配置。
验证MySQL Server
安装完成后,我们打开命令行,通过以下命令查看是否安装成功:
mysql --version
如果看到类似下列Mysql信息,则说明安装成功
mysql Ver 14.14 Distrib 5.1.63, for apple-darwin10.3.0 (i386) using readline 5.1
安装成功后,可以输入以下命令登录Mysql Server:
mysql -u root -p
登录成功后我们就能通过SQL语句操作数据库,例如,当我们输入命令show databases;
我们就能看见当前MySQL服务器下的所有数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
这都是MySQL自带的数据库,用以保存其自身的数据。我们可以输入use mysql;
进入到mysql
数据库中。
输入命令show tables
就能看到当前数据库中的所有表:
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| 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 |
+---------------------------+
31 rows in set (0.00 sec)
这时我们就行进行数据库表的增删改查了。比如我们将help_category
中的数据全部取出来:
mysql> select * from help_category;
+------------------+-----------------------------------------------+--------------------+-----+
| help_category_id | name | parent_category_id | url |
+------------------+-----------------------------------------------+--------------------+-----+
| 1 | Geographic | 0 | |
| 2 | Polygon properties | 35 | |
| 3 | Numeric Functions | 39 | |
| 4 | WKT | 35 | |
| 5 | Plugins | 36 | |
| 6 | Control flow functions | 39 | |
| 7 | MBR | 35 | |
| 8 | Transactions | 36 | |
| 9 | Help Metadata | 36 | |
| 10 | Account Management | 36 | |
| 11 | Point properties | 35 | |
| 12 | Encryption Functions | 39 | |
| 13 | LineString properties | 35 | |
| 14 | Miscellaneous Functions | 39 | |
| 15 | Logical operators | 39 | |
| 16 | Functions and Modifiers for Use with GROUP BY | 36 | |
| 17 | Information Functions | 39 | |
| 18 | Storage Engines | 36 | |
| 19 | Bit Functions | 39 | |
| 20 | Comparison operators | 39 | |
| 21 | Table Maintenance | 36 | |
| 22 | User-Defined Functions | 36 | |
| 23 | Data Types | 36 | |
| 24 | Compound Statements | 36 | |
| 25 | Geometry constructors | 35 | |
| 26 | GeometryCollection properties | 1 | |
| 27 | Administration | 36 | |
| 28 | Data Manipulation | 36 | |
| 29 | Utility | 36 | |
| 30 | Language Structure | 36 | |
| 31 | Geometry relations | 35 | |
| 32 | Date and Time Functions | 39 | |
| 33 | WKB | 35 | |
| 34 | Procedures | 36 | |
| 35 | Geographic Features | 36 | |
| 36 | Contents | 0 | |
| 37 | Geometry properties | 35 | |
| 38 | String Functions | 39 | |
| 39 | Functions | 36 | |
| 40 | Data Definition | 36 | |
+------------------+-----------------------------------------------+--------------------+-----+
40 rows in set (0.00 sec)
我们看到表中有40条记录,对应于MySQL帮助信息的40个分类。注意这里只是为了让大家了解MySQL的命令行控制台的使用,一般情况下我们是不需要也不应该去修改MySQL自带的数据库。
安装MySQL Workbench
大家对SQL语法可能还不是很了解,对于通过命令行直接与数据库进行交互不太习惯。没关系,MySQL为我们提供了一个图形界面–MySQL Workbench,我们可以通过图形界面对数据库进行操作。
我们首先进行MySQL Workbench 官方下载页面下载MySQL Workbench,对于Mac系统以及Windows系统都有相应的安装包,下载后直接安装即可。
使用MySQL Workbench连接数据库
打开MySQL Workbench,我们可以看到如下界面:
点击左上角的加号,创建一个新的连接,根据提示依次以下信息:
- Connection Name:连接名,自定义即可
- Hostname:数据库地址,我们的MySQL Server在本地,填写127.0.0.1即可
- Username:用户名,这里我们使用root
- Password:密码,如果没有设置默认密码为空
创建成功后,单击【localhost】即可进入数据库:
创建数据库
点击数据库按钮创建一个测试数据库:
输入数据库名称test
,为了编码出现中文字符乱码的问题,在创建数据库时需要指定数据库的默认字符编码,这里我们选择字符编码default - default collation
:
点击【Apply】,MySQL Workbench会根据你的输入自动生成SQL语句。检查SQL语句无误,再次点击【Apply】,即可成功创建数据库。我们可以在左下角的数据库列表中看到新建的数据库test
:
创建数据库表
右键【test数据库】,将`test`数据库设置为此次连接的默认数据库,接下来的所有操作都将在`test`数据库下进行操作:
打开`test`数据库的折叠菜单,右键Tables,选择【Create Table…】创建数据库表:
按照提示输入数据库表的相关信息,这里我们只填以下两个信息:
- 数据库表名:使用
test
作为数据表名 - 字段:为
test
表添加一个title
字段,数据类型为VARCHAR(255)
点击【Apply】,MySQL Workbench同样会根据你的输入自动生成SQL语句。检查SQL语句无误,再次点击【Apply】,即可成功创建数据库表`test`。我们可以在左下角数据库test
的Tables菜单下看到我们新建的`test`表:
查看并操作数据
右键【test表】,选择【Select Rows…】即可查看test
表中的数据。
我们可以看到,在1区域显示了查看test
表数据所对应的SQL语句,在2区域显示了test
表的前1000条数据,目前`test`表中还没有任何数据:
双击2区域中的【null】标识,进入编辑模式,为`test`表添加第一条数据,添加完成后,单击【Apply】,MySQL Workbench将生成向test
表插入一条数据的SQL语句。再次点击【Apply】,执行SQL语句,成功将数据插入`test`表。
再次右键【test表】,选择【Select Rows…】,查看test
表中的数据,发现test
表中有一条记录。
当我们通过web界面对数据库进行操作时,我们可以通过MySQL Workbench随时查看我们的操作是否正确。
通过SQL语句与数据库交互
无论我们对数据库进行何种操作,MySQL Workbench实际上都会帮我们转化为SQL语句。当然,我们还可以直接告诉MySQL Workbench最终的SQL语句,MySQL Workbench直接执行即可。
单击坐上角【create new sql tab…】按钮,将出现一个新的窗口:
在窗口中输入希望运行的SQL语句,单击【运行】按钮即可: