数据库基础
模式schema,关于数据库和表的布局及特性的信息
主键 primary key一列或一组列,其值能唯一标识表中每一行。应该总是定义主键。
主键条件:
1.任意两行都不具有相同的主键值。
2.每一行都必须具有一个主键值(主键列不允许NULL值)。
3.主键列中的值不允许修改或更新。
4.主键值不能重用,如果某行从表中删除,它的主键不能赋给以后的行。
多条SQL语句用分号;分隔,不区分大小写,使用空格都会被忽略。
数据类型及其名称是SQL数据库不兼容的一个主要原因
SQL注释: --这是一条注释
#这是一条注释
/*这是一条注释*/
检索数据 – Select
检索单个列:
SELECT列名 FROM表名
注:返回数据没有特定顺序
检索多个列:
SELECT列名1,列名2,… FROM表名
检索所有列:
SELECT * FROM表名
检索不同的值:
SELECT DISTINCT列名 FROM表名
注:DISTINCT只返回不同的值(过滤掉重复的),必须放在列名前面,且作用于后边所有的列。
限制返回的行数 (数据库不同语法不同)
SQL Server:SELECT TOP 5列名 FROM表名
PostgreSQL:SELECT列名FROM表名 LIMIT 5
排序检索数据
关系型数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义
按单个列排序:
SELECT列名 FROM表名 ORDER BY列名
注:指定一条ORDER BY子句时候,应该保证它是SELECT语句的最后一条子句。
否则会出现错误信息。
按多个列排序:
SELECT列名1,列名2, 列名3 FROM 表名ORDER BY列名1,列名2
注释:先按照列名1排序,如果列名1相同再按列名2排序。
按照位置排序:
SELECT列名1,列名2, 列名3 FROM 表名ORDER BY 2,3
注释:按照SELECT清单里面的第2列(列名2)和第3列(列名3)排序。最好不要这么用,因为不明确给出列名可能造成用错列,再就是如果对SELECT清单做修改后容易忘记修改响应的列号。
升降序排序:ASC DESC
升序ASC不需要指定,因为是默认
DESC/ASC应用于直接位于其前面的列名,而不是所有列。如果想在多个列上进行降序排序,必须对每一个列指定DESC关键字。
SELECT列名1,列名2,列名3 FROM表名 ORDER BY 列名1 DESC,列名2 DESC
注:A和a相同么?a位于B之前还是Z之后?答案取决于数据的设置方式。
过滤数据
WHERE子句
SELECT列名1,列名2 FROM表名 WHERE 列名=值
尽量在数据库端过滤数据。而让客户端应用(或开发语言)处理数据将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。此外,如果在客户端过滤数据,服务器不得不通过网络发送多余的数据,导致网络带宽的浪费。
WHERE操作符
= (等于)
<> (不等于)
!=(不等于)
< (小于)
<= (小于等于)
!< (不小于)
> (大于)
>= (大于等于)
!> (不大于)
BETWEEN (在指定的两个值之间)
IS NULL (为NULL)
注:并非所有的数据库都支持这些操作符,参见相关文档。
BETWEEN AND例子
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 and 10
IS NULL例子
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL
高级数据过滤
WHERE + AND指定同时满足多个条件
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = ‘DLL01’AND prod_price <= 4
WHERE + OR指定匹配任何一个条件即可
SELECT prod_name, prod_price
FROM Products
WHERE vend_id =‘DLL01’OR vend_id = ‘BRS01’;
注:AND的优先级大于OR
可以使用圆括号对多个操作符进行明确分组
SELECT prod_name, prod_price
FROM Products
WHERE(vend_id =‘DLL01’OR vend_id = ‘BRS01’)AND prod_price >= 10
WHERE + IN
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔,括在圆括号中的合法值。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN (‘DLL01’,’BRS01’)
ORDER BY prod_name;
注:WHERE+IN与WHERE+OR功能相同,但执行更快。
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后边所跟的任何条件。一般可用不等(<>,!=)来代替
SELECT prod_name
FROM Products
WHERE NOT vend_id = ‘DLL01’
ORDER BY prod_name;
等于
SELECT prod_name
FROM Products
WHERE vend_id <> ‘DLL01’
ORDER BY prod_name;
通配符过滤
使用通配符搜索,必须使用LIKE操作符。且通配符搜索只能用于文本字段(字符串),而不能用于非文本类型。
%通配符
表示任何字符出现任意次数
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘Fish%’
表示以Fish开头的任意字符串。
注:%通配符能匹配0个字符,但不能匹配NULL
通配符可以在任意位置使用,且可以使用多个通配符。
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE ‘