临时表

SQL——with as 临时表

℡╲_俬逩灬. 提交于 2019-12-02 14:57:22
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些, 也有可能是在UNION ALL的不同部分,作为提供数据的部分。 特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语 所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个 全局临时表里。很多查询通过这种方法都可以提高速度。 二.使用方法 先看下面一个嵌套的查询语句: select * from person.StateProvince where CountryRegionCode in (select CountryRegionCode from person.CountryRegion where Name like 'C%') 上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此

SQL注入汇总(手注,盲注,报错注入,宽字节,二次编码,http头部){10.22、23 第二十四 二十五天}

Deadly 提交于 2019-12-02 06:46:11
首先什么是SQL注入:   所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 SQL注入有什么危害?   危害:数据泄露、脱库、篡改网站、破坏数据库、植入后门、getshell(获取网站权限) 为什么会有SQL注入漏洞?   后端代码在执行的过程将用户输入的数据也当做代码来执行,违背一个原则:代码和数据相分离(本质问题)   前段传递的数据可以随意控制,参数可控;后端对前段传递过来的数据没有过滤或者过滤不严谨,最终导致SQL注入(注入的原因) 首先本人现在只学了四五种SQL注入方式,仅作为学习参看,如有错误多多见谅=。= SQL注入本人认为只要能找到注入点就简单了,大不了各种方式往上面试喽,虽然时间成本很大。 所以所只要在有跟数据库进行交互的地方就有可能出现SQL漏洞,在这些地方找注入点就很重要啦。 SQL注入常用的数据库函数及常量 常用的数据库函数以及常量 @@tmpdir 临时目录 @@datadir @@basedir 数据库所在的位置 @@version 版本 @@hostname 当前数据库名字 user() version() 版本 database() 获取数据库 concat() group_concat() concat_wa() substr():oracle,mysql,mssq

SQL调优集合

与世无争的帅哥 提交于 2019-12-02 05:50:27
一.创建索引 1.要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 2.(1)在经常需要进行检索的字段上创建索引,比如要按照表字段username进行检索,那么就应该在姓名字段上创建索引,如果经常要按照员工部门和员工岗位级别进行检索,那么就应该在员工部门和员工岗位级别这两个字段上创建索引。 (2)创建索引给检索带来的性能提升往往是巨大的,因此在发现检索速度过慢的时候应该首先想到的就是创建索引。 (3)一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。 二.避免在索引上使用计算在where字句中,如果索引列是计算或者函数的一部分,DBMS的优化器将不会使用索引而使用全表查询,函数 属于计算的一种,同时在in和exists中通常情况下使用EXISTS,因为in不走索引 效率低 : select * from user where countname*22>11000(countname是索引列) 1 效率高: select * from user where countname>11000

SQL JOIN 中 on 与 where 的区别

流过昼夜 提交于 2019-12-02 05:27:09
left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。 right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。 inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。 full join : 外连接,返回两个表中的行:left join + right join。 cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。 关键字 on 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用 left jion 时, on 和 where 条件的区别如下: 1、 on 条件是在生成临时表时使用的条件(两张表关联的条件),它不管 on 中的条件是否为真,都会返回左边表中的记录。 2、 where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。 假设有两张表: 表1:tab2 id size 1 10 2 20 3 30 表2:tab2 size name 10 AAA 20 BBB 20 CCC 两条 SQL: select * form tab1 left join tab2 on (tab1.size = tab2.size)

MSSQL数据库 1000W数据优化整理

荒凉一梦 提交于 2019-12-02 03:35:25
GO SET STATISTICS TIME ON SELECT count([StyleId]) FROM [dbo].[Ky_Style] SET STATISTICS TIME OFF SET STATISTICS TIME ON SELECT count(*) FROM [dbo].[Ky_Style] SET STATISTICS TIME OFF SET STATISTICS TIME ON SELECT count(*) as H FROM [dbo].[Ky_Style] SET STATISTICS TIME OFF (1 行受影响) SQL Server 执行时间: CPU 时间 = 687 毫秒,占用时间 = 925 毫秒。 (1 行受影响) SQL Server 执行时间: CPU 时间 = 594 毫秒,占用时间 = 594 毫秒。 (1 行受影响) SQL Server 执行时间: CPU 时间 = 594 毫秒,占用时间 = 688 毫秒。 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 不太准确,在sql server 2008测试过,不等于也可以走索引查找的,主要取决于返回的列是不是索引键,以及返回的行数在表中总行数的比率; 3.应尽量避免在 where 子句中对字段进行 null 值判断

表空间相关SQL

自闭症网瘾萝莉.ら 提交于 2019-12-01 22:53:31
--查表空间使用率情况(含临时表空间) SELECT D.TABLESPACE_NAME "Name", D.STATUS "Status", TO_CHAR(NVL(A.BYTES / 1024 / 1024, 0), '99,999,990.90') "Size (M)", TO_CHAR(NVL(A.BYTES - NVL(F.BYTES, 0), 0) / 1024 / 1024, '99999999.99') USE, TO_CHAR(NVL((A.BYTES - NVL(F.BYTES, 0)) / A.BYTES * 100, 0), '990.00') "Used %" FROM SYS.DBA_TABLESPACES D, (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) A, (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F WHERE D.TABLESPACE_NAME = A.TABLESPACE_NAME(+) AND D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)

程序员面试中要注意什么 MySQL数据库表如何设计

▼魔方 西西 提交于 2019-12-01 16:26:25
序员面试中要注意什么?MySQL数据库表如何设计?如果要选择一门程序员必备的技能,那答案无疑是数据库,而MySQL是首选。很多企业在面试过程中会提问MySQL数据库表设计要注意什么,接下来千锋就给大家讲解一下。 MySQL相较于MSSQL SERVER和Oracle,是一款功能强大的小型数据库,能很好的满足千万级数据量的项目需要。注意,MySQL本身是没有可视化界面的,在Windows系统中你可以通过dos命令进行简单的连接和查看,在Linux系统下可以通过MySQL的命令进行连接查看。 MySQL支持很多种不同的数据类型,并且选择正确的数据类型对于获得高性能至关重要。在设计MySQL表时,你需要注意五点: 1、一定要设计主键 主键,又叫主关键字,用来唯一地标识表中的某一条记录。它能保证实体的完整性,加快数据库的操作速度,这一点很重要。主键使用自增最佳,这样每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果不是自增主键,那么可能会在中间插入,就会引发页的分裂,产生很多表碎片。 2、字段命名最好避开保留字 在给字段命名的时候,要尽量避开关键字,以免出了问题而不好查找。虽然在以关键字命名的字段上加''可以不再报错,但保险起见,就不要这么设计。 3、表名长度尽可能短 表名称不要太长,Oracle限制字符为30个,如果有转数据库的需要

mysql操作规范建议

℡╲_俬逩灬. 提交于 2019-12-01 10:27:00
作者: 听风,原文地址: https://www.cnblogs.com/huchong/p/10219318.html 。 数据库命令规范 数据库基本设计规范 所有表必须使用 Innodb 存储引擎 数据库和表的字符集统一使用 UTF8 所有表和字段都需要添加注释 尽量控制单表数据量的大小,建议控制在 500 万以内。 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 禁止在表中建立预留字段 禁止在数据库中存储图片,文件等大的二进制数据 禁止在线上做数据库压力测试 禁止从开发环境,测试环境直接连接生成环境数据库 数据库字段设计规范 优先选择符合存储需要的最小的数据类型 避免使用 TEXT,BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据 避免使用 ENUM 类型 尽可能把所有列定义为 NOT NULL 使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间 同财务相关的金额类数据必须使用 decimal 类型 索引设计规范 限制每张表上的索引数量,建议单张表索引不超过 5 个 禁止给表中的每一列都建立单独的索引 每个 Innodb 表必须有个主键 常见索引列建议 5.如何选择索引列的顺序 避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间) 对于频繁的查询优先考虑使用覆盖索引 8.索引

22、临时表

雨燕双飞 提交于 2019-12-01 09:28:07
临时表 临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。 当你使用 SHOW TABLES命令显示数据表列表时,你将无法看到 SalesSummary表。 创建临时表 CREATE TEMPORARY TABLE SalesSummary ( product_name VARCHAR(50) NOT NULL, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); INSERT INTO SalesSummary (product_name, total_sales, avg_unit_price, total_units_sold) VALUES ('cucumber', 100.25, 90, 2); SELECT * FROM SalesSummary; 删除MySQL 临时表 默认情况下,当你断开与数据库的连接后,临时表就会自动被销毁。 使用 DROP TABLE 命令来手动删除临时表。 DROP TABLE SalesSummary; SELECT * FROM SalesSummary; 1146

触发器(包含获取临时表数据)

我只是一个虾纸丫 提交于 2019-12-01 07:54:32
create trigger test -- 创建触发器test after insert on test1 -- 先执行insert 再触发 for each row -- 固定语法 begin -- 执行 DECLARE A VARCHAR(20); -- 声明变量A declare B VARCHAR(20); -- 声明变量B set A = new.test; -- 将insert的临时表中的 test字段值 赋值给A -- new.是获取临时表中的字段值相当于sqlserver中的inserted set B=new.id; -- 将insert的临时表中的 id字段值 赋值给B INSERT test1_1 SELECT A,B; -- 触发insert时间 END -- 结束 来源: https://www.cnblogs.com/liyunchuan/p/11670962.html