2.3 SQL语言基础介绍
2.3.1 数据库基础
1.数据库
数据库是一个以某种有组织的方式存储的数据集合。最简单的解释就是将数据库想象为一个文件柜,该文件柜是一个存放数据的物理位置,不管数据是什么,也不管数据是如何组织的,而数据库(DataBase)是保存有组织的数据的容器(通常是一个文件或一组文件)。
事实上,数据库这个术语通常代表使用的数据库软件,这是不正确的,也因此产生了许多混淆。确切地说,数据库软件应该称为数据库管理系统,英文全称“Database Management System”(简称DBMS)。数据库是通过DBMS创建和操纵的容器,而它究竟是什么?形式如何?各种数据库都不一样。
2.表
当你往文件柜里存放资料时,并不是将这些资料随便扔在某个抽屉就行了,而是要在文件柜中创建文件,然后将相关资料放入相关的文件中。在数据库领域,这种文件被称为表。表(Table)是一种结构化的文件,能够用来存储某种特定类型的数据,它是某种特定类型数据的结构化清单。
数据库中的每张表都有一个名字来标识自己,而这个名字也是唯一的,让表名成为唯一的,实际上是数据库名和表名等的组合。有的数据库还使用数据库拥有者的名字作为唯一名的一部分,也就是说,在相同数据库中不能使用相同的表名,但在不同的数据库中完全可以使用相同的表名。
3.列
表是由列组成的,列存储表中某部分的信息。列(Column)是表中的一个字段。所有表都是由一个或多个列组成的,即表是由一个或多个字段组成的。理解列的最好办法是将数据库的表想象为一个网格,形同一个电子表格一样。网格中的每一列都存储着某种特定的信息。比如,在车主基本信息表中,一列存储车架号,另一列存储车主姓名,而身份证号、车牌号、电话、地址等全都存储在各自的列中。
4.数据类型
数据库中的每个列都有相应的数据类型(Data Type)。从另外一个角度说,数据类型定义了表中的每个列可以存储哪些数据种类。
数据类型及其命名是造成SQL不兼容的主要两种原因。虽然大多数基本数据类型在不同DBMS中得到了的支持是一致的,但许多高级的数据类型却没有得到一致的支持。更糟的是,偶然会有相同的数据类型在不同的DBMS中具有不同的名称。对此用户毫无办法,只能在创建表结构时记住这些差异。
5.行
表中的数据是按行存储的,所保存的每条记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。
行(Row)指表中的一条记录。有时,可能听到用户在提到行时称其为数据库记录Record)。这两个术语大多数情况下是可以交替使用的,但从技术上说,行才是正确的术语。
6.主键
表中每一行都应该有一列(或几列)可以唯一标识自己。主键是用来表示一个特定的行。没有主键,更新或删除表中特定行就极为困难,因为在这种情况下无法保证操作只涉及相关的行。
主键(Primary Key)一列(或一组列),其值能够唯一标识表中每一行。
表中任何列只要满足以下条件,均可以作为主键:
· 任意两行都不具有相同的主键值。
· 每一行都必须具有一个主键值(主键值不允许为NULL值)。
· 主键列中的值不允许修改或更新。
· 主键值不能重用(如果某行从表中删除,它的主键就不能赋给以后的新行)。
2.3.2 SQL简介
1.什么是SQL
SQL是用于访问和处理数据库的标准计算机语言。它是一种结构化查询语言,其全称是Structured Query Language,用于访问和处理数据库。它是一种ANSI(American National Standards Institute,美国国家标准化组织)标准的计算机语言。
2.SQL的优点
SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以掌握这门语言,几乎就能与所有数据库打交道。SQL简单易学,它的语句都是由具有很强描述性的英语单词组成,而且这些单词的数目不多。SQL虽然看上去很简单,但实际上是一种强有力的语言,灵活使用它的语言元素,就可以进行非常复杂和高级的数据库操作。
3.SQL能做什么
· SQL可向数据库执行查询。
· SQL可从数据库取回数据。
· SQL可在数据库中插入最新的记录。
· SQL可更新数据库中的数据。
· SQL可从数据库删除记录。
· SQL可创建新数据库。
· SQL可在数据库中创建新表。
· SQL可在数据库中创建存储过程。
· SQL可在数据库中创建视图。
· SQL可以设置表、存储过程和视图的权限。
· SQL可以设置人员访问权限以及增删改等操作权限。
· SQL可以创建索引。
4.SQL的扩展
许多的DBMS厂商通过增加语句或指令,对SQL进行了扩展。这种扩展的目的,主要是提供执行特定操作的额外功能或简化方法。虽然这种扩展很有用,但一般都是针对个别DBMS的,很少有两个以上的供应商支持这种扩展。标准SQL由ANSI标准委员会管理,从而称为ANSI SQL。所有主要的DBMS,即使都有自己的扩展,也都支持ANSI SQL。各个扩展的具体实现有自己的名称,如PL/SQL、Transact-SQL等。
2.3.3 SQL语法
1.数据库表
一个数据库通常包含一个或多个表。每个表由一个名字标识(例如:Websites),表包含带有数据的记录(行)。比如在MySQL的RUNOOB数据库中创建了Websites表,用于存储网站记录。可以通过以下命令查看Websites表的数据:
use test; # 该命令用于选择数据库 SELECT * FROM Websites; # 该命令用于读取数据表的信息
下面的图中包含五条记录(每一条对应一个网站信息)和5个列(id、name、url、alexa和country)。运行结果如图2-10所示。
图2-10 MySQL查看数据
2.SQL语句
需要在数据库上执行的大部分工作都由SQL语句完成。
下面的SQL语句从Websites表中选取所有记录:
SELECT * FROM Websites;
请记住:SQL是不区分字母大小写的:SELECT与select是相同的,但是MySQL数据库在Linux系统中是区分数据库名和表名的字母大小写的,因而可以强制配置MySQL的配置文件my.cnf,设置lower_case_table_names = 1 ,使MySQL对数据库名和表名的字母大小写不敏感。
SQL语句后面的分号:
· 某些数据库系统要求在每条SQL语句的末端使用分号。
· 分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的SQL语句。
· 在本课程中,我们将在每条SQL语句的末端使用分号。
3.常用SQL命令
· SELECT:从数据库中提取数据。
· UPDATE:更新数据库中的数据。
· DELETE:从数据库中删除数据。
· INSERT INTO:向数据库中插入新数据。
· CREATE DATABASE:创建新数据库。
· ALTER DATABASE:修改数据库。
· CREATE TABLE:创建新表。
· ALTER TABLE:变更(改变)数据库表。
· DROP TABLE:删除表。
· CREATE INDEX:创建索引(搜索键)。
· DROP INDEX:删除索引。
2.3.4 SQL基础语法
1.SQL基础语法
在本节内容中,我们将使用Websites表的数据进行演示。
2.SELECT语句
SELECT语句用于从数据库中选取数据。结果被存储在一个结果表中,称为结果集。
语法:
SELECT column_name1, column_name2 FROM table_name; SELECT * FROM table_name;
示例:
SELECT name, country FROM Websites;
上面的SQL语句表示从“Websites”表中选取“name”和“country”两列(或两个字段)。
3.SELECT DISTINCT语句
在数据库的表中,一个列可能会包含多个重复值,有时也许希望仅仅列出不同(distinct)的值。而DISTINCT关键词可以用于返回唯一不同的值。
语法:
Select distinct column_name1, column_name2 from table_name;
示例:
SELECT DISTINCT country FROM Websites;
上面的SQL语句仅从Websites表的country列中选取唯一不同的值,也就是去掉country列中的重复值。
4.WHERE子句
WHERE子句用于提取那些满足指定标准的记录。
语法:
SELECT column_name1, column_name2 FROM table_name WHERE column_name operator value;
示例:
SELECT * FROM Websites WHERE country='CN';
上面的SQL语句从Websites表中选取国家为“CN”的所有网站。
5.AND和OR运算符
AND运算符,若第一个条件和第二个条件都成立,满足条件的记录则被提取出来。
OR运算符,若第一个条件和第二个条件中只要有一个成立,满足条件的记录被提取出来。
(1)AND运算符号
示例:
SELECT * FROM Websites WHERE country='CN' AND alexa > 50;
上面的SQL语句从Websites表中选取国家为“USA”或者“CN”的所网站。
(2)OR运算符号
示例:
SELECT * FROM Websites WHERE country='USA' OR country='CN';
上面的SQL语句从“Websites”表中选取国家为“USA”或者“CN”的所有网站。
6.ORDER BY关键字
ORDER BY关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,可以使用DESC关键字。
示例:
SELECT * FROM Websites ORDER BY alexa DESC;
上面的SQL语句从Websites表中选取所有网站,并按照alexa列降序排序。
· order by A, B:默认按升序排列。
· order by A desc, B:A降序,B升序排列。
· order by A, B desc:A升序,B降序排列。
7.INSERT INTO语句
INSERT INTO语句用于向表中插入最新记录。
语法:
形式一,无须指定要插入数据的列名,只需提供被插入的值即可。
INSERT INTO table_name VALUES ( value1, value2, value3, …);
语法:
形式二,需要指定列名及被插入的值。
INSERT INTO table_name (column1, column2, column3, … ) VALUES ( value1, value2, value3, …);
示例:
INSERT INTO Websites (name, url, alexa, country) VALUES ('百度','https://www.baidu.com/','4','CN');
假设我们要向Websites表中插入一个新行,可以使用上面的SQL语句。