数据库基础
- 数据库:保存有组织的数据的容器
- 表:某种特定类型数据的结构化清单
- 模式:关于数据库和表的布局和特征的信息
- 行:表中的一个记录
- 列:表中的一个字段,所有表都是由一个或多个列组成的。
- 主键:一列(或一组列),其值能够唯一标识表中每一行。
- SQL:结构化查询语言,专门与数据库沟通、标准SQL由ANSI标准委员会管理,从而称为ANSISQ。
检索数据
SELECT 语句
检索单个列
SELECT column_name FROM table_name;
检索多个列
多个列之间用逗号隔开,最后一个列不加:
SELECT col1,col2,col3 FROM table_name;
检索所有列
使用通配符 * :SELECT * FROM table_name;
检索不同值
使用DISTINCT关键字,放在列名的前面:
SELECT DISTINCT column_name FROM table_name;
限制检索
使用LIMIT和OFFSET关键字:
限制结果不超过5行:SELECT col_name FROM table_name LIMIT 5;
第五行起的5行:SELECT c_name FROM t_name LIMIT 5 OFFSET 5;
注释
--行注释
/* */多行注释
使用ORDER BY排序检索数据
在指定一条ORDER BY子句时,应该保证它是SELECT语句中最后一条子句。
排序单列数据
SELECT col_name FROM tab_name ORDER BY col_name;
多列排序
多列之间用逗号隔开:
SELECT col1,col2,col3 FROM table_name ORDER BY col1,col2;
降序排序
默认排序是升序方式,可以使用DESC关键字对列进行降序排序:
SELECT col1,col2 FROM table_name ORDER BY col1 DESC;
过滤数据
使用WHERE过滤数据
在SELECT语句中,根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出:
SELECT col1 FROM tab_name WHERE col=xxx;
WHERE字句操作符
where.png高级过滤查询
组合WHERE字句
AND操作符:可以增加多个过滤条件,每个条件间都要使用AND关键字
OR操作符:用来表示检索匹配任一给定条件的行
具有AND和OR操作符的WHERE子句,应该用圆括号明确地分组操作符
IN操作符:指定条件范围,每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。功能与OR相当
用通配符过滤
LIKE操作符
%通配符
%表示任何字符出现任意次数:WHERE prod_name LIKE 'Fish%'表示,将检索任意以Fish起头的词。%告诉DBMS接受Fish之后的任意字符,不管它有多少。
搜索模式'%bean bag%'表示匹配任何位置上包含文本bean bag的值,不论它之前或之后出现什么字符。
_通配符
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符
配符搜索一般比前面讨论的其他搜索要耗费更长的处理时间。这里给出一些使用通配符时要记住的技巧。
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
创建计算字段
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的
拼接字段:||
去掉空格: TRIM,LTRIM,RTRIM
起别名: AS
函数使用
常用函数
汇总数据
聚集函数
聚集函数.png分组数据
创建分组:分组是使用SELECT语句的GROUP BY子句建立的
过滤分组:HAVING,WHERE过滤行,而HAVING过滤分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤
SELECT子句顺序
使用子查询
嵌套where:WHERE子句中使用子查询能够编写出功能很强且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询
联结表
创建联结
指定要联结的所有表以及关联它们的方式即可
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
内联结
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;
以上两个表之间的关系是以INNER JOIN指定的部分FROM子句。在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句给出。传递给ON的实际条件与传递给WHERE的相同。
SQL不限制一条SELECT语句中可以联结的表的数目。创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。
高级联结
表起别名:FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id
自然联结:自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符(SELECT *),而对其他表的列使用明确的子集来完成。
外联结:使用OUTER JOIN语法时,使用LEFT OUTER JOIN从FROM子句左边的表中选择所有行。为了从右边的表中选择所有行,需要使用RIGHT OUTER JOIN。
组合查询
UNION:可用UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成一个结果集,如下所示:
SELECT cust_name, cust_contact, cust_email
FROM Customers WHERE cust_state IN ('IL','IN','MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers WHERE cust_name = 'Fun4All';
插入数据
INSERT INTO Customers(cust_id, cust_name,
cust_address, cust_city,
cust_state, cust_zip,
cust_country, cust_contact, cust_email)
VALUES('1000000006', 'Toy Land',
'123 Any Street', 'New York',
'NY', '11111', 'USA',
NULL, NULL);
更新和删除数据
更新
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = 'sam@toyland.com'
WHERE cust_id = '1000000006';
删除
DELETE FROM Customers
WHERE cust_id = '1000000006';
创建和操纵表
创建表:
CREATE TABLE OrderItems ( order_num INTEGER NOT NULL,
order_item INTEGER NOT NULL,
prod_id CHAR(10) NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1, item_price DECIMAL(8,2) NOT NULL
);
更新表:
ALTER TABLE Vendors
DROP/ADD COLUMN vend_phone;
删除表:
DROP TABLE CustCopy;
重命名表:使用RENAME语句
未完待续...
网友评论