1.
@@ERROR:返回执行的上一个 Transact-SQLTransact-SQL 语句的错误号。
@@IDENTITY:返回自增id。
@@ROWCOUNT:返回受上一个SQL语句影响的行数。
@@MAX_CONNECTIONS:返回最大用户连接数。
2.创建视图 语句如下 create view 视图名 as select * from 表名 where 条件
3.防止SQL注入,需要注意以下几个要点:
永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
3.1SQL注入的关键是单引号的闭合
4.给数据库赋予登录权限的语句是grant usage on ... to
5. Union对结果进行并集,并会过滤重复的;
Union all对结果进行并集,但不会过滤重复的
6. coalesce函数,返回第一个非空值,如果都是空,返回空值
7.
having是在分组后过滤,where在分组前过滤,不冲突,可以同时使用;
having是用来过滤的,group by是限定分组;
select语句中没有聚合函数的使用时也可以用having
8.
普通插入(全字段):INSERT INTO table_name VALUES (value1, value2, ...)
普通插入(限定字段):INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)
多条一次性插入:INSERT INTO table_name (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), ...
从另一个表导入:INSERT INTO table_name SELECT * FROM table_name2 [WHERE key=value]
9.
STUFF(原字符, 开始位置, 删除长度, 插入字符)
从指定的起点处开始删除指定长度的字符,并在此处插入另一组字符
10.
WHERE不能接聚合函数(MAX、MIN、COUNT、SUM、AVG等);HAVING后可以接聚合函数;
WHERE用在GROUP BY前,先过滤后分组;
HAVING用在GROUP BY之后,先分组后过滤,且使用HAVING一定要用到GRUOP BY,但用到GROUP BY 不一定有HAVING。
11.
case具有两种格式。简单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
这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。
还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。
--比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ('a','b') then '第一类'
when col_1 in ('a') then '第二类'
else '其他' end
12.存储过程
存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
它可以提高SQL的速度,存储过程是编译过的,如果某一个操作包含大量的SQL代码或分别被执行多次,那么使用存储过程比直接使用单条SQL语句执行速度快的多。
不带参数的存储过程:
create procedure proc_sql1
as
begin
declare @i int
set @i=0
while @i<26
begin
print char(ascii('a') + @i) + '的ASCII码是: ' + cast(ascii('a') + @i as varchar)
set @i = @i + 1
end
end
带参数的存储过程:
create proc proc_sql6
@num1 int,
@num2 int,
@num3 int
as
begin
declare @max int
if @num1>@num2
set @max = @num1
else set @max = @num2
if @num3 > @max
set @max = @num3
print '3个数中最大的数字是:' + cast(@max as varchar)
end
13.alter 用法
1.添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
2.修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4.删除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;
14.
在MySQL中,要计算某个值占总数的百分比,可以使用CONCAT函数结合FORMAT函数来格式化输出百分比。以下是一个例子,假设我们有一个表sales,其中有两列amount和total_sales,我们想计算每笔销售额占总销售额的百分比。
SELECT
amount,
total_sales,
CONCAT(FORMAT((amount / total_sales) * 100, 2), '%') AS percentage
FROM
sales;
这个查询会返回每笔销售额、总销售额,以及一个格式化的百分比列,显示每笔销售额占总销售额的百分比,保留两位小数。
15.
where字句中可以使用:
(1)比较运算符:> >= < <= <> !=
(2)between 80 and 100——值在80到100之间
(3)in(80,90,100)——值是80或90或100
(4)like 'e%' 通配符可以是%或_, %表示任意多字符 _表示一个字符
(5)逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
16. 聚合函数结果作为筛选条件时,不能用where,而是用having语法
在SQL中,WHERE子句和HAVING子句虽然都用于过滤数据,但它们的应用时机和范围是不同的。这就是为什么在聚合筛选(即对聚合函数的结果进行筛选)时,只能使用HAVING子句而不能使用WHERE子句的原因。
①WHERE子句的作用:WHERE子句在数据分组(GROUP BY)之前应用。
它用于过滤原始数据集中的行,基于行级条件。
WHERE子句不能引用聚合函数(如SUM(), COUNT(), AVG()等)的结果,因为它在聚合计算之前执行。
②HAVING子句的作用:HAVING子句在数据分组(GROUP BY)和聚合计算之后应用。
它用于过滤分组后的结果集,基于组级条件。
由于WHERE子句在聚合之前应用,并且不能引用聚合函数的结果,因此它无法用于对聚合结果进行筛选。相反,HAVING子句在聚合之后应用,并且可以引用聚合函数的结果,因此它适用于对聚合结果进行筛选。
17.
题意明确:
分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,结果不去重
问题分解:
限定条件:学校为山东大学或者性别为男性的用户:university='山东大学', gender='male';
分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行,要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重
细节问题:
不去重:union all
完整代码:
18.
知识
CASE函数
是一种多分支的函数,可以根据条件列表的值返回多个可能的结果表达式中的一个。
可用在任何允许使用表达式的地方,但不能单独作为一个语句执行。
分为:
简单CASE函数
搜索CASE函数
简单 CASE函数
CASE 测试表达式
WHEN 简单表达式1 THEN 结果表达式1
WHEN 简单表达式2 THEN 结果表达式2 …
WHEN 简单表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
计算测试表达式,按从上到下的书写顺序将测试表达式的值与每个WHEN子句的简单表达式进行比较。
如果某个简单表达式的值与测试表达式的值相等,则返回第一个与之匹配的WHEN子句所对应的结果表达式的值。
如果所有简单表达式的值与测试表达式的值都不相等,
若指定了ELSE子句,则返回ELSE子句中指定的结果表达式的值;
若没有指定ELSE子句,则返回NULL。
例48. 查询班级表中的学生的班号、班名、系号和班主任号,并对系号作如下处理:
当系号为1时,显示 “计算机系”;
当系号为2时,显示 “软件工程系”;
当系号为3时,显示 “物联网系”。
SELECT 班号 ,班名,
CASE 系号
WHEN 1 THEN '软件工程系'
WHEN 2 THEN '计算机系'
WHEN 3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
搜索CASE函数
CASE
WHEN 布尔表达式1 THEN 结果表达式1
WHEN 布尔表达式2 THEN 结果表达式2 …
WHEN 布尔表达式n THEN 结果表达式n
[ ELSE 结果表达式n+1 ]
END
按从上到下的书写顺序计算每个WHEN子句的布尔表达式。
返回第一个取值为TRUE的布尔表达式所对应的结果表达式的值。
如果没有取值为TRUE的布尔表达式,
则当指定了ELSE子句时,返回ELSE子句中指定的结果;
如果没有指定ELSE子句,则返回NULL。
例48用搜索CASE来做:
SELECT 班号 ,班名,
CASE
WHEN 系号=1 THEN '软件工程系'
WHEN 系号=2 THEN '计算机系'
WHEN 系号=3 THEN '物联网系'
END AS 系号,班主任号
FROM 班级表
例49.查询“M01F011”号课程的考试情况,列出学号、课程号和成绩,同时将百分制成绩显示为等级。
SELECT 学号,课程号,
CASE
WHEN 成绩 >= 90 THEN '优'
WHEN 成绩 BETWEEN 80 AND 89 THEN '良'
WHEN 成绩 BETWEEN 70 AND 79 THEN '中'
WHEN 成绩 BETWEEN 60 AND 69 THEN '及格'
WHEN 成绩 <60 THEN '不及格'
END 成绩
FROM 成绩表
WHERE 课程号 = 'M01F011'
19.msql常见的一些执行顺序: 1 from 2 where 3 group by 4 having 5 select 6 order by 7 limit
20.
INSERT INTO 语句用于向表格中插入新的行。
INSERT INTO table_name VALUES (值1, 值2,....)
指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
把所有的列插入新表
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
只把希望的列插入新表
SELECT column_name(s)
INTO new_table_name [IN externaldatabase]
FROM old_tablename
21.
5.
表结构如下:
CREATE TABLE `score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sno` int(11) NOT NULL,
`cno` tinyint(4) NOT NULL,
`score` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;
以下查询语句结果一定相等的是()
A.SELECT sum(score) / count(*) FROM score WHERE cno = 2;
B.SELECT sum(score) / count(id) FROM score WHERE cno = 2;
C.SELECT sum(score) / count(sno) FROM score WHERE cno = 2;
D.SELECT sum(score) / count(score) FROM score WHERE cno = 2;
E.SELECT sum(score) / count(1) FROM score WHERE cno = 2;
F.SELECT avg(score) FROM score WHERE cno = 2;
所有的统计函数都会忽略空值(null)。
A :统计所有学生的平均分,就算成绩为空的学生,最后计算count(*)时也作为分母基数,计算得到所有学生的平均分。
B :与A一样,因为id主键非空,count(id)所得分母基数是所有学生。
C : 与B一样,非空属性sno。
D :由于score字段的值可能是空,空值在统计时忽略,所以count(score)和sum(score)统计的只是score不为空的学生,计算得到的平均分也只是有成绩的学生的平均分,无法计算所有学生的平均分。
E: count(1)与count(*)一样。
F:avg(score)会忽略空值,故计算结果为有成绩的学生的平均分。