数据库术语
- 数据库(database):保存有组织的数据的容器。(数据库软件是数据库管理系统DBMS,数据库是通过DBMS创建和操纵的容器)
- 表(table):某种特定类型数据的结构化清单。(在相同数据库中不能有同样名字的表,但在不同数据库中,表的名字可以相同)
- 模式:关于数据库和表的布局及特性的信息
- 列:表中的一个字段。所有表都是由一个或多个列组成的。
- 数据类型:所允许的数据的类型。每个表列都有相应的数据类型,它限制该列中存储的数据。
数据类型及其名称是SQL不兼容的一个主要原因,一些高级的数据类型没有得到一致的支持,相同的数据类型在不同的DBMS中也有可能具有不同的名称。 - 行:表中的一个记录(行和记录两个术语可以交替使用,但从技术上讲行是正确的术语)
- 关键字(keyword):作为SQL组成部分的保留字,关键字不能用作表和列的名字。
- 主键:主键(primary key):一列(或一组列),其值能够唯一标识表中每一行(应该保证创建的每个表中都有主键,以便于数据操作和管理)
主键需要满足的条件:- 任意两行都不具有相同的主键值;
- 每一行都必须有一个主键值(主键值不能为null)
- 主键列中的值不允许修改或更新;
- 主键值不能重用(如果某行被删除,则他的主键不能赋给后面的新行)
- SQL: Structured Query Language(结构化查询语言)
SQL语句不区分大小写,不管是SELECT或是select或者Select都一样,但是表名列名值等可能是区分大小写的,这有赖于具体的DBMS及其如何配置。
在处理SQL语句是,其中所有的空格都被忽略,既可以写成长长的一行,也可以分写在多行。 - NULL:无值(no value)它与字段包含0、空字符串或仅仅包含空格不同。
- 操作符(operator)用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符。
- 通配符(wildcard):用来匹配值的一部分的特殊字符
- 搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件。
- 谓词(predicate):从技术上说,LIKE是谓词而不是操作符。
- 字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一半称为列,而属于字段通常与计算字段一起使用。
- 拼接(concatenate):将值连接到一起,(将一个值附加到另一个值)构成单个值。
- 查询(query):任何SQL语句都是查询,但此术语一般指SELECT语句。(MySQL从4.1版本开始支持子查询)
- 可伸缩(scale):能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称为可伸缩性好。
- 笛卡尔积(cartesian product):有没有联结条件的表关系返回的结果为笛卡尔积。检索出的行数目将是第一个表中的行数乘以第二个表中的行数。
- 约束:管理如何插入或处理数据库数据的规则。
检索数据
- 检索单个列
SELECT prod_name FROM Products;(此语句输出的数据不会按特定的排序)
2. 检索多个列
SELECT prod_id,prod_name,prod_price FROM Products;
由图可见,SQL语句一般返回原始的无格式的数据,如图中价格列没有表示为两位小数点的数。实际应用中很少直接使用实际检索出的数据。
3. 检索所有列
SELECT * FROM Products;
列的顺序一般是列在表定义中出现的物理顺序,但并不总是如此。一般而言最好不使用通配符,因为检索不需要的列会降低检索和应用程序的性能。
4. 检索不同的值
SELECT DISTINCT vend_id FROM Products;
DISTINCT关键字指示数据库只返回不同的值。
如果用DISTINCT同时检索多列,则返回多列组合起来不同的那些行
5. 限制结果
不同的DBMS中实现这一功能的语句不一样
- 在SQLServer和Access中:
SELECT TOP 5 prod_name FROM Products;//只检索前5行数据
- 在DB2中:
SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;
- 在Oracle中:
SELECT prod_name FROM Products WHERE ROWNUM<=5;
- 在MySQL、MariaDB、PostgreSQL或者SQLite中:
SELECT prod_name FROM Products LIMIT 5;
SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
//返回从第五行起的五行数据 第一个数字指从哪开始,第二个数字是需要检索的行数
在MySQL和MariaDB中可以简化为:
SELECT prod_name FROM Products LIMIT 3,4;
//从第三行开始的四行数据
第一个被检索的是第0行,而不是第一行
6.使用注释
-
行内注释
SELECT prod_name -- 这是一条注释 FROM Products;
注释使用两个–连字符嵌在行内,–之后的文本就是注释
#这是一条注释
SELECT prod_name
FROM Products;
在一行的开始处使用#,这一行都将作为注释//这种形式很少得到支持
/* SELECT prod_name,vend_id
FROM Products; */
SELECT prod_name,vend_id
FROM Products;
注释从/* 开始到 */结束,这些字符之间的任何内容都是注释。这种方式常用于给代码加注释
排序检索数据——ORDER BY
- 排序数据
SELECT prod_name FROM Products;//没有特定顺序
如果不排序,数据将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是如果数据进行过更新或者删除,那么这个顺序将会受到DBMS宠用回收存储空间的方式的印象。如果不明确控制的话,最终的结果不能也不应该依赖该排序顺序。
子句(clause):SQL语句由子句构成,有些子句是必须的,有些是可选的。一个子句通常由一个关键字加上所提供的数据组成。比如SELECT语句中的FROM子句
用ORDER BY子句对输出进行排序:
SELECT prod_name FROM Products ORDER BY prod_name;//按字母顺序排序
ORDER BY子句必须是语句中的最后一条子句;可以用非检索的列来选择排序方式。
- 按多个列排序
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name;
- 按列位置排序
select prod_id,prod_price,prod_name from Products order by 1,2;
它是按命令中列的相对位置来选,而不是列名的位置来选
这个命令的好处在于不用重新输入列名,但它也有缺点,首先,不明确给出列名有可能造成错用列名排序;其次再对select清单进行更改时容易错误的对数据进行排序;最后,如果要排序的列不在清单中,则不能使用这个命令。
- *指定排序方向
升序排序是默认的排序方式,进行降序排序要使用DESC关键字
select prod_id,prod_price,prod_name from Products order by prod_price desc;
如过要多个列排序,则
select prod_id,prod_price,prod_name from Products order by prod_price desc,prod_name;
由此可见DESC只应用到直接位于其前面的列名
DESC全名DESCENDING
升序ASC 全名ASCENDING
排序检索就用ORDER BY 子句!
过滤数据——WHERE
用where子句中鼎搜索条件(过滤条件)
最好不要在应用层进行过滤数据,
select prod_name,prod_price from Products where prod_price=3.49;
- 检查单个值
select prod_name,prod_price from Products where prod_price<10;
- 不匹配检查
select vend_id,prod_name from Products where vend_id <> ‘DLL01’;
单引号用来限定字符串,如果将值与字符串类型的列进行比较,就需要限定引号,如果是与数值列进行比较则不用引号
通常将<>改为!=也可以达到同样的效果,但不是所有的DBMS都支持这种操作,如MicrosoftAccess就不支持,而MySQL可以
- 范围值检查
select prod_name,prod_price from Products where prod_price between 5 and 10;
between必须指定两个值,两个值必须用and分割,between会匹配范围中所有的值,包括开始值和结束值
- 空值检查
select cust_name from Customers where cust_email is null;
通过过滤选择不包含指定值的所有行时,不会返回含NULL值得行,因为数据库不知道它是否匹配
高级过滤数据
组合WHERE子句
- AND操作符
select prod_id,prod_price,prod_name from Products where vend_id = ‘DLL01’ and prod_price <=4;
- OR操作符
许多DBMS在OR WHERE 子句的第一个条件得到满足时就不再计算第二个条件了
select prod_name,prod_price,vend_id from Products where vend_id = ‘DLL01’ or vend_id = ‘BRS01’ ;
- 求值顺序
AND的优先级比OR更高
select prod_name,prod_price,vend_id from Products where vend_id = ‘DLL01’ or vend_id = ‘BRS01’ and prod_price >=10;
由途中结果可见,SQL在执行上述语句时,它理解为:供应商BRS01制造的价格为10美元以上的商品或者供应商DLL01制造的商品
select prod_name,prod_price,vend_id from Products where (vend_id = ‘DLL01’ or vend_id = ‘BRS01’) and prod_price >=10;
加了括号之后就变为了返回供应商BRS01或DLL01制造的价格为10美元以上的商品
括号的优先级是最高的,所以在使用具有AND和OR操作符的WHERE子句时,应该使用括号明确地分组操作符
IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
select prod_name,prod_price,vend_id from Products where vend_id in (‘DLL01’ , ‘BRS01’) order by prod_name;
IN操作符后跟由逗号分隔的合法值,这些值必须在圆括号中。
IN操作符其实完成了与OR操作符相同的功能,用IN操作符的优点如下:
- 在有很多合法选项时,IN操作符更清楚直观;
- 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理;
- IN操作符一般比一组OR操作符执行的更快
- IN可以包含其他SELECT语句,能够更动态地建立WHERE子句
NOT操作符
NOT操作符有且只有一个功能,就是否定其后跟的任何条件;NOT关键字用在要过滤的列前,而不是其后
select prod_name from Products where not vend_id=‘DLL01’ order by prod_name;
大多数DBMS支持NOT否定任何条件,MariaDB只能否定IN、BETWEEN和EXISTS子句