1.数据库中字符的长度
charindex(‘A’,ename) 用来判断字符在ename中的位置,如果能找到对应的字符串,返回该字符串位置,否则返回0
eg: ename=ABC的情况下 返回1
len(ename) 返回文本字段中的长度
2.SQL注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。
会导致sql注入的字符:单引号’
防止SQL注入,需要注意以下几个要点:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双”-“进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
3.SQL语句建存储过程
Procedure 存储过程
- 存储过程(procedure)类似于C语言中的函数
- 用来执行管理任务或应用复杂的业务规则
- 存储过程可以带参数,也可以返回结果
- 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等
having 子句让我们筛选分组后的各组数据(通常与grouby一起使用);
增加having的原因就是因为where无法和聚合函数一起使用
Groupby的作用是限定分组条件,而having是对groupby 中分出来的组进行条件筛选
聚合函数Aggregate function 聚合函数对一组值执行计算并返回单一的值除了 COUNT 以外,聚合函数忽略空值。
- 聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。
- 所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。
- 标量函数:只能对单个的数字或值进行计算。主要包括字符函数、日期/时间函数、数值函数和转换函数这四类。
常见的聚合函数:
1.求个数/记录/项目数等 count()
2.求某一列的平均数: avg()
若某行的score值为null时,计算平均值时会忽略带有null值得那一行。
如果想要把null当做0,那么可以使用IsNull函数把null转换成0,语法如下:
avg(IsNull(score,0)) as ’Average Score‘
3、求总和,总分等:sum() —必须为数字列
4、求最大值,最高分,最高工资等:max()
where 关键字无法与聚合函数一起使用
5.注意返回多个查询之时不能使用=,要用in
6.注意insert into 和Select into 的区别
insert into 用于向表格中插入新的行
select into 从一个表中选取数据,然后把数据插入另一个表中
INSERT INTO table_name VALUES (值1, 值2,….)
指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….)
把所有的列插入新表
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
7.修改字段名称
Change 用来修改字段名字以及类型
modify 用来修改字段类型
alter column set 用来修改字段数据
修改字段的默认值
alter table 表名 alter column 字段名 set default 默认值;
8.所有的统计函数都会忽略空值null
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL。
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL。
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空。
9.关于日期的聚合函数
Getdate()返回当前的日期和时间
Datepart()返回日期/时间的单独部分
Dateadd()在日期中添加或减去指定的时间间隔
Datediff()返回两个日期之间的时间—————-Datediff(datepart,startdate,enddate)
Convert()用不同的格式显示日期/时间
date—格式—yyyy-MM-dd
Datetime—格式—yyyy-MM-dd HH:MM:SS 年月日时分秒
Smalldatetime—格式—yyyy-MM-dd HH:MM:SS
Timestamp—格式-唯一的数字
10.delete 和truncate 、drop
truncate用于删除表中的所有行,而不记录单个行删除操作,truncate删除table速度更快
当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时(always with a WHERE clause), 用 delete.
11.case when then 注意end
case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
—简单case函数
case sex
when ‘1’ then ‘男’
when ‘2’ then ‘女’
else ‘其他’ end
—case搜索函数
case when sex = ‘1‘ then ‘男’
when sex = ‘2‘ then ‘女’
else ‘其他’ end
12
Q:select语句完整语法:
1) select 目标表的列名或列表达式序列
2) from 基本表名和(或)视图序列
3) [where 行条件表达式]
4) [group by 列名序列]
[having 组条件表达式]
5) [order by 列名[asc | desc]],则sql语句的执行顺序是:
A:
- 先从from字句一个表或多个表创建工作表
- 将where条件应用于1)的工作表,保留满足条件的行
- GroupBy 将2)的结果分成多个组
- Having 将条件应用于3)组合的条件过滤,只保留符合要求的组。
- Order By对结果进行排序。
13 where 之后不能以函数作为条件,就是where不能和聚合函数一起出现
14
SQL主要分成四部分**:
(1)数据定义。(SQL DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消操作。
(2)数据操纵。(SQL DML)数据操纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种操作。
(3)数据控制。(DCL)包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
(4)嵌入式SQL的使用规定。(TCL)涉及到SQL语句嵌入在宿主语言程序中使用的规则。
DDL(Data Definition Language)数据库定义语言
DDL不需要commit. eg. CREATE ALTER DROP TRUNCATE COMMENT RENAME
DML(Data Manipulation Language)数据操纵语言
DML需要commit. eg. SELECT INSERT UPDATE DELETE MERGE CALL EXPLAIN PLAN LOCK TABLE
DCL**(Data Control Language)数据库控制语言 授权,角色控制等
GRANT 授权, REVOKE 取消授权
TCL(Transaction Control Language)事务控制语言**
SAVEPOINT 设置保存点, ROLLBACK 回滚, SET TRANSACTION
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
16.
数据库管理系统提供相应的功能: (1)数据库恢复:在系统失效后的数据库恢复,配合定时备份数据库,使数据库不丢失数据。 (2)并发控制:保证多用户能共享数据库,并维护数据的一致性。 (3)安全性保护:防止对数据库的非法使用,以避免数据的泄露、纂改或破坏。 (4)完整性保护:保证数据的正确性和一致性。