1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema.
DDL是SQL语言的四大功能之一。
用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束
DDL不需要commit.
CREATE
ALTER
DROP
TRUNCATE
COMMENT
RENAME
2.DML(Data Manipulation Language)数据操纵语言statements are used for managing data within schema objects.
DML分成交互型DML和嵌入型DML两类。
依据语言的级别,DML又可分成过程性DML和非过程性DML两种。
需要commit.
SELECT
INSERT
UPDATE
DELETE
MERGE
CALL
EXPLAIN PLAN
LOCK TABLE
3.DCL(Data Control Language)数据库控制语言 授权,角色控制等
GRANT 授权
REVOKE 取消授权
4.TCL(Transaction Control Language)事务控制语言
SAVEPOINT 设置保存点
ROLLBACK 回滚
SET TRANSACTION
(1)数据定义。(SQL DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消操作。
(2)数据操纵。(SQL DML)数据操纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种操作。
(3)数据控制。包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
(4)嵌入式SQL的使用规定。涉及到SQL语句嵌入在宿主语言程序中使用的规则。
5、truncate、delete和drop 的区别
1、表数据和表结构
truncate、delete都会删除表中的数据,不删除表的结构(定义),drop不仅会删除表数据也会删除表结构。
2、是否加入事务
1.drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。
delete是DML语句,不会自动提交。
2. delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
6、常用的语句
1、distinct 关键字的使用
使用规则:
a. 关键字distinct 指示sql只返回不同的值,必须放在列名的前面。(去重操作)
b. Distinct关键字应用于所有列而不仅仅是前置她的列
select distinct vend_id from products;// 返回vend_id 不同的行。将vend_id相同的行只留下一条记录
2、使用order by 和 limit 的组合,能够找出一个列中最高或者最低的值。
select prod_price from products order by prod_price desc limit 1;
// prod_price desc 对价格进行降序排列,然后取第一个,获得最大值
order by 子句位置
多条件组合语句,顺序不能出现错误,不然将产生错误。
order by 位于from 子句之后,limit 位于order by 子句之后。
3、NOT操作符
NOT操作符有且只有一个功能,就是否定它之后所跟的任何条件。
select prod_name,prod_price from products where vend_id NOT IN (1002,1003) ORDER BY prod_name;
//检索 供应商不为1002和 1003制作的所有产品。
4、通配符和like 操作符
select prod_id ,prod_name from products where prod_name LIKE binary ‘%jet%’;
//检索 prod_name 符合搜索模式 ‘jet%’,的所有行。以jet开头的词。区分大小写
注意:使用通配符的技巧
MySQL的通配符很有用,但是这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所化的时间更长。
1. 不要过度使用通配符。如果其他操作符能够达到相同的目的,应该使用其他操作符。
2. 在确实需要使用通配符时,除非绝对,有必要,否则不要把他们用在搜索模式的开始处,把通配符置于搜索模式的开始处,搜索起来是最慢的。
5、时间处理函数
我们指示MySQL仅将给出的日期与列中的日期部分进行比较,而不是将给出的日期与整个列值进行比较
select cust_id,order_num from orders where Date(order_date)= ‘2005-09-01’
注意:
如果要的仅仅是日期,请使用Date()函数,即使你知道相对应的列只包含日期也应该如此。这样的话,即使以后由于某种原由使用了时间值,你的sql代码也不用改变。当然也是存在Time()函数,在你只想要时间时就要使用它
检索日期范围
思考:在某些情况,我们如果想要检索2005年9月份的所有订单。简单的相等测试就不行了。
解决:两种方式。
一、select cust_id , order_num,order_date from orders where Date(order_date) between ‘2005-09-01’ AND ‘2005-09-30’;
二、select cust_id , order_num,order_date from orders where Year(order_date) =2005 and Month(order_date) = 9;
注意:一般情况下,我们都是利用第二种进行,因为第二种方式,不需要考虑每个月有多少天,或不需要考虑闰年2月的方法。
日期常用函数
参考链接:https://blog.csdn.net/sinat_28978689/article/details/54849538