1.1 基础概念
1.数据库(database)
保存有组织的数据的容器(通常是一个文件或一组文件)
注意:常用的mysql,等是数据库管理系统DBMS;由这些软件创建和操作的容器才是数据库;
2.表(table)
表是一种结构化的文件,可用来存储某种特定类型的数据;可以保存顾客清单,产品目录等其他信息;就像是,把东西往抽屉里放,并不是随便扔在抽屉里就行,而是在抽屉里放一些文件夹,将相关东西放在相关的文件夹里;这里抽屉,便是数据库,是个容器,而文件夹便是 表,是用来存储特定类型的数据;
名称:
表的名称在一个数据库中应该是唯一的;
模式:
关于数据库和表的布局及特性的信息。
比如:定义了数据在表中如何存储,存储什么样的数据,数据如何分解,各部信息如何命名等;
3.列(column)和数据类型
表由列组成。列存储表中某部分的信息。
将表想象成一个电子表格,网格中每一列存储着某种特定的信息。例如,在顾客表中,一列存储顾客编号,另一列存储顾客姓名,而地址、城市、州以及邮政编码全都存储在各自的列中。
数据类型
所允许的数据的类型。每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据
4.行(row)
表中的一个记录。
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。
5.主键
一列(或一组列),其值能够唯一标识表中每一行。
表中每一行都应该有一列(或几列)可以唯一标识自己。顾客表可以使用顾客编号,而订单表可以使用订单ID。雇员表可以使用雇员ID或雇员社会安全号。
主键满足的条件:
- 任意两行都不具有相同的主键值
- 每一行都必须有一个主键值(主键列不允许NULL值)
- 主键列中的值不允许修改或更新
- 主键值不能重用(如果某行从表中删除,它的主键值不能赋给以后的新行)
1.2 SQL-Structured Query Language
任务--提供一种从数据库中读写数据的简单有效的方法。
优点:
- SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL;
- SQL简单易学。它的语句全都是由有很强描述性的英语单词组成,而且这些单词的数目不多。
- SQL虽然看上去很简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
第2课 检索数据
2.1 SELECT语句
用途是从一个或多个表中检索信息。
检索一列
输入: SELECT prod_name FROM Products; 输出: prod_name ------------------- Fish bean bag toy Bird bean bag toy Rabbit bean bag toy 8 inch teddy bear 12 inch teddy bear 18 inch teddy bear Raggedy Ann King doll Queen doll
分析:上述语句利用SELECT语句从Products表中检索一个名为prod_name的列。所需的列名写在SELECT关键字之后,FROM关键字指出从哪个表中检索数据。
注意:检索出来的数据是未排序的,因为没有明确排序查询结果;
多条SQL语句用分号隔开;
在处理SQL语句时,其中的所有空格都会被忽略;包括回车符;SQL语句仅以分号结束
检索多列
输入: SELECT prod_id, prod_name, prod_price FROM Products; 输出: prod_id prod_name prod_price --------- -------------------- ---------- BNBG01 Fish bean bag toy 3.4900 BNBG02 Bird bean bag toy 3.4900 BNBG03 Rabbit bean bag toy 3.4900 BR01 8 inch teddy bear 5.9900 BR02 12 inch teddy bear 8.9900 BR03 18 inch teddy bear 11.9900 RGAN01 Raggedy Ann 4.9900 RYL01 King doll 9.4900 RYL02 Queen dool 9.4900
检索所有列
SELECT * FROM Products;
警告:使用通配符
一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符。虽然使用通配符能让你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
提示:检索未知列
使用通配符有一个大优点。由于不明确指定列名(因为星号检索每一列),所以能检索出名字未知的列。
2.2 检索不同的值
即只显示不同的值,相同的只显示一次;
关键字:DISTINCT
如:
输入: SELECT vend_id FROM Products; 输出: vend_id ---------- BRS01 BRS01 BRS01 DLL01 DLL01 DLL01 DLL01 FNG01 FNG01
而:
输入: SELECT DISTINCT vend_id FROM Products; 输出: +---------+ | vend_id | +---------+ | BRS01 | | DLL01 | | FNG01 | +---------+ 3 rows in set (0.00 sec)
分析:
SELECT DISTINCT vend_id告诉DBMS只返回不同(具有唯一性)的vend_id行,所以正如下面的输出,只有3行。如果使用DISTINCT关键字,它必须直接放在列名的前面。
注意:不能部分使用DISTINCT
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id, prod_price,除非指定的两列完全相同,否则所有的行都会被检索出来。
2.3 限制结果
SELECT语句返回指定表中所有匹配的行,很可能是每一行。如果你只想返回第一行或者一定数量的行,该怎么办呢?这是可行的,但是在各种DBMS中不一样
在MySQL、MariaDB、PostgreSQL或者SQLite,需要使用LIMIT 子句,像这样:
输入: SELECT prod_name FROM Products LIMIT 5; 输出: prod_name ----------------- 8 inch teddy bear 12 inch teddy bear 18 inch teddy bear Fish bean bag toy Bird bean bag toy
分析▼
上述代码使用SELECT语句来检索单独的一列数据。LIMIT 5指示MySQL等DBMS返回不超过5行的数据.
如果想得到后面5行的数据,像这样:
输入: SELECT prod_name FROM Products LIMIT 5 OFFSET 5; 输出: prod_name ------------------- Rabbit bean bag toy Raggedy Ann King doll Queen doll
分析▼
LIMIT 5 OFFSET 5指示MySQL等DBMS返回从第5行起的5行数据。第一个数字是指从哪儿开始,第二个数字是检索的行数。
所以,LIMIT指定返回的行数。带OFFSET的LIMIT指定从哪儿开始。
注意:第0行
第一个被检索的行是第0行,而不是第1行。因此,LIMIT 1 OFFSET 1会检索第2行,而不是第1行。
提示:MySQL和MariaDB快捷键
MySQL和MariaDB支持简化版的LIMIT 4 OFFSET 3语句,即LIMIT 3,4。使用这个语法,,之前的值对应LIMIT, ,之后的值对应OFFSET。
2.4 使用注释
SELECT prod_name -- 这是一条注释 FROM Products;
分析▼
注释使用-- (两个连字符)嵌在行内。-- 之后的文本就是注释,例如,这用来描述CREATE TABLE语句中的列就很不错。
多行注释 /* SELECT prod_name, vend_id FROM Products; */ SELECT prod_name FROM Products;
注释从/*开始,到*/结束,/*和*/之间的任何内容都是注释。这种方式常用于给代码加注释,就如这个例子演示的,这里定义了两个SELECT语句,但是第一个不会执行,因为它已经被注释掉了。