仅供自我学习使用
Order by子句应该是Select语句中最后一条子句。
可以查询A列,按照B列数据排序
按多个列排序:
按照列名字
select A from table_a order by b,c
这样会先按照b排序,再按照c排序
按照列位置
select A from table_a order by 2,3
使用的时候要注意列是否存在
指定排序方向
默认——升序ASC。
降序 DESC ,只对它前面这个列有作用 —— order by a DESC,b
如果要对每个列都降序排列,要对每个列加上DESC
过滤搜索
在表名之后给出。

并不是所有的DBMS都支持这些操作符。<> != !< !>
与字符串类型比较要用单引号 ‘A’
BETWEEN 包括指定的两个值
NULL 空值。和包含字段包含0、空字符串或仅仅包含空格不一样
用来检查具有NULL值的列。WHERE a IS NULL
PostgreSQL比较严格。 =3.49 应该更改为 = decimal ‘3.49’
高级数据过滤
OR
在第一个条件满足时,不再计算第二个条件
AND优先级高于OR——解决办法,直接用圆括号
Where a条件 or b条件 and c条件——满足 a条件,或者是,b和c条件的
IN
功能和or一样,但是比or简洁、效率更高,in里面可以包含select子句动态建立where子句
NOT
where NOT A = 1 等同于 where A <> 1
但是MySQL中只支持NOT EXISTS
通配符进行过滤
谓词
LIKE是谓词而不是操作符
通配符搜索只能用于文本字段(串)
%
Microsoft Access使用*而不是%
搜索是可以区分大小写的
要注意匹配后面的空格 比如 F%y% 有些列设置了字符串长度,比如 “fish “这个字符串
_
只匹配单个字符
Microsoft Access使用?而不是_
[]
指定一个字符集,必须匹配指定位置(通配符的位置)的一个字符
Microsoft Access、Microsoft SQL Server和Sybase Adaptive Server支持集合。
where A LIKE ‘[JM]%’ 匹配任何以方括号中JM开头的联系人名 即 J开头或者 M开头的
^
不以J或M开头 WHERE A LIKE ‘[^JM]%’
Microsoft Access中用! WHERE A LIKE ‘[!JM]%’ 等同于 WHERE A NOT LIKE ‘[JM]%’
注意事项
不要过分使用通配符,尽量不要放在开始处
七 创建计算字段
计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的。
拼接字段
用+还是||
Access、SQL Server和Sybase使用+
DB2、Oracle、PostgreSQL和Sybase使用||
MySQL中的拼接使用CONCAT()函数
RTRIM()函数——去掉串的右边空格,返回格式化的数据
LTRIM()函数——去掉串的左边空格,返回格式化的数据
TRIM()函数——去掉左右两边的空格
八 使用数据处理函数
文本处理函数
SOUNDEX——将任何文本串转换为描述其语音表示的字母数字模式的算法。发音比较,not字母比较
日期和时间处理函数
DATEPART()——返回日期的一部分
DATE_PART
提取年份:
Access中:返回年 DATEPART('yyyy',order_date)=2004
MySQL中:YEAR(order_date)=2004
Oracle中:to_number(to_char(order_date,'YY'))=2004
to_char()——用来提取日期的成分,to_number()——将提取出的成分转换为数值,以便与2004比较
BETWEEN where order_date between to_date('011-JAN-2004') and to_date('31-DEC-2004')
数值处理函数
第9章 汇总数据
AVG()函数忽略列值为NULL的行
COUNT(*)——计数时,不管列中包含的是NULL还是非NULL。筛选出5行
COUNT(column))——忽略NULL。它可能只有3行非空
MAC()——找出最大的数值或者日期值
用于文本数据时,如果数据按照相应地列排序,则MAX()返回最后一行
忽略NULL的行
SUM()——忽略NULL的行
DISTINCT 平均值只考虑各个不同的价格
Select avg(DISTINCT price) AS avg_price
FROM products
WHERE id = '01';
第10张分组数据
数据分组
GROUP BY子句中列出的每个列,都必须是检索列 或 有效的表达式(不能是聚集函数)
在SELECT中使用表达式,必须在GROUP BY子句中指定相同的表达式,不能使用别名
大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如 文本或备注型字段)。
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY 子句中给出。
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列 中有多行NULL值,它们将分为一组。
必须 where ... group by....order by...
group by 2,1——先按照2分组,再按照1分组
过滤分组
where过滤行
having过滤分组 having仅在与Group by子句结合时,才使用。
having支持所有where操作符
select vend_id from products
where price >= 4
having count(*)>=2
第11章 使用子查询
第12章 连结表
第13章
自然联结P94还没看。
第14章 组合查询
Union
可以把2条sql语句的结果,拼接起来。
注意:
2条或者以上的SELECT语句
每个查询必须包含相同的列、表达式活聚集函数(各个列不需要以相同次序列出)
列数据类型必须兼容:类型不必完全相同、但必须是DBMS可以隐含转换的类型,如:不同的数值类型/不同的日期类型
包含或取消重复的行
重复的行会被自动取消。这是UNION的默认行为。
不想重复,用UNION ALL
对组合查询结果排序
只能使用一条ORDER BY子句,必须出现在最后一条SELECT语句之后。 只能用同一种方式排序结果集。
DBMS会把所有的结果按照这个order by的规则来排序。
其他类型的UNION
EXCEPT(有时称为MINUS):只在第一个表中存在,不存在第二个表中的行。
INTERSECT可用来检索2个表中都存在的行
第15章 插入数据
INSERT INTO user VALUES('A','B')
INSERT INTO user (A,B,C) VALUES('a','b','c')
可在INSERT操作中省略某些列的条件:
- 该列定义为允许NULL值(无值或空值);
- 在表定义中给出默认值
插入检索出的数据——INSERT SELECT,可以插入多行
INSERT INTO user(A,B,C) SELECT A,B,C FROM driver
driver中的列名不需要和user的列名一致,只是会按照顺序,把值插入进去。
从一个表复制到另一个表——SELECT INTO
DB2不支持
INSERT SELECT:导出数据
SELECT INTO:导入表
ORACLE
SELECT * INTO user FROM driver
如果只想复制列A
SELECT * INTO A FROM driver
MySQL
CREATE TABLE user AS SELECT * FROM driver
注意事项
- 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY
- 可利用联结从多个表插入数据
- 不管从多少个表中检索数据,数据都只能插入到单个表中
第16章 更新和删除数据
UPDATE user SET A = 'a' WHERE id = '0001';
where子句告诉DBMS更新哪一行,没有这句的话,就会把表中所有A列的值更改为a
更新多个列
UPDATE user SET A = 'a' B = 'b' WHERE id = '0001';
在update语句中使用子查询:
FROM关键字 用来自表A的数据更新B表的行。有些DBMS支持
删除某个列的值,设置它为NULL(前提:运行NULL值)
UPDATE user SET A=NULL WHERE id = '0001';
删除数据——DELETE
DELETE FROM user WHERE id = '0001';
FROM可选。但是最好保留,保证可移植性。
delete删除内容,不删除表
更快的删除 删除所有行,用TRUNCATE TABLE语句,完成相同工作,更迅速(因为不记录数据的变动)
使用原则
- 使用UPDATE和DELETE语句,要带WHERE子句,除非要更新和删除每一行
- 保证每个表都有主键
- 在进行UPDATE/DELETE语句使用WHERE子句前,应该使用SELECT进行测试,保证记录是正确的
- 使用强制实施引用完整性的数据库,这样DBMS将不允许删除具有与其他表相关联的数据的行
- 有的DBMS运行DBM施加约束,以防止执行不带WHERE子句的UPDATE/DELETE。如果采用的DBMS支持这个特性,应该使用它。
第17章 创建和操纵表
Oracle、PostgreSQL、SQL Server、Sybase中:
CREATE TABLE 表名 (类名 类型 NOT NULL, id CHAR(10) NOT NULL );
MySQL:varchar——text
默认NULL。
替换现有的表
先删除该表,再重建它。不能覆盖它。
指定默认值
获得系统日期
更新表——ALTER TABLE
一般的DBMS都不太支持修改表,在设计的时候就应该设计好。
有值的列更改更是有限制,对无数据的列几乎没有限制
ALTER TABLE 表名 ADD 列名 类型
删除表——DROP TABLE
删除整个表,而不是表内容。删除表没有撤销也没有确认。
重命名表——Rename
每个DBMS的要求不一样