ALTER TABLE table_name
ADD column_name datatype
如需在表中添加列,请使用下列语法:
Like正则匹配数据至少是文本,数字,时间 已测试
插入时间类型变量,要加''
为了测试数据库怎么存储时间类型
通过这看出先是月日年time
这样再用like就有规律了
---------------------------------------------------------------------------------------
区别’’
select distinct 列名 from 表名 会过滤列中重复的值,比如列中两个1,结果只会显示一个
select 列名 from 表名 where 列名 in (value1,...) 查询一定范围
同理not in
select 列名 from 表名 where 列名 between A and B A(B)可以是数字,文字,日期
但是注意不同数据库对边界处理不一样,即范围前后开闭不一致
同理not between
where 列名 like 'A' A中一般用%来匹配 比如匹配首字母为a 'a%' %代表任意字符串,具体参考正则匹配
同理not like
用于检查结果中是否至少有一行数据,返回值为布尔值
例子
具体看这里
http://www.cnblogs.com/xuanhai/p/5810918.html
根据列值排序,默认升序,降序可以用desc定义
Order by后可以加多个列名,排序优先级依次降低
内置函数count,max,min,sum
语句用于结合合计函数,根据一个或多个列对结果集进行分组。
内连接 相当于等值连接
Left join 左连接 SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
同理可以理解right join
主要补充where中不能用sum的问题
内部查询未引用外部查询的表->整个查询的过程为子查询只执行一次,然后交给外部查询
内部查询引用外部查询的表->子查询的执行的次数依赖于外部查询,外部查询每执行一行,子查询执行一次
可以这么理解:无关子查询查询一次后原来的语句就变成1个静态的sql语句了
而相关子查询中有一个值需要在外查询表的列号定了才能确定,所以每次外表换行子查询都要重新生成(查询)
例子
1 select * from play where id in (select id from g)
2 select * from play where id in (select id from g where g.id<id)
上述的例子1中子查询一次后sql就不变了,只要一行一行比较就好
2中每到一行语句都要重新生成,比如在第一行,id in ()空的因为两个id都是1
下一行以及后边 id in(1)虽说结果一样,但每次还是要重新生成。效率低
视图 相当于集成了一句sql语句,查询语句
create view a
as
select id from g
select * from a
主要用处:分离出数据,每次用户只能操作视图隔离出的数据,消除了一定耦合性
将表中经常用于查询的列单独拿出来,按一定规律存储。加快查询速度,但是当表中数据变化要手动维护。慎重,主要用于数据量比较大
这里看一下表PLAY.手动建了一个非聚集索引,发现系统会自动为主键建立一个聚集索引。我们可以删掉。注意每个表只能有一个聚集索引
聚集索引与非聚集区别
表记录的排列顺序和与索引的排列顺序是否一致,聚集不一定一样,非聚集一定一样
索引手动维护有这三种
1 重建索引 将选项drop_existing设置为on
正常情况下删除或重建一个聚集索引会重建两次非聚集索引,如果数据量比较大,简直就是灾难。但是通过上面设置,只需一次。
2 修改索引 alter index
3 索引重组
重新填充索引中的数据
参考:https://www.cnblogs.com/zhijianliutang/p/4224932.html
全局变量@@ 用户自定义变量@
语句:declare 变量名 类型
例子:declare @a int
If…else
While
Case
Begin…end
getdate() 当前系统日期、时间
dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
datediff 返回跨两个指定日期的日期和时间边界数
datepart 返回代表指定日期的指定日期部分的整数
详细参考:https://www.cnblogs.com/zhangpengnike/p/6122588.html
自定义函数
类似指针。临时的,每次用都要重建
下边例子中没有输出,因为我的name列中有null。所以还是有问题的
正常是这样的
从这里我们可以看出一些细节
1 游标刚创建是指向空,或者说是表头,fetch next后才指向第一条数据
2 当游标指向数据时全局变量fetchstatus为0,没有时为-1
3 每次用完要先关闭游标,再手动释放
瞬间不想用普通游标了,简直就是拖拉机与奔驰的区别
但是也要注意滚动游标主要以行数为主,可别跳来跳去迷糊了
触发器中的临时表:
Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
DML触发器可以根据触发条件分为insert,update,delete
1,当数据库中发生数据操作语言(DML)事件时将调用DML触发器.DML事件包括在指定表或视图中修改数据的INSERT语句,UPDATE语句或DELETE语句.DML触发器可以查询其他表,还可以包含复杂的Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
关于DML触发器应用最为广泛这里不再赘述.MSDN官方说明:HTTP://msdn.microsoft.com/zh-cn/library/ms189799.aspx
2,当服务器或数据库中发生数据定义语言(DDL)事件时将调用DDL触发器.DDL触发器是一种特殊的触发器,它在响应数据定义语言(DDL)语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。
3,登录触发器(http://msdn.microsoft.com/zh-cn/library/bb326598.aspx)将为响应LOGON事件而激发存储过程。与SQL Server实例建立用户会话时将引发此事件。
如果你有这样的需求:在某个特定的时间只允许某个账号登录服务器(如单位和家里使用不同的账号远程登录服务器),那么登录触发器是一个不错的选择。
链接:https://www.imooc.com/article/69770
这个关于DML触发器的也蛮好
https://www.cnblogs.com/douzujun/p/6819231.html
详细看:https://www.cnblogs.com/selene/p/4483612.html
Grant 授予用户一定权限
Grant 权限 on 对象(可以是数据库,表,触发器,存储过程,视图,索引)
To 用户名
还有一些其他参数,比如grank option 指定是否可以将此权限授予他人
另外权限可以细化,比如 grank update(id) on play to A,将play
表的更新id列的权限给A
Revoke
撤销权限
格式跟grank差不多
有两个参数要注意
Cascade 制定当前正在撤销的权限也将从其它从这里授权的主体中撤销。当然此参数在用时要与grant option for (撤销制定权限)一起
Deny 禁止权限
格式与grant一样
这个蛮有意思,我插入三条记录,成功后再回滚到插完第一条记录后的保存点,结果表中id出现两个空白11,12没有,可以看出所谓回滚对于成功执行的只是再执行一个语句让它看上去像没执行,比如这个可能就是执行了一个删除语句
事务分类:自动提交事务,显式事务,隐式事务
自动提交事务是默认模式,每一条sql语句作为一个事务
显式事务:开始于begin tran止于commit tran或者rollback tran
隐式事务 只有结束标志 rollback或commit tran。事务结束默认下一个事务开始
主要是解决并发时出现的脏读幻读等
排他锁:X锁,写锁, 可以请吃饭,牵手; 等分手;
共享锁:S锁,读锁,只能请吃饭,不能牵手; 可以请吃饭;
(2)insert
insert into 表 values(值,.....)
(3)update
update 表 set 属性=值 where条件
(4)delete
delete from 表 where条件