查询
- 慎用“*”检索所有列:
一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符。虽然使用通配符能让你自己省事,不用明确列出所需列,但检索不需 要的列通常会降低检索和应用程序的性能。
使用通配符有一个大优点。由于不明确指定列名(因为星号检索每一列),所以能检索出名字未知的列。
2. 关于Distinct
不能部分使用DISTINCT
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,你指定SELECT DISTINCT vend_id, prod_price,除非指定的两列完 全相同,否则所有的行都会被检索出来。
- 限定行数
SQL Server和Access中使用SELECT时,可以使用TOP关键字来限制最多返回多少行
Oracle:SELECT prod_name FROM Products WHERE ROWNUM <=5;
MySQL、MariaDB、PostgreSQL或者SQLite:SELECT prod_name FROM Products LIMIT 5;
- 通配符
在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的
5 xxtrim()去除空格
支持RTRIM()(正如刚才所见,它去掉字符串右边的空格)、LTRIM()(去掉字符串左边的空格)以及TRIM()(去掉字符串左 右两边的空格)。
聚合函数
1.count
使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。 使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
子查询
- 子查询返回单列
作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。
- 用于统计数量字段的子查询
SELECT cust_name, cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers ORDER BY cust_name;
该子查询对检索出的每个顾客执行一次
组合查询
- union使用规则
- UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合四条SELECT语句,将要使用三个UNION关 键字)。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
- 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。
- 排序:在用UNION组合查询时,只能使用一条ORDER BY子句,它必须位于最后一条SELECT语句之后
union会自动取消重复的行 union all则不会取消重复行。
删除
- 删除所有行
如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。
update和delete原则
- 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
- 保证每个表都有主键(如果忘记这个内容,请参阅第12课),尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
- 在UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
- 使用强制实施引用完整性的数据库(关于这个内容,请参阅第12课),这样DBMS将不允许删除其数据与其他表相关联的行。 5. 有的DBMS允许数据库管理员施加约束,防止执行不带WHERE子句的UPDATE或DELETE语句。如果所采用的DBMS支持这个特性,应该使用 它。
事务
- 事务用来管理INSERT、UPDATE和DELETE语句。不能回退SELECT语句(回退SELECT语句也没有必要),也不能回退CREATE或DROP操作。
- mysql和oracle事务区别
- oracle中事务从上一个commit或rollback开始;
- MySQL中事务的开始必须要有START TRANSACTION;这才标志着一个事物的开始,否则使用rollback是无法回滚数据的。
即Oracle事务不需要显示说明开启事务的,针对dml语句,当你设置保存点,接下来的步骤如上返回到保准点同样的用commit提交事务。
游标
- 游标:(cursor)是一个存储在DBMS服务器上的数据库查询,
它不是一条SELECT语句,而是被该语句检索出来的结果集。 - 作用:可以在检索出来的行中前进或后退一行或多行。
索引、分页、主键
1、主键,Oracle不可以实现自增,mysql可以实现自增。
oracle新建序列,SEQ_USER_Id.nextval
2、索引:
mysql索引从0开始,Oracle从1开始。
3、分页,
mysql: select * from user order by desc limit n ,m.
表示,从第n条数据开始查找,一共查找m条数据。
Oracle:select * from user
select rownum a * from ((select * from user)a)
select * from (select rownum a.* from (select * from user) a )
where r between n , m .
表示,n表示从第n条数据查询,查找到m条数据