基本概念
- 数据库:保存有组织的数据的容器(通常是一个或一组文件)。
- 表:存储特定类型的数据。完整表名是数据库名+表名。
- 列:一个表中有多个列,每个列存储一种特定信息。每个列都有数据类型限制
- 行:表中的一个记录
- 主键:表中每一行都应该有一列或几列能唯一标识自己,如id。主键需要满足:
- 任意两行不具有相同主键值
- 每行都必须有主键值(不为null)
- 主键列值不能修改
- 主键值不能重用(某行被删除,其主键不能赋给以后的新行)
- 使用多列做主键时要保证他们列值的组合唯一
- SQL(Structured Query Language):是一种专门用来与数据库沟通的语言。SQL语句不区分大小写,但为了便于阅读,通常对SQL关键字使用大写。语句中所有的空格都被忽略,因此换行与否不影响语句作用,但分成多行利于阅读和调试。
- MySQL是一种DBMS(数据库软件)。DBMS分为基于共享文件系统的DBMS和基于客户机-服务器的DBMS。MySQL是基于客户机-服务器的数据库。
- MySQL Administrator(MySQL管理器)是一个图形交互客户机,用来简化MySQL服务器的管理。
- MySQL Query Browser 是一个图形交互客户机,用来编写和执行MySQL命令。
在一个表中检索数据
- 检索单个列
SELECT prod_name(列名)
FROM Products(表名);
- 检索多个列
SELECT prod_id,prod_name,prod_price
From Products;
- 检索所有列
SELECT *
FROM Products;
SQL返回的顺序通常是列在表中定义的物理顺序,但并不总是这样,因此数据返回给应用程序后通常需要格式化,再表示出来。
- 只检索不同的值
SELECT DISTINCT vend_id
FROM Products;
注意:DISTINCT作用于所有的列,并非只是后面一个,如:
SELECT DISTINCT vend_id,prod_price
作用于两个列
FROM Products;
- 返回不超过五行的数据(MySQL中)
SELECT prod_name
FROM Products
LIMIT 5;
- 返回从第五行起的不超过五行数据
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
注意:行数是从第零行开始的
- 注释:行注释
--
或#
;段落注释/* */
对检索后的结果排序
- 对输出某列以字母顺序进行排序
SELECT prod_name
FROM Products
ORDER BY prod_name;
注意:1. ORDER BY应为SELECT语句最后一条子句
2. 用非检索列排序数据也是完全合法的
- 按多个列排序
SELECT prod_name
FROM Products
ORDER BY prod_price, prod_name; --相同价格按名字排
- 按列位置排序
SELECT prod_id, prod_name, prod_price
FROM Products
ORDER BY 2, 3; --先按第二列name排序再按第三列price排序
- 按降序排序,关键字DESC
SELECT prod_name
FROM Products
ORDER BY prod_price DESC;
DESC关键字只对应其前面的列名,想在多个列上进行降序排序,必须对每一列都指定DESC关键字。不指定时默认是升序ASC
过滤数据
使用WHERE子句
- 检查单个值
SELECT prod_name, prod_price
FROM Products
WHERE prod_price=3.49; --筛选出价格为3.49的产品
WHERE子句操作符
操作符 | 说明 | 操作符 | 说明 |
---|---|---|---|
<> | 不等于 | != | 不等于 |
!< | 不小于 | !> | 不大于 |
- 不匹配检查
|BETWEEN
|在指定的两个值之间|IS NULL
|为NULL值|
SELECT vend_id, prod_name,
FROM Products
WHERE vend_id!='DLL01'; --筛选出不是DLL01的产品
字符串的比较需要引号,数值比较不需要引号
- 范围值检查
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10; --筛选出价格在5和10之间的产品,包括开始和结束值
- 空值检查
SELECT prod_name, prod_price
FROM Products
WHERE prod_price IS NULL; --筛选出所有没有价格的产品
高级数据过滤
- 多个过滤条件,都使用AND连接
SELECT prod_id, prod_name, prod_price
FROM Products
WHERE vend_id!='DLL01' AND prod_price<=4;
- 表示“或”,用OR
- 在AND和OR的组合中,优先处理AND操作符。假如要列出价格为10美元及以上,且由DLL01或BRS01制造的所有产品:
SELECT prod_id, prod_name, prod_price
FROM Products
WHERE (vend_id!='DLL01' OR vend_id='BRS01') AND prod_price>=10;
- IN指定条件范围
SELECT prod_name, prod_price
FROM Products
WHERE vend_id! IN('DLL01', 'BRS01'); --由DLL01或BRS01制造的所有产品
IN在这里与OR执行了相同功能。优点如下:
- 语法更清楚直观
- 与AND、OR组合时更方便
- IN一般比OR执行得更快
- 最大优点:可以包含其他SELECT语句,能动态地建立WHERE子句
- NOT用于否定其后条件
SELECT prod_name, prod_price
FROM Products
WHERE NOT vend_id!='DLL01'; --除了DLL01制造的所有产品
用通配符进行过滤
- 通配符:用于匹配值的一部分,只能用于文本字段(字符串)。使用LIKE操作符指示DBMS后面的搜索模式使用通配符匹配。
- 百分号%通配符:任意字符出现任意次数(不匹配NULL)
SELECT prod_name, prod_price
FROM Products
WHERE prod_name LIKE 'Fish%'; --所有名称以Fish开头的产品
许多DBMS用空格填补字段的内容,造成’F%y’搜索不到以F开头y结尾的字段,解决方法:‘F%y%’
- 下划线_通配符:匹配任意一个字符
- 方括号[ ]通配符:指定字符集,匹配单个字符
SELECT cust_conduct
FROM Customers
WHERE cust_conduct LIKE '[JM]%'; --以J或M起头
否定:
WHERE cust_conduct LIKE '[^JM]%;'
不要过度使用通配符,如果其他操作能达到相同的目的,应使用其他操作符。使用时不要置于搜索模式的开始处(此时是最慢的)。