关于sql:优化了MYSQL大量写入问题老板奖励了1000块给我

摘要:大家提到Mysql的性能优化都是重视于优化sql以及索引来晋升查问性能,大多数产品或者网站面临的更多的高并发数据读取问题。然而在大量写入数据场景该如何优化呢?明天这里次要给大家介绍,在有大量写入的场景,进行优化的计划。 总的来说MYSQL数据库写入性能次要受限于数据库本身的配置,以及操作系统的性能,磁盘IO的性能。次要的优化伎俩包含以下几点: 1、调整数据库参数(1) innodb_flush_log_at_trx_commit 默认为1,这是数据库的事务提交设置参数,可选值如下: 0: 日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新,然而在一个事务提交不做任何操作。 1:在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新。 2:在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。对日志文件每秒刷新一次。 有人会说如果改为不是1的值会不会不平安呢? 安全性比拟如下: 在 mysql 的手册中,为了确保事务的持久性和一致性,都是倡议将这个参数设置为 1 。出厂默认值是 1,也是最平安的设置。 当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最平安的,在mysqld 服务解体或者服务器主机crash的状况下,binary log 只有可能失落最多一个语句 或者一个事务。 然而这种状况下,会导致频繁的io操作,因而该模式也是最慢的一种形式。 当innodb_flush_log_at_trx_commit设置为0,mysqld过程的解体会导致上一秒钟所有事务数据的失落。当innodb_flush_log_at_trx_commit设置为2,只有在操作系统解体或者零碎掉电的状况下,上一秒钟所有事务数据才可能失落。针对同一个表通过c#代码依照零碎业务流程进行批量插入,性能比拟如下所示: (a.雷同条件下:innodb_flush_log_at_trx_commit=0,插入50W行数据所花工夫25.08秒;(b.雷同条件下:innodb_flush_log_at_trx_commit=1,插入50W行数据所花工夫17分21.91秒;(c.雷同条件下:innodb_flush_log_at_trx_commit=2,插入50W行数据所花工夫1分0.35秒。论断:设置为0的状况下,数据写入是最快的,能迅速晋升数据库的写入性能, 但有可能失落上1秒的数据。 (2) temp_table_size,heap_table_size 这两个参数次要影响长期表temporary table 以及内存数据库引擎memory engine表的写入,设置太小,甚至会呈现table is full的报错信息. 要依据理论业务状况设置大于须要写入的数据量占用空间大小才行。 (3) max_allowed_packet=256M,net_buffer_length=16M,set autocommit=0 备份和复原时如果设置好这三个参数,能够让你的备份复原速度飞起来哦! (4) innodb_data_file_path=ibdata1:1G;ibdata2:64M:autoextend 很显然表空间前面的autoextend就是让表空间主动扩大,不够默认状况下只有10M,而在大批量数据写入的场景,无妨把这个参数调大; 让表空间增长时一次尽可能调配更多的表空间,防止在大批量写入时频繁的进行文件扩容 (5) innodb_log_file_size,innodb_log_files_in_group,innodb_log_buffer_size 设置事务日志的大小,日志组数,以及日志缓存。默认值很小,innodb_log_file_size默认值才几十M,innodb_log_files_in_group默认为2。 然而在innodb中,数据通常都是先写缓存,再写事务日志,再写入数据文件。设置太小,在大批量数据写入的场景,必然会导致频繁的触发数据库的检查点,去把 日志中的数据写入磁盘数据文件。频繁的刷新buffer以及切换日志,就会导致大批量写入数据性能的升高。 当然,也不宜设置过大。过大会导致数据库异样宕机时,数据库重启时会去读取日志中未写入数据文件的脏数据,进行redo,复原数据库,太大就会导致复原的工夫变的更长。当复原工夫远远超出用户的预期承受的复原工夫,必然会引起用户的埋怨。 这方面的设置倒能够参考华为云的数据库默认设置,在华为云2核4G的环境,貌似默认配置的buffer:16M,log_file_size:1G----差不多依照mysql官网倡议达到总内存的25%了;而日志组files_in_group则设置为4组。 2核4G这么低的硬件配置,因为参数设置的合理性,曾经能抗住每秒数千次,每分钟8万屡次的读写申请了。 而如果在写入数据量远大于读的场景,或者说不便轻易改变参数的场景,能够针对大批量的数据导入,再做调整,把log_file_size调整的更大,能够达到innodb_buffer_pool_size的25%~100%。 (6) innodb_buffer_pool_size设置MySQL Innodb的可用缓存大小。实践上最大能够设置为服务器总内存的80%. 设置越大的值,当然比设置小的值的写入性能更好。比方下面的参数innodb_log_file_size就是参考innodb_buffer_pool_size的大小来设置的。 (7) innodb_thread_concurrency=16 故名思意,管制并发线程数,实践上线程数越多当然会写入越快。当然也不能设置过大官网倡议是CPU核数的两倍左右最合适。 (8) write_buffer_size 管制单个会话单次写入的缓存大小,默认值4K左右,个别能够不必调整。然而在频繁大批量写入场景,能够尝试调整为2M,你会发现写入速度会有肯定的晋升。 ...

January 4, 2021 · 1 min · jiezi

关于sql:PrestoSQL-更名-Trino永别了Flash华为下架腾讯全部游戏丨思否技术周刊

值班编辑:袁钰涵 1、Facebook 抢占商标,PrestoSQL 无奈抉择更名 Trino出名开源我的项目 Presto 的三位发起人发表,将 PrestoSQL 我的项目的名字改为 Trino。 该我的项目本来是由 Facebook 经营的,但 2019 年年初,Presto 团队的三位创始人来到了 Facebook。从此,Presto 我的项目被一分为二,由 Facebook 保护 PrestoDB,Martin、Dain、David 三位 Presto 我的项目最早的发起人保护 PrestoSQL。 目前,PrestoSQL 我的项目在 GitHub 上的名称曾经改为了 Trino,其官网也在布告中提供了我的项目的新地址。(起源:SegmentFault) ——Martin、Dain 和 David示意,尽管对 Presto 这个名字感到不舍,“但坦率地说,咱们曾经厌倦了无休止的分心,咱们打算专一于最重要的事件和咱们最善于的工作,构建每个人都能够依赖的高质量软件,并建设一个衰弱的用户和开发者社区并反对它。”2、2020年寰球程序员支出报告出炉,字节跳动成惟一上榜中国公司Levels.fyi 网站于日前公布了一份 2020 年度程序员支出报告,报告显示,在入门级工程师分类中,Lyft 公司以 23 万美元的中位数薪资占据榜首。其次是 ROBLOX,薪资为 22.2 万美元。Stripe 和 Airbnb 并列第三,薪资为 21.3 万美元。该榜单中排名前四的五家公司中,程序员的中位数薪资都超过了 20 万美元。剩下排名靠后的其余三家公司的薪资也都差距不大,别离为 19.9、19.7、19.5 万美元。 工程师职位方面,Airbnb 最高,中位数薪资 29.5 万美元。其次是 Pinterest 和 box,别离为 29.4 万美元和 29 美元。字节跳动作为惟一上榜的中国公司,以 26 万美元的薪资排名第 7。 ...

January 3, 2021 · 2 min · jiezi

关于sql:仅4步就可通过SQL进行分布式死锁的检测与消除

摘要:本文次要介绍在 GaussDB(DWS) 中,如何通过 SQL 语句,对分布式死锁进行检测和复原。分布式数仓利用场景中,咱们常常遇到数据库系统 hang 住的问题,所谓 hang 是指尽管数据库系统还在运行,但局部或全副业务无奈失常执行。hang 问题的起因有很多,其中以分布式死锁最为常见,本次次要分享在碰到死锁时,如何疾速地解决死锁问题。 GaussDB(DWS) 作为分布式数仓,通过锁机制来履行并发管制,因而也存在产生分布式死锁的可能。尽管分布式死锁无奈防止,但侥幸的是其提供了多种零碎视图,可能保障在分布式死锁产生之后,疾速地对死锁进行定位。 本文次要介绍了在 GaussDB(DWS) 中,如何通过 SQL 语句,对分布式死锁进行检测和复原。本文介绍的办法大抵分为 4 步: 1. 收集各节点的锁信息。 2. 构建期待关系。 3. 检测循环期待。 4. 停止事务以打消死锁。 本文介绍的办法应用简略,门槛低,能够确保在分布式死锁产生之后,疾速解决问题,复原业务。 通过 SQL 语句进行分布式死锁的检测与打消分布式死锁和单节点死锁的比拟单节点死锁单节点死锁是指,死锁中的所有锁期待信息来自同一个节点,例如: -- 事务 transaction1 -- 所在节点:CN1 BEGIN; TRUNCATE t1;EXECUTE DIRECT ON(DN1) 'SELECT * FROM t2'; COMMIT; -- 事务 transaction2 -- 所在节点:CN1 BEGIN; TRUNCATE t2;EXECUTE DIRECT ON(DN2) 'SELECT * FROM t1'; COMMIT; 假如上述两个事务的执行程序如下: [transaction1] TRUNCATE t1[transaction2] TRUNCATE t2[transaction1] EXECUTE DIRECT ON(DN1) 'SELECT * FROM t2'[transaction2] EXECUTE DIRECT ON(DN2) 'SELECT * FROM t1'该执行程序会导致死锁的产生。因为事务 transaction1 和 transaction2 都在 CN1 上执行,死锁中的所有锁期待信息都在 CN1 上,因而该死锁为单节点死锁。 ...

December 31, 2020 · 8 min · jiezi

关于sql:sql优化

sql优化SQL调优

December 29, 2020 · 1 min · jiezi

关于sql:深度干货异构数据的SQL一站式解决方案

在近日举办的GDG开发者大会广州站上,个推高级技术总监董霖以“异构数据的SQL一站式解决方案”为主题,深刻分享了个推在SQL畛域多年的实战经验。本文将从三方面论述对立SQL: 一、为什么要对立SQL二、如何对立SQL三、个推对立SQL实际**(以下依据演讲内容整顿) 01为什么要对立SQL 数据作业是多兵种单干的战场 公司外部围绕数据发展的工作,须要数据分析师、数据研发工程师、运维工程师、甚至产品经营人员共同完成,沟通和合作的效率成为关键性因素。 数据存储引擎目迷五色 随着大数据行业的倒退,数据存储引擎目前处于百花齐放的阶段,新兴技术层出不穷:如关系型数据库,包含MySQL、Oracle、SQL Server以及蚂蚁推出的OceanBase等;NoSQL计划,包含Redis、Aerospike、MongoDB等;基于Hadoop体系的计划,包含Hive、HBase等;以及目前比拟炽热的NewSQL方向,包含Greenplum、TiDB、Doris、ClickHouse等。 各式各样的存储引擎让不少参加数据作业的人感到茫然,不晓得该抉择什么样的形式。开发者要花十分多的老本不停地尝试各种计划,以应答市场需求。开发者须要精确理解数据存在哪里、字段格局怎么、数据表间的关系怎么、数据如何操作等信息,技术人员和业务人员还须要花很多工夫把握各种存储引擎的性能和个性。 多样的数据存储计划 引擎抉择类型多、学习老本高 除了存储引擎,计算引擎的抉择也给大家带来困扰。Spark和Flink各有千秋,也各自在疾速倒退和互相学习交融。另外机器学习引擎也有很多计划,比方Tensorflow、PyTorch以及计算引擎中携带的机器学习算法库,但这些计划的学习老本比拟高,经常令开发者感到纠结,难以抉择。 工作语言不对立 存储引擎和计算引擎具备繁多的计划,会给协同工作带来较大的语言障碍。对于分析师来说,日常大量应用的次要是SQL,然而有些时候也会应用Python、Shell脚本等形式实现数据处理。数据建模人员次要依赖Python,而数据研发人员则次要应用Java和Scala来开发实时工作。产品经营人员甚至会应用Excel来实现一些简略的剖析工作。当然,大多数时候他们还是将需要表白给数据分析师,由分析师来帮助实现。 语言障碍也在肯定水平上限度了合作的效率,在资源调配上也不足灵活性。比方基于Spark或Flink的实时工作目前只能由数据研发同学实现,这很容易造成工作积压。 “对立SQL”天时地利人和 如果咱们认真思考,其实会发现数据处理实质上是数仓的加工解决,而各类数据作业都可形象为数仓的ETL过程,即数据的提取(extract)、转换(transform)和加载(load)。目前来看,SQL是形容数据处理流程最优的DSL(Domain Specific Language),是事实标准。 在目前大环境下推广对立SQL的解决方案是大势所趋,具备天时地利人和的根本条件: •    地利:数据体量增长,计算、人力、沟通成本增加,为企业不能接受之重; •    天时:支流关系型数据库、MPP数据库、计算引擎、ES、甚至NoSQL计划曾经或者打算反对SQL语法; •    人和:SQL语言易于上手,外围性能只有9个动词;分析师、建模师、数据研发甚至产品经营等非技术人员都能够疾速把握SQL这门语言。 咱们认为能够通过对立SQL的形式去实现二八准则的转换,即从目前把80%的工夫花在20%的惯例数据作业上 ,转变成用20%的工夫就能够实现80%的惯例数据作业。这样咱们就能够有更多的工夫去解决更简单的工作,去思考数据的价值。 02如何对立SQL要想实现SQL的对立,咱们认为需满足四大外围需要:元数据买通、跨数据源、反对离线和实时计算、反对机器学习。 先以一个典型的离线计算场景为例,咱们心愿通过简略的SQL即可达成指标,即用Hive数据与MySQL数据相交融,而后回写到HBase。 update hbase.biz.user_balances as aset a.balance = ret.balancefrom ( select b.uid, c.balance from hive.warehouse.users as b inner join mysql.biz.balances as c on b.uid = c.uid ) as retwhere a.uid = ret.uid相似的,如果是一个典型的实时计算场景,咱们也心愿能通过一个简略的SQL来实现Kafka数据流与MySQL的交融再回写到Redis这样的需要,例如: update redis.dashboard.brands as a set a.cnt = ret.cnt ...

December 28, 2020 · 1 min · jiezi

关于sql:EF-core关联对象删除

DeleteBehavior@想一想@:在关联的entity之间,当删除父entity(比方Classroom)的时候,子entity(比方Student)应该如何解决? 温习:__SQL中的Cascade Delete 自定义:OnDelete()办法在OnModelCreating()中可调用OnDelete()办法,传递DeleteBehavior枚举值,指定EF core如何操作。 比方: modelBuilder.Entity<Student>() .HasOne<Bed>(s => s.SleepIn) .WithOne(b => b.Owner) .HasForeignKey<Student>(s => s.SleepInId) .OnDelete(DeleteBehavior.Cascade) ; EF的DeleteBehavior枚举能够被归为3类。对应着当删除父entity的时候,子entity或数据行的3种解决计划: Cascade/ClientCascade:子entity被同时删除SetNull/ClientSetNull:其外键被设置为null (如果外键不能被设置为null,会报异样)NoAction:不产生扭转Client和非Client比方DeleteBehavior.SetNull和DeleteBehavior.ClientSetNull: client指EF,即:EF会生成解决子entity的Update/Delete语句,交数据库执行,不依赖于数据库的设定非client,需依附数据库上的设定,EF不会生成解决子entity的Update/Delete语句所以,如果设置是: Client:子entity要曾经退出DbContext (比方1:n的时候,n要双向援用且被加载到DbContext)非Client:数据库要有相应的Cascade设置。如果通过Migration或EnsureCreated创立的数据库,数据库上的Cascade会主动配置……演示: 应用EF的migration或者API建库建表,不同的DeleteBehavior生成不同的SQL建表语句,比方: __DeleteBehavior.SetNull,生成ON DELETE SET NULLALTER TABLE [dbo].[Students] ADD CONSTRAINT [FK_Students_Bed_SleepInId] FOREIGN KEY ([SleepInId]) REFERENCES [dbo].[Bed] ([Id]) ON DELETE __SET NULL__; __ DeleteBehavior.ClientCascade,没有ON DELETE后缀 (_@想一想@_:为什么?)删除一个父entity,在Logger中查看是否有删除/更新子entity的SQL语句留神:如果说EF的Cascade配置和数据库设置相冲突,会报异样。 默认行为EF依据子entity是否必须要有一个父entity(即数据库上外键是否能够为Null),默认设置Behavior: 如果外键能够为空:DeleteBehavior.ClientSetNull如果外键不能够为空:DeleteBehavior.Cascade标记删除当entity之间的关系简单之后,级联删除会导致简单的链式反应,比方: 删除A就会删除B,删除B就会删除C和D,删除D又会删除E和F……但并不是每个entity都能删得掉 所以咱们通常都不进行物理删除,而是用flag标记删除(在entity中增加一个是否已删除的Flag列),最初再由DBA批量删除,其劣势为: 缩小用户等待时间能够回溯撤销便于管制意外状况产生删除关系有时候咱们并不需要删除entity,只是想“切断”entity之间的关系。比方:1号教室原来是lw、zl、lzb三个同学,当初将lzb移出该教室(而不是删除)。 留神首先要把关联entity加载到DbContext中来。 SetNull和Remove如果援用是单向的话,无论关联entity是汇合还是单个元素。 小bug应用LazyLoad,比方在“多对多”关系中,你可能会认为这样的代码是“从新赋值” 但查看运行后果,居然是“增加”了。这是怎么一回事呢?https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...https://github.com/hdfgfgh546...https://www.github.com/hdfgfg...http://github.com/hdfgfgh546/...

December 27, 2020 · 1 min · jiezi

关于sql:超经典十步完全理解-SQL

很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的申明性语言,它的运行形式齐全不同于咱们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(只管有些人认为 SQL 语言也是一种函数式语言)。 咱们每天都在写 SQL 并且利用在开源软件 jOOQ 中。于是我想把 SQL 之美介绍给那些依然对它头疼不已的敌人,所以本文是为了以下读者而顺便编写的: 1、 在工作中会用到 SQL 然而对它并不齐全理解的人。 2、 可能纯熟应用 SQL 然而并不理解其语法逻辑的人。 3、 想要教他人 SQL 的人。 本文着重介绍 SELECT 句式,其余的 DML (Data Manipulation Language 数据操纵语言命令)将会在别的文章中进行介绍。 10个简略步骤,齐全了解SQL 1、 SQL 是一种申明式语言 首先要把这个概念记在脑中:“申明”。SQL 语言是为计算机申明了一个你想从原始数据中取得什么样的后果的一个范例,而不是通知计算机如何可能失去后果。这是不是很棒? (译者注:简略地说,SQL 语言申明的是后果集的属性,计算机会依据 SQL 所申明的内容来从数据库中挑选出合乎申明的数据,而不是像传统编程思维去批示计算机如何操作。) SELECT first_name, last_name FROM employees WHERE salary > 100000下面的例子很容易了解,咱们不关怀这些雇员记录从哪里来,咱们所须要的只是那些高薪者的数据(译者注:salary>100000 )。 咱们从哪儿学习到这些? 如果 SQL 语言这么简略,那么是什么让人们“闻 SQL 色变”?次要的起因是:咱们潜意识中的是依照命令式编程的思维形式思考问题的。就如同这样:“电脑,先执行这一步,再执行那一步,然而在那之前先检查一下是否满足条件 A 和条件 B ”。例如,用变量传参、应用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。 2、 SQL 的语法并不依照语法程序执行 ...

December 21, 2020 · 5 min · jiezi

关于sql:SQL-优化极简法则还有谁不会

SQL 作为关系型数据库的规范语言,是IT从业人员必不可少的技能之一。SQL 自身并不难学,编写查问语句也很容易,然而想要编写出可能高效运行的查问语句却有肯定的难度。 查问优化是一个简单的工程,波及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL 语句的执行程序、索引以及统计信息的采集等,甚至应用程序和零碎的整体架构。本文介绍几个要害法令,能够帮忙咱们编写高效的 SQL 查问;尤其是对于初学者而言,这些法令至多能够防止咱们写出性能很差的查问语句。 以下法令实用于各种关系型数据库,包含但不限于:MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite 等。如果感觉文章有用,欢送评论、点赞、转发朋友圈反对。 法令一:只返回须要的后果肯定要为查问语句指定 WHERE 条件,过滤掉不须要的数据行。通常来说,OLTP 零碎每次只须要从大量数据中返回很少的几条记录;指定查问条件能够帮忙咱们通过索引返回后果,而不是全表扫描。绝大多数状况下应用索引时的性能更好,因为索引(B-树、B+树、B*树)执行的是二进制搜寻,具备对数工夫复杂度,而不是线性工夫复杂度。以下是 MySQL 聚簇索引的示意图:举例来说,假如每个索引分支节点能够存储 100 个记录,100 万(1003)条记录只须要 3 层 B-树即可实现索引。通过索引查找数据时须要读取 3 次索引数据(每次磁盘 IO 读取整个分支节点),加上 1 次磁盘 IO 读取数据即可失去查问后果。纯干货!15000 字语法手册分享给你 相同,如果采纳全表扫描,须要执行的磁盘 IO 次数可能高出几个数量级。当数据量减少到 1 亿(1004)时,B-树索引只须要再减少 1 次索引 IO 即可;而全表扫描则须要再减少几个数量级的 IO。 同理,咱们应该防止应用 SELECT * FROM, 因为它示意查问表中的所有字段。这种写法通常导致数据库须要读取更多的数据,同时网络也须要传输更多的数据,从而导致性能的降落。 法令二:确保查问应用了正确的索引如果短少适合的索引,即便指定了查问条件也不会通过索引查找数据。因而,咱们首先须要确保创立了相应的索引。一般来说,以下字段须要创立索引: 经常出现在 WHERE 条件中的字段建设索引能够防止全表扫描;将 ORDER BY 排序的字段退出到索引中,能够防止额定的排序操作;多表连贯查问的关联字段建设索引,能够进步连贯查问的性能;将 GROUP BY 分组操作字段退出到索引中,能够利用索引实现分组。即便创立了适合的索引,如果 SQL 语句写的有问题,数据库也不会应用索引。导致索引生效的常见问题包含: 在 WHERE 子句中对索引字段进行表达式运算或者应用函数都会导致索引生效,这种状况还包含字段的数据类型不匹配,例如字符串和整数进行比拟;应用 LIKE 匹配时,如果通配符呈现在左侧无奈应用索引。对于大型文本数据的含糊匹配,应该思考数据库提供的全文检索性能,甚至专门的全文搜索引擎(Elasticsearch 等);如果 WHERE 条件中的字段上创立了索引,尽量设置为 NOT NULL;不是所有数据库应用 IS [NOT] NULL 判断时都能够利用索引。执行打算(execution plan,也叫查问打算或者解释打算)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描拜访表中的数据,连贯查问的实现形式和连贯的程序等。如果 SQL 语句性能不够现实,咱们首先应该查看它的执行打算,通过执行打算(EXPLAIN)确保查问应用了正确的索引。 ...

December 19, 2020 · 2 min · jiezi

关于sql:一文为你详解Unique-SQL原理和应用

摘要:以肯定的算法联合解析树中的各结点,计算出来一个整数值,用来惟一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID雷同的SQL语句属于同一个“Unique SQL”。1、什么是Unique SQL用户执行SQL语句时,每一个SQL语句文本都会进入解析器(Parser),生成“解析树”(parse tree)。遍历解析树中各个结点,疏忽其中的常数值,以肯定的算法联合树中的各结点,计算出来一个整数值,用来惟一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID雷同的SQL语句属于同一个“Unique SQL”。 例如,用户先后输出如下两条SQL语句: select from t1 where id = 1; select from t1 where id = 2; 这两条SQL语句除了过滤条件的常数值不同,其余中央都雷同,由此生成的解析树的拓扑构造完全相同,故Unique SQL ID也雷同。因而两条语句属于如下同一个Unique SQL: select * from t1 where id = ?; GaussDB内核会对所有下面模式的SQL语句汇总统计信息,通过视图出现给用户。通过这种形式,能够排除一些无关的常量值的烦扰,取得某一类SQL语句的统计数据,为性能剖析和问题定位提供数值根据。 留神,对于Unique SQL ID的计算,只会排除常数值,而不会排除其余的差别。例如,SQL语句“select * from t2 where id = 1;” 与下面的SQL不属于同一个Unique SQL,不同用户,从不同的CN节点执行的雷同的SQL语句也不属于同一个Unique SQL。 2、Unique SQL如何统计收到SQL申请后,GaussDB内核首先算出其Unique SQL ID。如果该Unique SQL ID已存在,则间接更新相干的统计信息。如果不存在,首先创立一个Unique SQL,而后再更新统计信息,如下图所示: Unique SQL的统计信息包含执行次数,响应工夫,Cache/IO数量,行流动和工夫散布等信息,能够通过如下两个视图查问: gs_instr_unique_sqlpgxc_instr_unique_sql前者显示以后CN(Coordinator Node)节点(执行以后SQL命令的节点)上的Unique SQL信息,后者显示零碎中所有CN节点上的Unique SQL信息。两个视图的格局雷同,均由下表中的字段组成: ...

December 16, 2020 · 2 min · jiezi

关于sql:mysql如何在排序后在每个分组中随机抽取多个数据

记录一下最近在我的项目中遇到的问题,因为我的项目的历史遗留起因,导致在数据库须要单表查问这样一组数据:生成随机考卷能够从任意题库中抉择任意题型的任意题目数量。题库为题型表中的一个字段,表构造如下依据可用条件,题库类型,和题目数量都是未知的,因为表构造问题导致后盾须要屡次循环,为了简化一下操作选取试卷所须要的最大题目数: 首先要求随机: select *,rand() as ndex_name from exam_radio_serv order by bank_id , ndex_name desc减少随机字段,再排个序,排序的作用相似于分组,这段没有问题之后就简略了: select t2.* from( select @e:=case when @customer_no=t1.bank_id then @e+1 else 1 end as num, @customer_no:=t1.bank_id as stu_age,t1.* from (select id,bank_id,rand() as ndex_name from exam_radio_serv order by bank_id , ndex_name desc)t1)t2 where num<=4 总的来说就是增加了两个伪字段,对曾经排好序的数据再在后面增加一个序号字段,再取每个组中的前几条,因为排序是依据rand()来的,所以每次排序的程序不一样,bank_id作为前置的分组条件保障随机排序在可控范畴内

December 15, 2020 · 1 min · jiezi

关于sql:sql执行初识

执行程序select * from 表1 join 表2 on xxx where xxx group by xxx having xxx order by limit xxx 先关联表 joinwheregroup byhavingselectorder bylimit

December 12, 2020 · 1 min · jiezi

关于sql:sqlviewhive为例

视图(View) :视图是一种非凡(逻辑上存在)的表视图是只读的视图能够将敏感的字段进行爱护,只将用户须要查问的字段裸露在视图中,爱护数据隐衷

December 12, 2020 · 1 min · jiezi

关于sql:新同事不讲武德这SQL语句写得忒野了

明天来分享几个MySQL常见的SQL谬误(不当)用法。咱们在作为一个初学者时,很有可能本人在写SQL时也没有留神到这些问题,导致写进去的SQL语句效率低下,所以咱们也能够自省自检一下。 1. LIMIT 语句分页查问是最罕用的场景之一,但也通常也是最容易出问题的中央。比方对于上面简略的语句,个别DBA想到的方法是在type, name, create_time字段上加组合索引。这样条件排序都能无效的利用到索引,性能迅速晋升。 SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10; 好吧,可能90%以上的DBA解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员依然会埋怨:我只取10条记录为什么还是慢? 要晓得数据库也并不知道第1000000条记录从什么中央开始,即便有索引也须要从头计算一次。呈现这种性能问题,少数情景下是程序员偷懒了。在前端数据浏览翻页,或者大数据分批导出等场景下,是能够将上一页的最大值当成参数作为查问条件的。SQL从新设计如下: SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10;在新设计下查问工夫根本固定,不会随着数据量的增长而发生变化。 2. 隐式转换SQL语句中查问变量和字段定义类型不匹配是另一个常见的谬误。比方上面的语句: mysql> explain extended SELECT * > FROM my_balance b > WHERE b.bpn = 14000000123 > AND b.isverified IS NULL ;mysql> show warnings;| Warning | 1739 | Cannot use ref access on index 'bpn' due to type or collation conversion on field 'bpn'其中字段bpn的定义为varchar(20),MySQL的策略是将字符串转换为数字之后再比拟。函数作用于表字段,索引生效。 ...

December 8, 2020 · 6 min · jiezi

关于sql:SQL-有序计算

什么是有序计算       应用过 SQL 的敌人对计算字段都不会生疏,比方 firstname+lastname,year(birthday),这些计算字段属于行内计算,不论表达式里用到的是单个字段,还是多个字段,应用的数据都在以后记录行内。有行内计算,对应的也就有跨行计算,如:第一名和第二名的差距;从 1 月到以后月份累计的销售额。依照问题有序,才会有第一名、第二名的说法,累计操作同样基于有序数据,从第几个累加到第几个,这些基于有序汇合的计算,就属于有序计算。行内计算关怀的是每条数据本身的状况,而跨行的有序计算则关怀有序数据的变动状况。 相邻记录援用简略常见的有序计算是相邻记录援用,也就是在计算中要援用某种秩序下的相邻记录。比方上面这些问题: 1、 股价每天的涨幅是多少(比上期) 按日期排序时,援用上一天的股价。 2、 前一天 \+ 当天 \+ 后一天的均匀股价是多少(挪动均匀) 按日期排序时,援用前后两天的股价。 3、 多支股票数据,计算每支股票内的每日涨幅(分组内的比上期) 按股票分组,组内按日期排序,援用上一天股价。 接下来通过这几个例子钻研下 SQL 如何实现这类有序计算。 晚期 SQL 的解决方案       晚期的 SQL 没有窗口函数,援用相邻记录的办法是用 JOIN 把相邻记录拼到同一行。        问题 1 写进去是这样的:        SELECT day, curr.price/pre.price rate        FROM (               SELECT day, price, rownum row1               FROM tbl ORDER BY day ASC) curr        LEFT JOIN (               SELECT day, price, rownum row2 ...

November 28, 2020 · 4 min · jiezi

关于sql:SQL-的后计算脚本

【摘要】 SQL 的后计算脚本用于实现 SQL 不适宜的某些简单运算,本文从此类工具中精心筛选了三种,从开发效率、语法表达能力、结构化函数库等方面进行深度比照,考查了各脚本在汇合计算、有序计算等重点运算上的体现,esProc 在这几款工具中的体现最为杰出。点击SQL 的后计算脚本理解详情。 大多数状况下,咱们用 SQL(存储过程)就能够实现数据库计算,但如果遇到 SQL 不善于的某些简单运算,就只能用其余程序语言把数据读出库外,而后在数据库外实现计算,这样的程序语言常常是以简略脚本的模式呈现,咱们在这里称为 SQL 的后计算脚本。 SQL 不善于的运算次要包含简单的汇合计算、有序计算、关联计算、多步骤计算等。SQL 汇合化不够彻底,没有显式的汇合数据类型,导致计算过程中产生的汇合难以复用,比方分组后必须强制汇总,而基于分组后的子集无奈再计算;SQL 基于无序汇合实践设计,解决跨行组及排名等有序运算十分麻烦,常常用 JOIN 或子查问长期生成序号,不仅难写而且运算效率很低。SQL 还不反对记录的援用,只能用子查问或 JOIN 语句形容关联关系,一旦遇到层级较多或自关联的状况,代码就会异样简单;SQL 自身也不提倡多步骤代码,常常迫使程序员写出嵌套很多层的长语句,尽管用存储过程能够肯定水平解决这个问题,但有时理论环境不容许咱们应用存储过程,比方 DBA 严格控制存储过程的权限、旧数据库和小型数据库不反对存储过程等,而且存储过程的调试也很不不便,并不是很适宜写出有过程的计算。 除了上述简单运算,还有一些状况也会用到 SQL 的后计算脚本。比方,计算逻辑须要在不同品种的数据库间迁徙,波及到非关系数据库;输出源或输入指标不止数据库,而是 Excel、文本等文件;还可能在多个数据库之间进行混合计算。这些都会波及库外计算,用到 SQL 的后计算脚本。 对 SQL 的后计算脚本而言,最重要的性能当然还是实现 SQL 不善于的那些简单运算。除此之外,最好还能具备一些更高级的个性,比方计算文件、非关系数据库等多样性数据、能解决较大的数据量、运算性能 不能太慢等。当然,最根本的是要不便地反对读写数据库,这样能力实现 SQL 的后计算。 常见的用于 SQL 后计算脚本有 JAVA、Python pandas、esProc,上面就让咱们深刻理解这些脚本,看看它们进行 SQL 后计算时的能力差异。 JAVAC++、JAVA 等高级语言实践上无所不能,天然也能实现 SQL 不善于的运算。JAVA 反对泛型,汇合化比拟彻底,能够实现简单的汇合运算。JAVA 的数组原本就有序号,能够实现有序运算。JAVA 反对对象援用,可用援用来示意关系,关联运算也没什么问题。JAVA 反对分支、循环等过程性语法,可轻松实现多步骤简单运算。 然而,JAVA 不足结构化类库,连最简略的结构化计算都必须硬编码实现,最根本的结构化数据类型也要手工建设,这会导致代码简短繁琐。 举个有序计算的例子:求某支股票最长间断上涨天数。库表 AAPL 存储某支股票的股价信息,次要字段有交易日期、收盘价,请计算该股票最长的间断上涨天数。 按天然思路实现这个工作:对日期有序的股票记录进行循环,如果本条记录与上一条记录相比是上涨的,则将间断上涨天数(初始为 0)加 1,如果是上涨的,则将间断上涨天数和以后最大间断上涨天数(初始为 0)相比,选出新的以后最大间断上涨天数,再将间断上涨天数清 0。如此循环直到完结,以后最大间断上涨天数即最终的最大间断上涨天数。 SQL 不善于有序计算,无奈用上述天然思路实现,只能用一些乖僻难懂的技巧:把按日期有序的股票记录分成若干组,间断上涨的记录分成同一组,也就是说,某天的股价比上一天是上涨的,则和上一天记录分到同一组,如果上涨了,则开始一个新组。最初看所有分组中最大的成员数量,也就是最多间断上涨的天数。 ...

November 19, 2020 · 2 min · jiezi

关于sql:SQL资料

SQL扫盲增删改查 查问语句一览 增删改一览 用到了能够再认真钻研用法

November 15, 2020 · 1 min · jiezi

关于sql:开源JNPF快速开发框架二次开发原理解决方案

二次开发,简略的说就是在现有的软件上进行性能的扩大,定制批改,而后达到本人想要的性能,一般来说都不会扭转原有零碎的内核。 为什么要二次开发?随着信息化技术的一直倒退,IT行业涌现出了一系列优良的开源作品,其作者或是集体,或是我的项目小组,或是软件公司。抉择和利用这些优良的开源软件,并在此基础上进行合乎业务需要的二次开发,将给企业节俭信息化老本(工夫老本及开发成本)的同时,更能带来技术上的保障。这就是咱们常听的:站在伟人的肩膀上,你将看的更远。所以国内很多公司须要二次开发的人才。 怎么做二次开发?第一,你要有这个开源产品的所用语言的语言根底。 第二,你要对这个开源产品的性能和应用要有比拟相熟,因为你相熟了,你才晓得一个需要下来,你要改什么,什么是零碎自带的,大略要怎么改。 第三,你要相熟这个开源产品的数据结构,代码构造,零碎的框架结构,外围是哪里,从属性能是在哪里。简略点说,就是数据库,代码逻辑,文件目录的相熟。如果是用接口式的二次开发,则须要你对这个接口比拟相熟,一般来说会有相应的文档。 第四,依据你的需要,而后利用开源产品的内核,进行零碎的扩大和批改,以达到你的需要。 第五,对其提供的SDK中的API函数有肯定理解,以利于你对SDK中个函数的应用更加灵便不便。 产品的二次开发的根本要求:JNPF二次开发为了让更多人理解二次开发,并更不便的理解JNPF的二次开发,上面将会简略的介绍对于JNPF二次开发的一些根底和纲要。 JNPF提供了目前市面上软件共性的一些需要性能 如:多租户账号治理、主数据管理、权限治理、组织架构治理、IM音讯服务、单点登录服务等,这些根底服务企业无需开发,间接应用。 对系统性能的定制开发,可利用JNPF提供的零代码设计器、报表设计器、门户设计器、流程设计器等个性化开发所需零碎。 JNPF六大二次开发利器低代码设计器 将已有代码的可视化模块拖放到工作流中以创立应用程序,无需编写反复的编码,能够将精力集中于应用程序中重要的10%局部。 零代码设计器 打消开发平台对代码编程的依赖,依据企业数据和业务管理需要,通过组件拖拽等可视化形式设计并实现页面内容,所见即所得。 大屏设计器 全程可视化编辑操作,自在布局页面,拖拽控件至页面中,针对不同的控件进行内容设 值和数据绑定,毋庸任何代码即可疾速搭建业余、酷炫的大屏。 报表设计器 后端工程师筹备好数据后,前端只需指定数据源,写好SQL语句,定义好报表款式和根本交互方式,报表引擎就能够实现接下来的数据出现工作了。 门户设计器 门户设计器提供了多样式的预约义门户格调,用户能够自在的将组件拖拽到画布上进行配置和布局,通过简略的拖动和设置,设计个性化的门户页面。 流程设计器 流程设计器集成了自在表单设计器和流程引擎,并反对线性流程、父子流程、同步分合流、异步分合流程,全副实现可视化设计,非常方便快捷。

November 10, 2020 · 1 min · jiezi

关于sql:sql-server-根据行号更新某列的数据可以根据其他列做筛选

执行如下存储过程: declare @scp_code varchar(50);declare @id INT;DECLARE cur CURSOR FOR --查找s_link 有反复的门路select cp_code from cp_sickGROUP BY cp_code, s_link HAVING count(s_link) > 1;OPEN cur fetch next from cur into @scp_codewhile(@@fetch_status=0)beginprint(@scp_code)set @id=0update cp_sick SET s_link=@id,@id=@id+1 WHERE cp_code = @scp_code;fetch next from cur into @scp_codeend close cur DEALLOCATE cur

November 2, 2020 · 1 min · jiezi

关于sql:esProc-的-SQL-应用方案

esProc 的 SQL 性能反对文件计算、性能优化等独特性能,本文将总结桌面 IDE、命令行等不同环境下 SQL 的用法,以及罕用文件格式、非凡分隔符等多种利用计划,详情点击esProc 的 SQL 利用计划 因为反对文件计算、性能优化等独特性能,esProc的SQL性能深受大家青睐,为了大家更不便地应用,上面将总结SQL的各类利用计划。 根本用法SQL的根本数据源为文本文件和Excel。文本文件有两种常见的分隔符,制表符分隔的文件个别以txt为扩展名,逗号分隔的文件通常以csv为扩展名,esProc可凭借扩展名自动识别。Excel有两种不同的版本,格局较旧的xls文件和格局较新的xlsx文件,esProc同样可凭扩展名自动识别。 SQL的根本数据格式为带列名的二维表,比方上面的sales.txt: SQL的根本运行环境为网格脚本,在windows/linux下均可应用。在网格脚本中,能够编写/保护/执行多个SQL,且点击不同的单元格可间接在左边查看计算结果。上面是一些例子: 具体SQL写法不是本文重点,若感兴趣可参考 在文件上应用 SQL 查问的示例 在命令行执行SQL不方便使用图形环境时,能够在命令行执行SQL。Windows下应应用esprocx.exe命令,例如: esprocx.exe -r select * from Order.txt 须要留神的是,SQL在 IDE中必须应用前导符号$,而命令行中能够省略该符号。 Linux环境下应应用esprocx.sh 命令,例如: ./esprocx.sh -r select * from Order.txt 无列名的状况有些文件没有列名(列题目),则能够将SPL语句嵌入SQL,利用SPL的能力灵活处理列名。比方sOrderNT.txt局部数据如下: 按第2列查问时,SQL应写作: $select * from {file("sOrderNT.txt").import()} where _2='TAS' 从SQL中能够看到,数据无列名时,则以"下划线+序号"为默认列名,第2列的列名就用_2示意,其余列以此类推。{}内是SPL语言,其中import函数能够读取格局更简单的文件,具体用法参考http://doc.raqsoft.com/esproc... 为了更直观地应用列名,能够先改列名再计算。传统的SQL写法是用子查问改列名,下面的SQL可改为: 传统的子查问效率不高且浏览不便,应用SPL语句能够防止子查问,同时能够达到批改列名的目标: 非凡分隔符有些文件的分隔符不是常见的制表符或逗号,而是分号冒号等特殊符号,有时甚至用多个字符当分隔符,这种状况下应该用SPL语句中的import函数来指定分隔符。 比方sep.txt的分隔符是双线||,则能够用上面的SQL来读取: $select * from {file("sep.txt").import@t(;,"||")} 无换行符有些文件没有用回车换行辨别记录,而是用其余符号,这样的文件整体出现为一个大字符串。比方SOrderNL.txt的记录之间用|符号分隔: 这种状况要把文件读为字符串,将|替换成回车换行,再用import函数解析为二维表。 $select * from {replace(file("sOrderNL.txt").read(),"|","rn").import@t()} read函数可参考http://doc.raqsoft.com/esproc... 跳过空行有些文件存在空行,须要跳过能力应用。解决这种状况的个别思路是:在SQL中嵌入SPL语句,用SPL语句读入文件,查问出有用的数据行。 ...

October 23, 2020 · 1 min · jiezi

关于sql:SQL优化案例1隐式转换

MySQL是当下最风行的关系型数据库之一,互联网高速倒退的明天,MySQL数据库在电商、金融等诸多行业的生产零碎中被宽泛应用。 在理论的开发运维过程中,想必大家也经常会碰到慢SQL的困扰。一条性能不好的SQL,往往会带来过大的性能开销,进而引起整个操作系统资源的适度应用,甚至造成会话沉积,引发线上故障。而在SQL调优的场景中,一类比拟常见的问题,就是隐式类型转换。那什么是隐式转换呢? 在MySQL中,当操作符与不同类型的操作数一起应用时,会产生类型转换以使操作数兼容,此时则会产生隐式转换。呈现隐式转换,往往意味着SQL的执行效率将大幅升高。接下来笔者将联合几大常见场景,让大家理论领会什么是隐式转换,以及如何去应答呈现隐式转换的状况,请浏览以下案例。 传递数据类型和字段类型不统一造成隐式转换一类比拟经典的场景就是传递数据类型和字段类型不统一造成的隐式转换,这种场景也是咱们平时最常遇到的。具体能够看下上面这个例子: 1) 待优化场景 SQL及执行打算如下: select * from dt_t1 where emp_no = 41680; 该表索引如下: key idx_empno (`emp_no`)2)场景解析 从执行打算中Type局部:ALL,全表扫描,而没有走idx_empno索引, 个别这种状况可能传递的数据类型和理论的字段类型不统一,那么咱们来看下具体的表构造。 root@localhost mysql.sock 5.7.28-log :[employees] 14:48:10>desc employees;+------------+---------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+------------+---------------+------+-----+---------+-------+| emp_no | varchar(14) | NO | MUL | NULL | || birth_date | date | NO | | NULL | || first_name | varchar(14) | NO | | NULL | || last_name | varchar(16) | NO | | NULL | || gender | enum('M','F') | NO | | NULL | || hire_date | date | NO | | NULL | |+------------+---------------+------+-----+---------+-------+6 rows in set (0.00 sec)表构造中看到该字段类型为varchar 类型,传递字段为整型,造成隐式转换不能走索引。 ...

October 22, 2020 · 4 min · jiezi

关于sql:GoVue实现的高颜值SQL审核平台兼容99SQL语法

SQL 审核,实际上也是对 SQL 的标准化治理。而人工审核时代,针对数据库标准其实是很难落地的,标准越多,DBA越累,开发也越累。 大多数状况下,人工审核 SQL 的代价太高,在标准落地和监督束缚方面难以把控。很多状况下,性能隐患会给线上环境带来极大的影响,可能是影响业务应用,也可能间接关系数据。 明天 Gitee 举荐的这款开源好物,就是一款 Web 端可视化的 SQL 审核平台,一起来看看吧。 项目名称: Yearning 我的项目作者: HenryYee 开源许可协定: AGPL-3.0 我的项目地址:https://gitee.com/cookieYe/Yearning 我的项目简介Yearning 是一款可满足大部分公司 SQL 审核需要的 Web 端可视化 SQL 审核平台。在实现惯例的 SQL 审核性能外还增加了诸如数据查问等一系列便捷的性能。 我的项目性能SQL 查问 查问工单导出主动补全,智能提醒查问语句审计SQL 审核 流程化工单SQL 语句检测与执行SQL 回滚历史审核记录自定义审核层级推送 E-mail 工单推送钉钉 webhook 机器人工单推送用户权限及治理 角色划分基于用户的细粒度权限注册其余 todoListLDAP 登录动静审核规定配置AutoTask 主动执行我的项目截图 登录页 首页 审核 SQL 语法高亮及主动补全 查问 细粒度的权限调配 我的工单 语法反对Yearning 目前兼容99%的 Mysql 规范 SQL 语法。 但因为审核逻辑等因素的限度,对一些 SQL 语句并不能保障失去正确的反馈 已知不反对的语句类型有: ...

October 22, 2020 · 1 min · jiezi

关于sql:CQ-Tech-解析-CloudQuery-审计分析功能

什么是数据库审计 数据库审计是对数据库拜访行为进行监管,记录下数据库的所有拜访和操作行为,例如拜访数据的用户(IP、账号、工夫)、操作(增、删、改、查)、对象(表、字段)等。它通过对用户拜访数据库行为的记录、剖析,帮忙预先生成合规报告、追根溯源,进步数据资产平安。 为什么肯定要进行审计剖析 当初咱们进入一个公司,凡是工作内容波及到数据,必然会被要求签订窃密协定,由此可见数据对于企业的重要性,能够说是企业的外围资产,对于互联网企业来说更是命根子所在。 在企业外部,DBA 、外包/运维人员、业务人员都有拜访数据库的需要,而数据库存储了各种账号权限,万一被歹意应用,后果严重。并且对于数据库应用,很难制订细化的操作规程,同一账号多人应用、多地登录、非业务工夫拜访,各种不标准行为的产生,都有可能成为安全漏洞,最终产生数据泄露。 而数据库管理工具审计剖析性能的价值就在于此,为数据库安全事件追责、定责提供根据,与此同时也能够对数据库的攻打和非法操作等行为起到震慑作用。且数据库本身携带的审计性能会拖慢数据库的性能,而通过数据库管理工具则能够无效防止这个问题。 以后 CloudQuery 审计剖析性能 目前 CloudQuery 的审计剖析性能次要蕴含审计剖析图和审计明细,提供数据库多方面的内容审计、行为审计、流量审计和其余审计项。 1.审计剖析图 审计剖析图次要对行为进行审计,展现各种数据操作行为的执行次数和执行占比。如语句执行次数,语句执行谬误次数。执行占比则蕴含了查问、更新、新增及删除操作行为的占比。 2.审计明细 审计明细记录了所有用户在平台上的所有操作行为。包含操作在哪个数据源中执行、数据源版本、执行语句明细、执行工夫、耗时多久等具体信息内容。用户还能够抉择指定用户,查问该用户在指定时间段内的操作行为明细。 CloudQuery 审计剖析性能前期欠缺打算 目前 CloudQuery 的版本为 v 1.1.1,审计剖析性能还较为简单,但 CloudQuery 布局了欠缺的审计剖析性能,将在每次版本更新中逐渐减少。 1. 用户行为排行榜。通过用户排行榜可对用户活跃度进行排名,理解每个用户的高频行为,可能疾速定位到异样行为用户。 2. 异样行为检测,多样报警形式。CloudQuery 将对数据库异样拜访、登录、查问进行检测告警,多路径发送告诉:短信、邮件、站内信,用户可依据本身需要进行抉择。 3. 审计规定设置。CloudQuery 将减少敏感信息审计、危险流动审计,实现更细粒度的审计,以满足多样审计需要。 4. 精确定位,多种审计报表输入。审计性能的次要作用就是在产生安全事件时,可能有确凿的“证据”。精确定位不仅审计到用户账号,还可跟踪到客户 IP,且 CloudQuery 将提供多种审计报表:固定报表、图表、自定义报表等,用户可依据本身需要输入不同格局的报告以获取确凿“证据”。 5. 安全事件回放。在产生数据库安全事件后,CloudQuery 可实现对该事件的残缺细节回放。 6. 基于利用的审计剖析性能。除了平台惯例层面的审计剖析,CloudQuery 还可联合利用受权性能,基于利用,对利用上的各类用户行为进行审计剖析。 欢送关注公号:Cloud Query产品官网:http://cloudquery.club/

October 22, 2020 · 1 min · jiezi

关于sql:8-种常见-SQL-错误用法

起源:yq.aliyun.com/articles/72501 1、LIMIT 语句分页查问是最罕用的场景之一,但也通常也是最容易出问题的中央。比方对于上面简略的语句,个别 DBA 想到的方法是在 type, name, create_time 字段上加组合索引。这样条件排序都能无效的利用到索引,性能迅速晋升。 SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10;好吧,可能90%以上的 DBA 解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员依然会埋怨:我只取10条记录为什么还是慢? 要晓得数据库也并不知道第1000000条记录从什么中央开始,即便有索引也须要从头计算一次。呈现这种性能问题,少数情景下是程序员偷懒了。 在前端数据浏览翻页,或者大数据分批导出等场景下,是能够将上一页的最大值当成参数作为查问条件的。SQL 从新设计如下: SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10;在新设计下查问工夫根本固定,不会随着数据量的增长而发生变化。 2、隐式转换SQL语句中查问变量和字段定义类型不匹配是另一个常见的谬误。比方上面的语句: mysql> explain extended SELECT * > FROM my_balance b > WHERE b.bpn = 14000000123 > AND b.isverified IS NULL ;mysql> show warnings;| Warning | 1739 | Cannot use ref access on index 'bpn' due to type or collation conversion on field 'bpn'其中字段 bpn 的定义为 varchar(20),MySQL 的策略是将字符串转换为数字之后再比拟。函数作用于表字段,索引生效。 ...

October 22, 2020 · 7 min · jiezi

关于sql:PostgreSQL-libpq-客户端接口一

前言 Libpq 是为 C 语言开发这提供的对于 PostgreSQL 的接口。Libpq 由相干库函数组成,能够容许客户端程序通过将查问传递给 PostgreSQL 后盾服务器并接管这些查问返回的后果。同时,libpq 也是其它几个 PostgreSQL 利用程序接口的根底引擎,包含 C++,Perl,Python,Tcl和ECPGC编程的嵌入式 SQL。 连贯字符串 以下函数解决 PostgreSQL 后盾服务器的连贯。一个应用程序同时能够有多个关上的连贯,这也是 PostgreSQL 服务器可能同时拜访多个库的起因。每一个连贯都通过 PGconn 对象示意,该对象能够从函数 PQconnectdb,PQconnectdbParams 中或者 PQsetdbLogin 获取信息。须要留神的是,这些对象通常返回一个非空的对象指针。除非因为内存太小导致无奈调配 PGconn 对象。PQstatus 函数用来查看在执行查问前连贯是否胜利的状态。 函数介绍如下:PQconnectdbParams 该参数用来创立连贯到数据库服务器的新的连贯。如下: PGconn *PQconnectdbParams(const char * const *keywords, const char * const *values, int expand_dbname); 该函数应用传入的两个 NULL 终止的数组中关上一个新的连贯,首先,keywords 用来定义一个字符串数组,每一个都是一个关键字。其次,values,为每个关键字给定一个值。以后可辨认的关键字有 host、hostaddr、port、dbname、user、password、passfile、connect_timeout、client_encoding、options、application_name、fallback_application_name,keepalives 等信息。罕用的通常有 host、hostaddr、port、dbname、user、password 这五个。 当 expand_dbname 是非零时,该 dbname 关键字的值能够容许作为一个连贯字符串。而对于 PGconn 的定义,PGconn 属于封装到后端的连贯,应用程序不须要关怀该构造的定义,此处给出该构造的定义: typedef struct pg_conn PGconn; 能够看出 PGconn 的数据类型为 pg_conn,而在 pg_conn 中自定义的数据类型的构造为如下(此处只形容了罕用的几个): ...

October 21, 2020 · 3 min · jiezi

关于sql:实战用puppeteer-和puppeteercluster-获取某站所有有用链接

puppeteer谷歌推出的用于操作无头浏览器的nodeJs框架,提供下层API用于间接操作浏览器。该框架实用于爬取web2.0页面,同时对web1.0的支持率也比拟高,代码编写也很简略。puppeteer中文文档 Puppeteer-cluster池化思维作用于puppeteer的产物,工作散发与调度,让nodejs能够利用自身去实现整个爬虫。在应用该组件之前,我应用java来写爬虫的调度算法,而后用eureka来调用nodejs的页面抓取模块。puppeteer-cluster我的项目地址 首先须要获取整站的所有页面获取所有页面,并确定当url是pan.baidu.com的时候过滤掉曾经生效的链接 const {Cluster} = require('puppeteer-cluster');const launchOptions = { headless: true, ignoreHTTPSErrors: true, // 疏忽证书谬误 waitUntil: 'networkidle2', defaultViewport: { width: 1920, height: 1080 }, args: [ '--disable-gpu', '--disable-dev-shm-usage', '--disable-web-security', '--disable-xss-auditor', // 敞开 XSS Auditor '--no-zygote', '--no-sandbox', '--disable-setuid-sandbox', '--allow-running-insecure-content', // 容许不平安内容 '--disable-webgl', '--disable-popup-blocking', //'--proxy-server=http://127.0.0.1:8080' // 配置代理 ], executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',};const clusterLanuchOptions = { concurrency: Cluster.CONCURRENCY_PAGE, // 单Chrome多tab模式 maxConcurrency: 20, // 并发的workers数 retryLimit: 2, // 重试次数 skipDuplicateUrls: true, // 不爬反复的url monitor: true, // 显示性能耗费 puppeteerOptions: launchOptions,};(async () => { const cluster = await Cluster.launch(clusterLanuchOptions); const cluster2 = await Cluster.launch(clusterLanuchOptions2); await cluster2.task(async ({page, data: url}) => { let urlTrue = url.split(' ')[0]; await page.goto(urlTrue); await page.waitForSelector('html'); let title = await page.title(); let x = "D:\\workspace\\node\\check\\bbs\\controllers\\pantrue.txt"; if (title.indexOf('不存在') === -1) { let value = ''; if (title.indexOf('分享无限度')) { value = urlTrue + ' ' + title + '\n'; } else { value = url.split(' ')[1].substr(0, 20) + ' ' + url.split(' ')[2] + ' ' + urlTrue + ' ' + title + '\n'; } fs.writeFile(x, value, {flag: 'a'}, function (err) { if (err !== null) { console.log(err); } }); } }); await cluster.task(async ({page, data: url}) => { await page.goto(url); await page.waitForSelector('html'); let title = await page.title(); await page.content(); let x = "D:\\workspace\\node\\check\\bbs\\controllers\\pan.txt"; let y = "D:\\workspace\\node\\check\\bbs\\controllers\\outDomain.txt"; let yuanDomain = urllib.parse(urlTrue); let newDomain = urllib.parse(url); if (yuanDomain.hostname !== newDomain.hostname) { if (!outUrlSet.has(newDomain.hostname)) { fs.writeFile(y, url + ' ' + title + '\n', { flag: 'a' }, function (err) { if (err) { console.error(err); } }); outUrlSet.add(newDomain.hostname); } } else { let links = await page.$$eval('[src],[href],[action],[data-url],[longDesc],[lowsrc]', get_src_and_href_links); let res = await parseLinks(links, url); console.log({links: links.length}, {res: res.length}); for (let i = 0; i < res.length; i++) { let link = res[i]; if (link !== undefined && link.indexOf("pan.baidu.com") !== -1) { // todo 存起来 if (!panSet.has(link)) { fs.writeFile(x, link + ' ' + title + ' ' + url + '\n', { flag: 'a' }, function (err) { if (err) { console.error(err); } }); cluster2.queue(link + ' ' + title + ' ' + url); panSet.add(link); } } else { cluster.queue(link); } } } }); cluster.queue('http://www.xxxxx.com/'); await cluster.idle(); await cluster.close();})();async function parseLinks(links, url) { let result = []; // 解决url return result;}function get_src_and_href_links(nodes) { let result = []; // 获取节点中的所有 return result;}剖析页面,获取更深的信息失去的盘链接,有些是无限度的,有些是须要tiquma的,而tiquma该如何获取呢?往往原来的页面外面会有,这个时候咱们就须要剖析原来的页面了。在这个网站中,提取码简直都放在strong标签中,那咱们只好应用办法失去页面中的strong标签在puppeteer中能够应用page.$$eval()办法来获取strong节点汇合,而后应用treeWalker遍历整个节点失去咱们想要的货色即可。 ...

October 20, 2020 · 3 min · jiezi

关于sql:搜索引擎新架构与SQL不得不说的故事

特邀嘉宾:罗涛--阿里巴巴团体资深技术专家视频地址:https://yunqi.aliyun.com/2020/session54?liveId=44647 阿里巴巴搜索引擎HA3架构1.HA3架构分为在线和离线两局部• 在线是一个传统的2层服务架构,别离叫做QRS和search。QRS负责承受用户申请,做一些简略解决之后把申请发给上面的search节点,search节点负责加载索引并实现检索,最终由QRS会集各个search节点的后果并返回给用户。• 离线局部分为两个环节,一个环节是数据的预处理,其外围的工作是把业务和算法维度的数据加工成对索引敌对的大宽表,另一个环节是索引的构建,它的次要挑战是既要反对大规模的索引更新,也要保障索引是实时性。2.HA3的特点次要有三个:• 第一个是高性能的服务架构;• 第二个是丰盛的索引能力;• 第三个是金字塔形的算法工作框架这些特点是HA3在阿里巴巴团体内风靡十分无利的武器,但随着这几年业务的倒退,这一架构逐步成了咱们再往前进一步的拦路虎。 搜索引擎HA3外围挑战具体体现在2个方面,一个是深度学习的浸透,另一个是数据维度的收缩。1. 深度学习,它的应用范畴,从晚期的精排,逐渐扩散到了粗排、检索,比方向量索引的召回。深度学习的引入自身也会带来2个问题:一个是深度模型的自身的网络结构通常比较复杂,对执行流程和模型大小都有十分高的要求,传统的pipeline工作模式是十分难以无效反对的;另外一个问题是模型和特色数据的实时更新也对索引的能力提出了很大的挑战,在线上百亿级别的更新是一个常态。 2. 数据维度的收缩,以电商畛域为例,原来思考的维度次要是买家、卖家这两个维度,当初得思考地位、配送、门店、履约等等,同样是配送,有3公里5公里送的,有同城的,还有跨城的,像这样的例子还有很多。而搜索引擎离线的工作流程会把各个维度的数据join成一张大宽表,这会导致数据更新的规模成笛卡尔积的模式开展,在新场景下,无论是更新的量级还是时效性上都很难满足 搜寻传统解决方案就是依据业务数据维度的特点,把引擎分拆成过多个不同的实例,而后在业务层通过查问不同的引擎实例来失去后果。比如说饿了么的搜索引擎就有门店、商品等维度的数据,为了解决门店状态的实时变动对索引的冲击,能够部署两个搜索引擎实例,一个用来搜寻适合的门店,另外一个用来搜寻适合的商品,由业务方先查门店引擎再查商品引擎来实现。但这个计划有一个显著的毛病,那就是合乎用户用意的门店十分多的时候,门店的数据须要从门店引擎序列化到业务方再发送给商品引擎,这里序列化的开销十分大,往往须要对返回的门店数目做肯定截断,而截断的门店中很可能有更匹配用户用意的,这样对业务成果也会有比拟大的影响。特地热门的商区,不论是对用户还是卖家,都是十分大的损失。 HA3 SQL新的解决方案以数据库SQL的执行形式来重塑搜寻,外围要点有3条。**1.将原来大宽表的模式扩大成反对多表,每个表的索引加载、更新、切换做到互相独立,把原来须要离线join的操作变成在线查问时join。 **2.彻底摈弃原有的pipeline的工作模式,以DAG图化的形式来执行,并将搜寻的性能形象成一个个独立的算子,与深度学习的执行引擎进行对立。3.以SQL的形式来表白图化的查问流程,这样不光用户应用起来简略,也能够复用SQL生态的一些根底性能。举个例子,电商个性化搜寻技术外面,把商品、个性化举荐、深度模型等信息别离放到不同的表中,配合上灵便的索引格局,比方倒排索引、正排索引、KV索引等等,加上执行引擎自身能够反对并行、异步、编译优化等技术,不论是内存还是CPU都能失去无效利用,很轻松地就能解决业务上的各种问题。 搜索引擎HA3新的架构次要分为三层:• 最底下一层是searchRuntime的Framework,其外围职责次要有索引治理和服务调度,其中索引局部次要是加载的策略和查问接口,如计算存储拆散的反对、实时索引构建的反对等等;服务调度次要解决的是过程的failover和服务的更新,即通常意义的面向终态的二层调度,次要的特点是以对立的形式做过程的重启、程序的更新、灰度的公布等等。• 两头这一层是DAG引擎层,其核心内容有两个,一个是执行引擎自身,另一个就是算子。这里的执行引擎次要有三局部的能力,包含单机内图的执行,分布式的通信和深度学习,通过算子间的互联,咱们可能很不便的把搜寻的查问流程和深度学习进行对接,实现深度学习在搜寻的各个阶段的浸透,如向量检索、粗排和精排。算子局部的形象是这轮架构形象最重要的一环,把原来面向过程式的开发变成了独立性能的开发,一方面要求算子自身的性能要尽可能内聚,另一方面算子级别的治理也更有利于性能的复用和公布。• 最下面一层是SQL查问层,外围的工作有两局部,一个是SQL解析,另外一个是查问优化。因为DAG的流程能够任意定制,如何让用户更不便地构建图、更不便的进行算子间的合作会是很要害的问题,简略、通用是个必须思考的,这也是咱们首选SQL的起因;另外一个起因是业界SQL的执行器,通常蕴含逻辑优化和物理优化两个环节,这个对一个简单的DAG的执行提供了十分好的形象,咱们也利用了这个机制来进行了很多粗疏的优化,包含图的变换、算子合并、编译优化等等。 实际案例1. 饿了么外卖搜寻场景的例子,假如用户在搜寻框外面输出了一个关键词"牛肉面",搜索引擎后盾的流程大体如下:通过用户的地位信息找到当初还在营业的、并且能卖牛肉面的门店,每个门店给出最匹配的商品,最初返回最合乎用户需要的门店与商品。在这里,门店营业状况如何、配送能力是否足够、对应的商品有没有卖完,这些数据都须要实时更新的,而在大规模的数据外面疾速找到匹配的信息,也波及到丰盛的索引技术,比方空间索引、倒排索引、向量索引等等,最初门店和商品的排序也要依赖深度模型的参加,用户的偏好、优惠信息、间隔都是很重要的因素。原有的搜寻流程是基于elasticsearch通过别离查问门店和商品维度的表来实现的,但会有查问后果截断和深度学习接入艰难的问题,而在HA3上这些问题都非常容易解决,迁徙到新架构后,不光业务的长尾问题隐没了,而且性能还晋升1倍,给后续算法的迭代留下了十分大的空间,这里性能的晋升次要来自于索引构造和查问优化上的一些工作。2.淘宝本地生存的服务其外围的诉求也是心愿在淘宝的搜寻外面引入本地服务的概念,如天猫超市和盒马的小时达的业务,通过将门店和商品维度的数据独自分拆,不光更新能力晋升了两个数量级,还复用了饿了么搜寻的很多性能。3.钉钉的钉盘搜寻业务上须要在传统的搜寻上反对钉盘文件的权限管制,因为文件和权限这两个维度数据的规模都十分大,而且更新比拟频繁,通过HA3SQL在线的实时本地join,非常低提早的解决了这个问题。4.外部监控零碎原来是基于开源技术druid构建的,但业务规模上来逐渐不能满足需要了,常常出现异常须要手动解决的状况,咱们在HA3的根底上扩大了时序数据索引,借助SQL并行执行的能力,latency有了显著降落,稳定性也失去了质的晋升。

October 12, 2020 · 1 min · jiezi

关于sql:SQL概述

数据库XX语言:DDL, DML, DQL, DCL 1 数据库1.1 连贯数据库命令行连贯 mysql -uroot -pupdate mysql.user set password = password('XXX') where user = 'root' and Host = 'localhost'; -- 批改用户明码flush privileges; -- 刷新权限-----------------------------------------------show tables;describe 表名; -- 显示表信息exit; -- 退出连贯1.2 操作数据库create database [if not exists] 数据库名 -- 创立drop database [if exists] 数据库名 -- 删除use 数据库名 -- 应用/切换 如果数据库名是关键词,则加上``show databases; -- 查看数据类型: 数值:整型:tinyint 1B,smallint 2B, int 4B, bigint 8B浮点型:float 4B, double 8B, decimal(字符串模式的浮点数,罕用于金融计算)字符串char 固定大小 0~255,varchar 可变 0~65535tinytext 微型文本 2^8 - 1text 文本串 2^16-1工夫日期date YYYY- MM- DDtime HH: mm: ssdatetime YYYY- MM - DD HH: mm: sstimestamp 工夫戳,1970.1.1到当初的毫秒数year 年份示意NULL每个表都必须存在以下五个字段: ...

October 11, 2020 · 6 min · jiezi

关于sql:PostgreSQL-中的shared-buffer

前言 通常,在任何数据库系统中,都须要面临海量用户对数数据库进行读写操作。而对数据库中的数据最间接的读写操作是读取数据库中对应的数据目录中的文件。这些文件外面蕴含了数据库的任何对象,如表、视图、索引、序列、函数等。PostgreSQL 也不例外,在对数据库初始化时,咱们可能看到由PostgreSQL 服务端工具 initdb 创立的相干表和目录,但在一个不具备弹性伸缩的数据库系统中,海量用户对数据库的读写操作并不是很现实。因为对数据库的数据对象进行读写操作须要数据库系统查找相干文件,关上文件,而后通过相干的函数对这些对象进行锁定,编辑和开释锁。因而在数据库系统中为了可能进步并发解决并放慢数据处理过程,shared buffer的概念也利用而生。有了shared buffer ,后盾过程从用户接管到申请后将不会再间接去读取数据库对象文件和写入数据库对象文件,而是通过在 RAM 中的buffer 中解决数据,从而极大地提高了数据库性能。 一、shared buffer shared buffer 内存大小通过参数 shared_buffers 参数来进行设置。改参数之在PostgreSQL 中默认值为 128MB,初始化大小能够通过 initdb 来进行设置,然而不少于128KB。如果在对该参数不进行设置,那么该值的大小以块字节为单位,即设置为整数的字节大小。同时该参数变动后,须要重新启动数据库服务器。在数据库服务器上,如果RAM大小超过1GB,该值的大小通常为零碎RAM的25%。在进行读写频繁的数据库环境中,该参数能够调整到大于25%的值,但不倡议将该值设置太高,如果设置太高,须要同时减少max_wal_size 参数的大小,否则会造成零碎性能降落。 该原理并不是通过内存 chunk 克隆的形式来进步零碎响应工夫,而是 OS 中的 RAM 将大量数据驻留在其中,以保证数据随时可用来进步零碎响应工夫。当然,除了缓存之外,还有磁盘缓存也能够进步数据处理性能,但原理都是通过缩小不必要的物理 I/O 来进步性能。 在一个惯例的简略查问中,零碎第一步将会查看在 buffer cache 中是否有数据可用,如果数据库 buffer cache 中无可用缓存数据,用户申请将会从 OS 缓存中获取须要的文件或者块。操作系统缓存很可能曾经领有须要查找的数据块或者文件并将其驻留在数据库缓冲中,在这种状况下,数据库系统将会避免出现物理I/O申请,这在数据库中也叫做逻辑读,会耗费肯定的 CPU 资源。如果须要查找的数据都不在这两个缓存中或者其它缓存中,那么用户读取数据都须要从磁盘去读取,而第一次数据读取必然要通过读取物理文件来查找。 二、buffer cache 查看 PostgreSQL 提供了一个扩大能够用来查看 buffer cache。以下将介绍buffer cache 扩大模块。 2.1 创立数据库 postgres=# CREATE DATABASE mydb1;CREATE DATABASEpostgres=# CREATE DATABASE mydb2;CREATE DATABASE2.2 buffer cache 扩大模版 ...

October 10, 2020 · 4 min · jiezi

关于sql:SQL面试通关秘籍面试知识点技巧分享

SQL是用于数据分析和数据处理的最重要的编程语言之一,因而与数据迷信相干的工作(例如数据分析师、数据科学家和数据工程师)在面试时总会问到对于 SQL 的问题。 SQL面试问题旨在评估应聘者的技术和解决问题的能力。因而对于应聘者来说,关键在于不仅要依据样本数据编写出正确的查问,而且还要像看待事实数据集一样思考各种场景和边缘状况。 在这篇文章中,我将介绍 SQL 面试问题中常见的模式,并提供一些在 SQL 查问中奇妙解决它们的技巧。 1 问问题 要搞定一场 SQL 面试,最重要的是尽量多问问题,获取对于给定工作和数据样本的所有细节。充沛了解需要后,接下来你就能够节俭很多迭代问题的工夫,并且能很好地解决边缘状况。 我留神到许多候选人常常还没齐全了解SQL问题或数据集,就间接开始编写解决方案了。之后,等我指出他们解决方案中存在的问题后,他们只好重复批改查问。最初,他们在迭代中节约了很多面试工夫,甚至可能到最初都没有找到正确的解决方案。 我倡议大家在加入SQL面试时,就当成是本人在和业务搭档共事。所以在你提供解决方案之前,应该要针对数据申请理解分明所有的需要。 举例:查找薪水最高的前 3 名员工。 样本employee_salary表 这里你应该要求面试官说分明“前三名”具体是什么意思。我应该在后果中包含 3 名员工吗?你要我怎么解决关系?此外,请仔细检查样本员工数据。salary 字段的数据类型是什么?在计算之前是否须要革除数据?2 选哪一个JOIN 在SQL中,JOIN 通常用来合并来自多个表的信息。 有四种不同类型的 JOIN,但在大多数状况下,咱们只应用INNER、LEFT和FULLJOIN,因为 RIGHTJOIN并不是很直观,还能够应用 LEFTJOIN 很简略地重写。在 SQL 面试中,须要根据给定问题的特定要求抉择你要应用的正确JOIN。 举例:查找每个学生加入的课程总数。(提供学生 id、姓名和选课的数量。) 样本student和class_history表 你可能曾经留神到了,并非所有呈现在 class_history 表中的学生都呈现在了 student 表中,这可能是因为这些学生曾经毕业了。(这在事务数据库中实际上是十分典型的状况,因为不再沉闷的记录往往会被删除。) 依据面试官是否心愿后果中蕴含毕业生,咱们须要应用LEFT JOIN或 INNER JOIN来组合两个表: WITH class_count AS (    SELECT student_id, COUNT(*) AS num_of_class    FROM class_history    GROUP BY student_id)SELECT     c.student_id,    s.student_name,    c.num_of_classFROM class_count c-- CASE 1: include only active studentsJOIN student s ON c.student_id = s.student_id-- CASE 2: include all students-- LEFT JOIN student s ON c.student_id = s.student_id3 ...

October 5, 2020 · 2 min · jiezi

关于sql:Java开发岗面试题基础篇2021最新版

大家好,欢送拜访小站,本文对Java开发工程师面试中呈现频率较高的问题做了总结,因自己程度无限,文章中若呈现谬误欢送斧正。 为不便大家记忆,文章只给出问题,如果须要查看答案请点击这里(查看残缺答案),须要下载PDF版本请在公众号【C you again】回复“JavaPDF”,你也能够点击这里微信扫描二维码关注!Java是一种什么语言?JDK、JRE、JVM三者的区别?Java1.5之后的三大版本?Java跨平台及其原理?Java语言的特点?什么是字节码,字节码的益处?Java和C++的区别?Java的三大个性?Java中的根本类型和援用类型及其区别?Java中的数组有没有length()办法?Java中的String有没有length()办法?JavaScript中如何获取字符串长度?switch(expr),expr反对哪些数据类型?int和Integer有什么区别?计算2^3效率最高的办法是?在Math.round(temp)中,参数temp=-11时后果为?参数temp=11时后果为?float f=3.4;是否正确?short s1=1; s1=s1+1;有错吗?short s1=1;s1+=1;有错吗?Java中的正文?Java中的拜访修饰符?Java中重写与重载的区别?Java有没有goto?this关键字的用法?super关键字的用法?Java的final关键字?break,continue,return的区别?在Java中,如何跳出多重嵌套循环?如何了解hashCode与equals?抽象类和接口的区别是什么?什么是接口?动态变量与非动态变量的区别?值传递和援用传递的区别是什么?什么是反射?Java中取得反射的三种形式?String类中罕用的办法?String中的==和equals的区别?Java中的String,StringBuilder,StringBuffer三者的区别?Java中final、finally和finalize的区别?try{}里有一个return语句,紧跟在这个try后的finally{}里的code会不会被执行?什么时候被执行?Java里可不可以有多继承?HashMap 和 Hashtable 的区别?Map 汇合有哪些实现类,别离具备什么特色?38、解决 hashmap 线程不平安问题?39、Hashmap 的底层实现原理?hash 碰撞怎么产生,怎么解决?HashMap 为什么须要扩容?如何遍历 Map 汇合?ArrayList 与 LinkedList 区别?Java中的ArrayList的初始容量和容量调配?如何应用的 List 汇合来保障线程平安?IO 和 NIO 的区别?在 Java 中要想实现多线程代码有三种伎俩?简述线程,程序、过程的基本概念以及他们之间关系?什么是多线程?为什么程序的多线程性能是必要的?多线程与多任务的差别是什么?线程的状态?Thread 类中的 start() 和 run() 办法有什么区别?Java 中 notify 和 notifyAll 有什么区别?Java 多线程中调用 wait() 和 sleep()办法有什么不同?什么是线程平安Java中的 volatile 变量是什么?实现线程同步有三种形式?Java中的锁有几种形式?线程间通信的几种实现形式?synchronized 和 Lock 的区别和利用场景?为什么要用线程池?如何创立线程池?java中的异样体系?什么是异样?分那几种?特点是什么?try 能够独自应用吗?以下 try-finally 能够失常运行吗?try { int i = 10 / 0;} finally { System.out.println("last");}Exception 和 Error 有什么区别?throw 和 throws 的区别?NoClassDefFoundError 和 ClassNoFoundException 有什么区别?应用 try-catch 为什么比拟消耗性能?为什么 finally 总能被执行?说出 5 个常见的异样?常见的 OOM 起因有哪些?继续更新中。。。。。。。。

October 3, 2020 · 1 min · jiezi

关于sql:sql

mysql 谬误解决[root@aliyun ~]# $sudo systemctl status mysqld● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since 二 2020-09-29 23:51:24 CST; 7s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 9882 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE) Process: 9859 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 9882 (code=exited, status=1/FAILURE) Status: "Server startup in progress"9月 29 23:51:23 aliyun systemd[1]: Starting MySQL Server...9月 29 23:51:24 aliyun systemd[1]: mysqld.service: main process exited, code=exited, status=1/FAILURE9月 29 23:51:24 aliyun systemd[1]: Failed to start MySQL Server.9月 29 23:51:24 aliyun systemd[1]: Unit mysqld.service entered failed state.9月 29 23:51:24 aliyun systemd[1]: mysqld.service failed.执行命令 tail -n 50 /var/log/mysqld.log ...

October 2, 2020 · 3 min · jiezi

关于sql:sql练习150附答案

SQL练习1、表构造–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 老师编号 –3.老师表 Teacher(t_id,t_name) –老师编号,老师姓名 –4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程编号,分数2、测试数据-- 建表-- 学生表CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s_birth` VARCHAR(20) NOT NULL DEFAULT '', `s_sex` VARCHAR(10) NOT NULL DEFAULT '', PRIMARY KEY(`s_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 课程表CREATE TABLE `Course`( `c_id` VARCHAR(20), `c_name` VARCHAR(20) NOT NULL DEFAULT '', `t_id` VARCHAR(20) NOT NULL, PRIMARY KEY(`c_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 老师表CREATE TABLE `Teacher`( `t_id` VARCHAR(20), `t_name` VARCHAR(20) NOT NULL DEFAULT '', PRIMARY KEY(`t_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 成绩表CREATE TABLE `Score`( `s_id` VARCHAR(20), `c_id` VARCHAR(20), `s_score` INT(3), PRIMARY KEY(`s_id`,`c_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入学生表测试数据insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into Student values('02' , '钱电' , '1990-12-21' , '男');insert into Student values('03' , '孙风' , '1990-05-20' , '男');insert into Student values('04' , '李云' , '1990-08-06' , '男');insert into Student values('05' , '周梅' , '1991-12-01' , '女');insert into Student values('06' , '吴兰' , '1992-03-01' , '女');insert into Student values('07' , '郑竹' , '1989-07-01' , '女');insert into Student values('08' , '王菊' , '1990-01-20' , '女');-- 课程表测试数据insert into Course values('01' , '语文' , '02');insert into Course values('02' , '数学' , '01');insert into Course values('03' , '英语' , '03');-- 老师表测试数据insert into Teacher values('01' , '张三');insert into Teacher values('02' , '李四');insert into Teacher values('03' , '王五');-- 成绩表测试数据insert into Score values('01' , '01' , 80);insert into Score values('01' , '02' , 90);insert into Score values('01' , '03' , 99);insert into Score values('02' , '01' , 70);insert into Score values('02' , '02' , 60);insert into Score values('02' , '03' , 80);insert into Score values('03' , '01' , 80);insert into Score values('03' , '02' , 80);insert into Score values('03' , '03' , 80);insert into Score values('04' , '01' , 50);insert into Score values('04' , '02' , 30);insert into Score values('04' , '03' , 20);insert into Score values('05' , '01' , 76);insert into Score values('05' , '02' , 87);insert into Score values('06' , '01' , 31);insert into Score values('06' , '03' , 34);insert into Score values('07' , '02' , 89);insert into Score values('07' , '03' , 98);3、测试题-- 1、查问"01"课程比"02"课程问题高的学生的信息及课程分数 select a.* ,b.s_score as 01_score,c.s_score as 02_score from Student a join Score b on a.s_id=b.s_id and b.c_id='01' left join Score c on a.s_id=c.s_id and c.c_id='02' or c.c_id = NULL where b.s_score>c.s_score -- 2、查问"01"课程比"02"课程问题低的学生的信息及课程分数 select a.* ,b.s_score as 01_score,c.s_score as 02_score from student a left join score b on a.s_id=b.s_id and b.c_id='01' or b.c_id=NULL join score c on a.s_id=c.s_id and c.c_id='02' where b.s_score<c.s_score-- 3、查问均匀问题大于等于60分的同学的学生编号和学生姓名和均匀问题select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score from student b join score a on b.s_id = a.s_id GROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)>=60; -- 4、查问均匀问题小于60分的同学的学生编号和学生姓名和均匀问题 -- (包含有问题的和无问题的) select b.s_id,b.s_name,ROUND(AVG(a.s_score),2) as avg_score from student b left join score a on b.s_id = a.s_id GROUP BY b.s_id,b.s_name HAVING ROUND(AVG(a.s_score),2)<60 unionselect a.s_id,a.s_name,0 as avg_score from student a where a.s_id not in ( select distinct s_id from score);-- 5、查问所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩select a.s_id,a.s_name,count(b.c_id) as sum_course,sum(b.s_score) as sum_score from student a left join score b on a.s_id=b.s_id GROUP BY a.s_id,a.s_name;-- 6、查问"李"姓老师的数量 select count(t_id) from teacher where t_name like '李%';-- 7、查问学过"张三"老师授课的同学的信息 select a.* from student a join score b on a.s_id=b.s_id where b.c_id in( select c_id from course where t_id =( select t_id from teacher where t_name = '张三'));-- 8、查问没学过"张三"老师授课的同学的信息 select * from student c where c.s_id not in( select a.s_id from student a join score b on a.s_id=b.s_id where b.c_id in( select c_id from course where t_id =( select t_id from teacher where t_name = '张三')));-- 9、查问学过编号为"01"并且也学过编号为"02"的课程的同学的信息 select a.* from student a,score b,score c where a.s_id = b.s_id and a.s_id = c.s_id and b.c_id='01' and c.c_id='02'; -- 10、查问学过编号为"01"然而没有学过编号为"02"的课程的同学的信息select a.* from student a where a.s_id in (select s_id from score where c_id='01' ) and a.s_id not in(select s_id from score where c_id='02')-- 11、查问没有学全所有课程的同学的信息 select s.* from student s where s.s_id in( select s_id from score where s_id not in( select a.s_id from score a join score b on a.s_id = b.s_id and b.c_id='02' join score c on a.s_id = c.s_id and c.c_id='03' where a.c_id='01'))-- 12、查问至多有一门课与学号为"01"的同学所学雷同的同学的信息 select * from student where s_id in( select distinct a.s_id from score a where a.c_id in(select a.c_id from score a where a.s_id='01') );-- 13、查问和"01"号的同学学习的课程完全相同的其他同学的信息 select a.* from student a where a.s_id in( select distinct s_id from score where s_id!='01' and c_id in(select c_id from score where s_id='01') group by s_id having count(1)=(select count(1) from score where s_id='01'));-- 14、查问没学过"张三"老师讲授的任一门课程的学生姓名 select a.s_name from student a where a.s_id not in ( select s_id from score where c_id = (select c_id from course where t_id =( select t_id from teacher where t_name = '张三')) group by s_id);-- 15、查问两门及其以上不及格课程的同学的学号,姓名及其均匀问题 select a.s_id,a.s_name,ROUND(AVG(b.s_score)) from student a left join score b on a.s_id = b.s_id where a.s_id in( select s_id from score where s_score<60 GROUP BY s_id having count(1)>=2) GROUP BY a.s_id,a.s_name -- 16、检索"01"课程分数小于60,按分数降序排列的学生信息select a.*,b.c_id,b.s_score from student a,score b where a.s_id = b.s_id and b.c_id='01' and b.s_score<60 ORDER BY b.s_score DESC;-- 17、按均匀问题从高到低显示所有学生的所有课程的问题以及均匀问题select a.s_id,(select s_score from score where s_id=a.s_id and c_id='01') as 语文, (select s_score from score where s_id=a.s_id and c_id='02') as 数学, (select s_score from score where s_id=a.s_id and c_id='03') as 英语, round(avg(s_score),2) as 平均分 from score a GROUP BY a.s_id ORDER BY 平均分 DESC;-- 18.查问各科问题最高分、最低分和平均分:以如下模式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率-- 及格为>=60,中等为:70-80,低劣为:80-90,优良为:>=90select a.c_id,b.c_name,MAX(s_score),MIN(s_score),ROUND(AVG(s_score),2), ROUND(100*(SUM(case when a.s_score>=60 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 及格率, ROUND(100*(SUM(case when a.s_score>=70 and a.s_score<=80 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 中等率, ROUND(100*(SUM(case when a.s_score>=80 and a.s_score<=90 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 优良率, ROUND(100*(SUM(case when a.s_score>=90 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 优秀率 from score a left join course b on a.c_id = b.c_id GROUP BY a.c_id,b.c_name-- 19、按各科问题进行排序,并显示排名(实现不齐全)-- mysql没有rank函数 select a.s_id,a.c_id, @i:=@i +1 as i保留排名, @k:=(case when @score=a.s_score then @k else @i end) as rank不保留排名, @score:=a.s_score as score from ( select s_id,c_id,s_score from score WHERE c_id='01' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select @k:=0,@i:=0,@score:=0)s union select a.s_id,a.c_id, @i:=@i +1 as i, @k:=(case when @score=a.s_score then @k else @i end) as rank, @score:=a.s_score as score from ( select s_id,c_id,s_score from score WHERE c_id='02' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select @k:=0,@i:=0,@score:=0)s union select a.s_id,a.c_id, @i:=@i +1 as i, @k:=(case when @score=a.s_score then @k else @i end) as rank, @score:=a.s_score as score from ( select s_id,c_id,s_score from score WHERE c_id='03' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC)a,(select @k:=0,@i:=0,@score:=0)s-- 20、查问学生的总成绩并进行排名select a.s_id, @i:=@i+1 as i, @k:=(case when @score=a.sum_score then @k else @i end) as rank, @score:=a.sum_score as scorefrom (select s_id,SUM(s_score) as sum_score from score GROUP BY s_id ORDER BY sum_score DESC)a, (select @k:=0,@i:=0,@score:=0)s-- 21、查问不同老师所教不同课程平均分从高到低显示 select a.t_id,c.t_name,a.c_id,ROUND(avg(s_score),2) as avg_score from course a left join score b on a.c_id=b.c_id left join teacher c on a.t_id=c.t_id GROUP BY a.c_id,a.t_id,c.t_name ORDER BY avg_score DESC;-- 22、查问所有课程的问题第2名到第3名的学生信息及该课程问题 select d.*,c.排名,c.s_score,c.c_id from ( select a.s_id,a.s_score,a.c_id,@i:=@i+1 as 排名 from score a,(select @i:=0)s where a.c_id='01' )c left join student d on c.s_id=d.s_id where 排名 BETWEEN 2 AND 3 UNION select d.*,c.排名,c.s_score,c.c_id from ( select a.s_id,a.s_score,a.c_id,@j:=@j+1 as 排名 from score a,(select @j:=0)s where a.c_id='02' )c left join student d on c.s_id=d.s_id where 排名 BETWEEN 2 AND 3 UNION select d.*,c.排名,c.s_score,c.c_id from ( select a.s_id,a.s_score,a.c_id,@k:=@k+1 as 排名 from score a,(select @k:=0)s where a.c_id='03' )c left join student d on c.s_id=d.s_id where 排名 BETWEEN 2 AND 3;-- 23、统计各科问题各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比 select distinct f.c_name,a.c_id,b.`85-100`,b.百分比,c.`70-85`,c.百分比,d.`60-70`,d.百分比,e.`0-60`,e.百分比 from score a left join (select c_id,SUM(case when s_score >85 and s_score <=100 then 1 else 0 end) as `85-100`, ROUND(100*(SUM(case when s_score >85 and s_score <=100 then 1 else 0 end)/count(*)),2) as 百分比 from score GROUP BY c_id)b on a.c_id=b.c_id left join (select c_id,SUM(case when s_score >70 and s_score <=85 then 1 else 0 end) as `70-85`, ROUND(100*(SUM(case when s_score >70 and s_score <=85 then 1 else 0 end)/count(*)),2) as 百分比 from score GROUP BY c_id)c on a.c_id=c.c_id left join (select c_id,SUM(case when s_score >60 and s_score <=70 then 1 else 0 end) as `60-70`, ROUND(100*(SUM(case when s_score >60 and s_score <=70 then 1 else 0 end)/count(*)),2) as 百分比 from score GROUP BY c_id)d on a.c_id=d.c_id left join (select c_id,SUM(case when s_score >=0 and s_score <=60 then 1 else 0 end) as `0-60`, ROUND(100*(SUM(case when s_score >=0 and s_score <=60 then 1 else 0 end)/count(*)),2) as 百分比 from score GROUP BY c_id)e on a.c_id=e.c_id left join course f on a.c_id = f.c_id-- 24、查问学生均匀问题及其名次 select a.s_id, @i:=@i+1 as '不保留空缺排名', @k:=(case when @avg_score=a.avg_s then @k else @i end) as '保留空缺排名', @avg_score:=avg_s as '平均分' from (select s_id,ROUND(AVG(s_score),2) as avg_s from score GROUP BY s_id)a,(select @avg_score:=0,@i:=0,@k:=0)b;-- 25、查问各科问题前三名的记录 -- 1.选出b表比a表问题大的所有组 -- 2.选出比以后id问题大的 小于三个的 select a.s_id,a.c_id,a.s_score from score a left join score b on a.c_id = b.c_id and a.s_score<b.s_score group by a.s_id,a.c_id,a.s_score HAVING COUNT(b.s_id)<3 ORDER BY a.c_id,a.s_score DESC -- 26、查问每门课程被选修的学生数 select c_id,count(s_id) from score a GROUP BY c_id -- 27、查问出只有两门课程的全副学生的学号和姓名 select s_id,s_name from student where s_id in( select s_id from score GROUP BY s_id HAVING COUNT(c_id)=2); -- 28、查问男生、女生人数 select s_sex,COUNT(s_sex) as 人数 from student GROUP BY s_sex-- 29、查问名字中含有"风"字的学生信息 select * from student where s_name like '%风%';-- 30、查问同名同性学生名单,并统计同名人数 select a.s_name,a.s_sex,count(*) from student a JOIN student b on a.s_id !=b.s_id and a.s_name = b.s_name and a.s_sex = b.s_sex GROUP BY a.s_name,a.s_sex-- 31、查问1990年出世的学生名单 select s_name from student where s_birth like '1990%' -- 32、查问每门课程的均匀问题,后果按均匀问题降序排列,均匀问题雷同时,按课程编号升序排列 select c_id,ROUND(AVG(s_score),2) as avg_score from score GROUP BY c_id ORDER BY avg_score DESC,c_id ASC-- 33、查问均匀问题大于等于85的所有学生的学号、姓名和均匀问题 select a.s_id,b.s_name,ROUND(avg(a.s_score),2) as avg_score from score a left join student b on a.s_id=b.s_id GROUP BY s_id HAVING avg_score>=85-- 34、查问课程名称为"数学",且分数低于60的学生姓名和分数 select a.s_name,b.s_score from score b LEFT JOIN student a on a.s_id=b.s_id where b.c_id=( select c_id from course where c_name ='数学') and b.s_score<60 -- 35、查问所有学生的课程及分数状况; select a.s_id,a.s_name, SUM(case c.c_name when '语文' then b.s_score else 0 end) as '语文', SUM(case c.c_name when '数学' then b.s_score else 0 end) as '数学', SUM(case c.c_name when '英语' then b.s_score else 0 end) as '英语', SUM(b.s_score) as '总分' from student a left join score b on a.s_id = b.s_id left join course c on b.c_id = c.c_id GROUP BY a.s_id,a.s_name -- 36、查问任何一门课程问题在70分以上的姓名、课程名称和分数; select a.s_name,b.c_name,c.s_score from course b left join score c on b.c_id = c.c_id left join student a on a.s_id=c.s_id where c.s_score>=70 -- 37、查问不及格的课程 select a.s_id,a.c_id,b.c_name,a.s_score from score a left join course b on a.c_id = b.c_id where a.s_score<60 -- 38、查问课程编号为01且课程问题在80分以上的学生的学号和姓名; select a.s_id,b.s_name from score a LEFT JOIN student b on a.s_id = b.s_id where a.c_id = '01' and a.s_score>80-- 39、求每门课程的学生人数 select count(*) from score GROUP BY c_id; -- 40、查问选修"张三"老师所授课程的学生中,问题最高的学生信息及其问题 -- 查问老师id select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='张三' -- 查问最高分(可能有雷同分数) select MAX(s_score) from score where c_id='02' -- 查问信息 select a.*,b.s_score,b.c_id,c.c_name from Student a LEFT JOIN Score b on a.s_id = b.s_id LEFT JOIN Course c on b.c_id=c.c_id where b.c_id =(select c_id from Course c,Teacher d where c.t_id=d.t_id and d.t_name='张三') and b.s_score in (select MAX(s_score) from Score where c_id=(select c_id from Course c,Teacher d where c.t_id=d.t_id and d.t_name='张三'))-- 41、查问不同课程问题雷同的学生的学生编号、课程编号、学生问题 select DISTINCT b.s_id,b.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score-- 42、查问每门功问题最好的前两名 -- 牛逼的写法 select a.s_id,a.c_id,a.s_score from Score a where (select COUNT(1) from Score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2 ORDER BY a.c_id-- 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输入课程号和选修人数,查问后果按人数降序排列,若人数雷同,按课程号升序排列 select c_id,count(*) as total from score GROUP BY c_id HAVING total>5 ORDER BY total,c_id ASC-- 44、检索至多选修两门课程的学生学号 select s_id,count(*) as sel from score GROUP BY s_id HAVING sel>=2-- 45、查问选修了全副课程的学生信息 select * from student where s_id in( select s_id from score GROUP BY s_id HAVING count(*)=(select count(*) from course))-- 46、查问各学生的年龄 -- 依照出生日期来算,以后月日 < 出生年月的月日则,年龄减一 select s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y') - (case when DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d') then 0 else 1 end)) as age from student;-- 47、查问本周过生日的学生 select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth) select * from student where YEARWEEK(s_birth)=YEARWEEK(DATE_FORMAT(NOW(),'%Y%m%d')) select WEEK(DATE_FORMAT(NOW(),'%Y%m%d')) -- 48、查问下周过生日的学生 select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =WEEK(s_birth) -- 49、查问本月过生日的学生 select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) =MONTH(s_birth)-- 50、查问下月过生日的学生 select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =MONTH(s_birth)练习题问题-- 为什么用left join而且加判断 OR c.c_id = NULL? 右表数据为空为什么思考? ...

September 27, 2020 · 9 min · jiezi

关于sql:SQL知识包开发经典案例面试题全家桶

一、根底1、创立数据库 CREATE DATABASE database-name复制代码2、删除数据库 drop database dbname复制代码3、备份sql server --- 创立 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 复制代码4、创立新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)#依据已有的表创立新表: A:create table tab_new like tab_old (应用旧表创立新表)B:create table tab_new as select col1,col2… from tab_old definition only复制代码5、删除新表 drop table tabname 复制代码6、减少一个列 Alter table tabname add column col type复制代码注:列减少后将不能删除。DB2中列加上后数据类型也不能扭转,惟一能扭转的是减少varchar类型的长度。 7、主键 增加主键:Alter table tabname add primary key(col) 删除主键:Alter table tabname drop primary key(col) 复制代码8、索引 ...

September 17, 2020 · 9 min · jiezi

关于sql:实战案例丨GaussDB-for-DWS如何识别坏味道的SQL

摘要:SQL中的坏滋味,你晓得吗?SQL语言是关系型数据库(RDB)的规范语言,其作用是将使用者的用意翻译成数据库可能了解的语言来执行。人类之间进行交换时,同样的意思用不同的措辞会产生不同的成果。 相似地,人类与数据库交流信息时,同样的操作用不同的SQL语句来表白,也会导致不同的效率。而有时同样的SQL语句,数据库采纳不同的形式来执行,效率也会不同。那些会导致执行效率低下的SQL语句及其执行形式,咱们称之为SQL中的“坏滋味”。 上面这个简略的例子,能够阐明什么是SQL中的坏滋味。 图1-a 用union合并汇合 在下面的查问语句中,因为应用了union来合并两个后果集,在合并后须要排序和去重,减少了开销。实际上合乎dept_id = 1和dept_id > 2的后果间不会有重叠,所以齐全能够用union all来合并,如下图所示。 图1-b 用union all合并汇合 而更高效的做法是用or条件,在扫描的时候间接过滤出所需的后果,岂但节俭了运算,也节俭了保留两头后果所需的内存开销,如下图所示。 图1-c 用or条件来过滤后果 可见实现同样的操作,用不同的SQL语句,效率却天壤之别。前两条SQL语句都不同水平地存在着“坏滋味”。 对于这种简略的例子,用户能够很容易发现问题并选出最佳计划。但对于一些简单的SQL语句,其性能缺点可能很荫蔽,须要深入分析才有可能开掘进去。这对数据库的使用者提出了很高的要求。即使是资深的数据库专家,有时也很难找出性能劣化的起因。 GaussDB在执行SQL语句时,会对其性能体现进行剖析和记录,通过视图和函数等伎俩出现给用户。本文将简要介绍如何利用GaussDB提供的这些“第一手”数据,剖析和定位SQL语句中存在的性能问题,辨认和打消SQL中的“坏滋味”。 ◆ 辨认SQL坏滋味之自诊断视图GaussDB在执行SQL时,会对执行打算以及执行过程中的资源耗费进行记录和剖析,如果发现异常状况还会记录告警信息,用于对起因进行“自诊断”。用户能够通过上面的视图查问这些信息: • gs_wlm_session_info • pgxc_wlm_session_info • gs_wlm_session_history • pgxc_wlm_session_history 其中gs_wlm_session_info是根本表,其余3个都是视图。gs_结尾的用于查看以后CN节点上收集的信息,pgxc_结尾的则蕴含集群中所有CN收集的信息。各表格和视图的定义基本相同,如下表所示。 表1-1 自诊断表格&函数字段定义 表1-2 自诊断表格&函数字段定义 其中的query字段就是执行的SQL语句。通过剖析每个query对应的各字段,例如执行工夫,内存,IO,下盘量和歪斜率等等,能够发现疑似有问题的SQL语句,而后联合query_plan(执行打算)字段,进一步地加以分析。特地地,对于一些在执行过程中发现的异常情况,warning字段还会以human-readable的模式给出告警信息。目前可能提供的自诊断信息如下: ◇多列/单列统计信息未收集优化器依赖于表的统计信息来生成正当的执行打算。如果没有及时对表中各列收集统计信息,可能会影响优化器的判断,从而生成较差的执行打算。如果生成打算时发现某个表的单列或多列统计信息未收集,warning字段会给出如下告警信息: Statistic Not Collect:schemaname.tablename(column name list)此外,如果表格的统计信息已收集过(执行过analyze),然而间隔上次analyze工夫较远,表格内容产生了很大变动,可能使优化器依赖的统计信息不准,无奈生成最优的查问打算。针对这种状况,能够用pg_total_autovac_tuples零碎函数查问表格中自从上次剖析以来发生变化的元组的数量。如果数量较大,最好执行一下analyze以使优化器取得最新的统计信息。 ◇SQL未下推执行打算中的算子,如果能下推到DN节点执行,则只能在CN上执行。因为CN的数量远小于DN,大量操作沉积在CN上执行,会影响整体性能。如果遇到不能下推的函数或语法,warning字段会给出如下告警信息: SQL is not plan-shipping, reason : %s◇Hash连贯大表做内表如果发现在进行Hash连贯时应用了大表作为内表,会给出如下告警信息: PlanNode[%d] Large Table is INNER in HashJoin "%s"目前“大表”的规范是均匀每个DN上的行数大于100,000,并且内表行数是表面行数的10倍以上。 ◇大表等值连贯应用NestLoop如果发现对大表做等值连贯时应用了NestLoop形式,会给出如下告警信息: PlanNode[%d] Large Table with Equal-Condition use Nestloop"%s"目前大表等值连贯的判断规范是内表和表面中行数最大者大于DN的数量乘以100,000。 ...

September 17, 2020 · 1 min · jiezi

关于sql:数据分析SQL进阶

1 前言SQL进阶次要介绍谓词、CASE表达式、嵌套子查问、连贯(以列为单位对表进行连贯)和UNION运算(表为单位)。 2 SQL进阶2.1 谓词LIKE介绍LIKE之前,先介绍通配符,MySQL只反对百分号(%)和下划线(_),百分号代替0个或多个字符,下划线替换一个字符。通配符和正则表达式不是一回事,有趣味的能够去搜一下正则表达式。LIKE操作符能够了解等于(=)。 SELECT website ,city FROM web_city WHERE website like '%o%' and city like '_谷' BETWEENBETWEEN操作符取某个字段在某个范畴之间,能够数值、文本和日期。常跟AND搭配,BETWEEN....AND....。 SELECT website FROM web_city WHERE website BETWEEN 'A' AND 'H' IS NULLSQL中NULL值的判断,不能用等于号(=)或者LIKE,用IS NULL。NULL值就是空值,啥也没有,web_city中为了显示,写了NULL,其实这个NULL是字符,不是空值哈,请留神。写空值间接'',就能够了。引号内啥也没有。 SELECT website,city FROM web_city WHERE website is NULL ININ操作符也是取某个字段在范畴之内,绝对BETWEEN AND,IN的范畴更加的明确。 SELECT website,city FROM web_city WHERE website in ('Google','淘宝','深圳') EXISTEXIST多用于多表查问中,因为独自判断某条记录是否存在,没啥意思。举个例子。 SELECT * FROM web_city WHERE EXISTS (SELECT * from city_nation WHERE city ='硅谷') (1)SELECT * FROM web_city WHERE true (2) 第一条语句相当于第二条语句的意思,返回全副全副记录。 ...

September 13, 2020 · 2 min · jiezi

关于sql:clickhouse-安装和远程登录开启

一、Clickhouse的装置1、增加yum源 yum-config-manager --add-repo http://repo.red-soft.biz/repos/clickhouse/repo/clickhouse-el6.repo 2、装置 yum install clickhouse-server clickhouse-client clickhouse-server-common clickhouse-compressor 3、启动服务 /etc/init.d/clickhouse-server start 4、登录测试[root@db_server_yayun_01 ~]# clickhouse-client ClickHouse client version 20.5.2.7 (official build).Connecting to 127.0.0.1:9000 as user default.Connected to ClickHouse server version 20.5.2 revision 54435.VM_0_15_centos :) VM_0_15_centos :) VM_0_15_centos :) VM_0_15_centos :) 二、Clickhouse近程登录1、批改配置文件[root@db_server_yayun_01 ~]vi /etc/clickhouse-server/config.xml 找到<listent_host>::</listen_host> 去掉正文 三、客户端连贯(DBeaver)1、主机:Clickhouse近程登录服务器的IP2、用户名、明码:默认default,明码为空3、Dbeaver有社区版的,因为是客户端,操作起来会比tabix更不便、好用一些

September 13, 2020 · 1 min · jiezi

关于sql:SQL-最有价值的技能之一

在我的职业生涯中, 我学到了很多技能, 但没有什么技术技能比 SQL 更有用. 在我看来, SQL 是最有价值的技能, 有以下几个起因: 它在不同的工作和学科中都很有价值只须要学习一次, 并不需要重新学习你看起来像是个超级英雄. 当你晓得有很多人都对SQL不太精通的时候, 你就显得分外的弱小让我对以上每一点都具体解释一下 SQL 是一个你能够随处应用的工具无论你是什么工作, SQL 都会想方法让你的生存更轻松. 例如明天我作为一名产品经理, 我的工作是看数据, 剖析咱们在产品方面的效率如何, 并制订产品路线图. 如果咱们刚刚公布了一个新性能, 那么对于是否有人浏览过该性能的数据很可能就在关系型数据库中的某个中央. 如果我正在致力跟踪要害的业务指标, 比方月度增长, 同样也很可能就放在关系型数据库的某个中央. 在咱们所做的简直所有事件的另一端, 都很可能有一个应用 SQL 的记录零碎. 晓得如何能最原生地拜访这些数据, 就能够省去大量的精力, 而不必去问他人这些数据是什么. 但即便在成为产品经理之前, 我也会应用 SQL 来告知我零碎内产生了什么. 作为一名工程师, 它经常能让我比用 Ruby 或 Python 等脚本更快地获取我想要的信息. 当我的 webapp 速度变慢的时候, 理解执行的 SQL 和优化它的办法是不可短少的. 是的, 这有点超出了对 SQL 的根本了解...... 然而在查问中增加一个索引, 而不是滚动我本人的本地缓存, 这所晋升的效率很值得花额定的工夫去学习. SQL 是持久性的记得大概20年前, 我创立了第一个网页. 那是一个神奇的网页, 而后我引入了一些 Javascript 来使它更令人印象粗浅, 提醒用户点击 Yes/No 或给我一些输出. 而后大概 10 年后, jQuery 呈现了, 尽管它有时比拟啰嗦, 而且也有新的货色要学, 但它让货色整体上更丑陋, 所以我致力于重新学习 jQuery 的 JS 办法. 而后就跟上了 Angular -> React/Ember 的步调, 当初我有一整条流水线把根本的 Javascript 引入到我的网站中, 而事实是我依然在努力完成和 20 年前一样的事件, 让人点击 Yes/No. ...

September 11, 2020 · 1 min · jiezi

关于sql:Leetcode数据库刷题

1. 查找反复的电子邮箱本人想法(谬误) SELECT a.EmailFROM Person a,Person bWHERE a.Email = b.Email后果:表内全副呈现解决思路:计算每封邮件的存在次数 SELECT EmailFROM Person GROUP BY EmailHAVING COUNT(Email)>1解二:创立长期表 SELECT EmailFROM( SELECT Email,COUNT(Email) as num FROM Person GROUP BY Email) tmp_table~~~~WHERE num>1

September 11, 2020 · 1 min · jiezi

关于sql:如何把股票数据导出excel导出股票历史数据到Excel的方法

共享一个能够把股票数据导出Excel的办法,是一个在线下载股票历史数据,目前能够下载A股、港股、美股所有个股的历史数据,数据是Excel的不便剖析查看、做表,最次要是收费。。。只有两步就能下载: 填股票代码、邮箱5分钟后收到股市历史数据Excel【搜公主号【数据即服务】即可1、2两步批量下载,0¥,不必转发分享。】放在公主号下载也实属无奈,【不然很容易被歹意下载】,股票历史数据下载是很不便的,在公主号里进行1、2两个步骤就能够了,个别5分钟就能收到股票历史数据。 在线下载很容易被有限歹意下载,十分影响失常用户的下载,【失常用户基本挤不过歹意下载的】。所以起初为了屏蔽掉这些歹意下载股票历史数据的,就设置了通过公主号下载的形式。很简略,没有套路限度的,不放在公主号正常人基本抢不过那些机器的。 就是因为在线下载容易被攻打、歹意下载,所以最初抉择了放在公主号,这样的话要攻打也是先攻打公主号,应该还没有谁有这么大的本事,所以这种办法【一是M费(0¥),二是能短暂】,还是心愿大家能了解 当初做在线下载的,基本上都是套路要钱的,不信你找一圈还得回来. 如何把股票数据导出excel?导出股票历史数据到Excel的办法 pro = ts.pro_api()df = pro.daily(ts_code='000002.SZ', start_date='19910129', end_date='20191226') # start_date是股票的上市日期,end_date是完结的日期。这两个日期的意思是你想获取数据的时间段。如果你想获取一年的数据就写成:start_date='20181226', end_date='20191226'print(df)输出数据(示例): ts_code trade_date open high low close pre_close change pct_chg vol amount0 000002.SZ 20180718 8.75 8.85 8.69 8.70 8.72 -0.02 -0.23 525152.77 460697.3771 000002.SZ 20180717 8.74 8.75 8.66 8.72 8.73 -0.01 -0.11 375356.33 326396.9942 000002.SZ 20180716 8.85 8.90 8.69 8.73 8.88 -0.15 -1.69 689845.58 603427.7133 000002.SZ 20180713 8.92 8.94 8.82 8.88 8.88 0.00 0.00 603378.21 535401.1754 000002.SZ 20180712 8.60 8.97 8.58 8.88 8.64 0.24 2.78 1140492.31 1008658.8285 000002.SZ 20180711 8.76 8.83 8.68 8.78 8.98 -0.20 -2.23 851296.70 744765.8246 000002.SZ 20180710 9.02 9.02 8.89 8.98 9.03 -0.05 -0.55 896862.02 803038.9657 000002.SZ 20180709 8.69 9.03 8.68 9.03 8.66 0.37 4.27 1409954.60 1255007.6098 000002.SZ 20180706 8.61 8.78 8.45 8.66 8.60 0.06 0.70 988282.69 852071.5269 000002.SZ 20180705 8.62 8.73 8.55 8.60 8.61 -0.01 -0.12 835768.77 722169.579

September 11, 2020 · 1 min · jiezi

关于sql:股票交易数据下载-下载股票历史交易数据到本地Excel

分享一个能够下载股票历史交易数据到本地Excel的工具,举荐理由:收费(要钱?不存在的)、下载简略不便、能够下载所有个股的历史交易数据、交易数据是从股票上市日到最近一个交易的所有历史数据只有两步就能下载: 填股票代码、邮箱5分钟后收到股市历史数据Excel【搜公主号【数据即服务】即可1、2两步批量下载,0¥,不必转发分享。】放在公主号下载也实属无奈,【不然很容易被歹意下载】,股票历史数据下载是很不便的,在公主号里进行1、2两个步骤就能够了,个别5分钟就能收到股票历史数据。在线下载很容易被有限歹意下载,十分影响失常用户的下载,【失常用户基本挤不过歹意下载的】。所以起初为了屏蔽掉这些歹意下载股票历史数据的,就设置了通过公主号下载的形式。很简略,没有套路限度的,不放在公主号正常人基本抢不过那些机器的。 就是因为在线下载容易被攻打、歹意下载,所以最初抉择了放在公主号,这样的话要攻打也是先攻打公主号,应该还没有谁有这么大的本事,所以这种办法【一是M费(0¥),二是能短暂】,还是心愿大家能了解 当初做在线下载的,基本上都是套路要钱的,不信你找一圈还得回来. 股票交易数据下载 | 下载股票历史交易数据到本地Excel import reimport pandasimport requestsurl = '指标网站的url' # 这里不写具体网站的链接了,大体做法都是一样的。response = requests.get(url).text # 失去网页的源代码###上面是解析收盘数据的代码,大部分都能够这么参考,简略的正则表达式###times = re.findall('class="first left bold noWrap">(.*?)</td>').group(1) # 获取到所有历史的交易工夫open_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td data-real-value="(.*?)"').group(1) # 失去所有历史开盘价数据close_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据high_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据###上面是数据下载老本地数据局部,以下载为本地Excel为例###df = pandas.DataFrame(a, columns=['open_price', 'close_price', 'vol']) # 把数据转成DataFrame格局wt = ExcelWriter(path) # path 是文件的保留门路,要准确到文件名。数据下载老本地数据之后,就要到这个门路去找。例如:C:\\Users\\Administrator\\Desktop\\股票所有历史收盘数据下载老本地数据.xls 就依照这个门路找到保留好的Excel就行了df.to_excel(wt, sheet_name='如何下载股票的历史收盘价' , index=False)

September 9, 2020 · 1 min · jiezi

关于sql:Transpositions-in-SQL

Transposition algorithm is common for SQL. There are row-to-column transposition, column-to-row transposition, dynamic transposition and join-based transposition, etc. This article analyzes the algorithm for each type of transposition and offers the sample code. For the transpositions that are difficult to handle in SQL, there are convenient esProc solutions. Looking Transpositions in SQL for details.A transposition is to rotate information from one row or column to another to change the data layout, for the purpose of making observations from a new perspective. Some transposition algorithms are simple, such as row to column, column to row and bidirectional transposition. Others are not so simple, such as dynamic transposition, transposition with inter-row calculations and join-based transposition. All are commonly seen in data analyses and thus worth a study. ...

September 4, 2020 · 17 min · jiezi

关于sql:分布式-SQL-数据库新的演变方向

http://suo.im/61qgLg 作者:陈峻 数据库体系结构倒退的下一步是分布式SQL。在这里看看一些特色。 随着各个组织先后将其业务转向云端环境时,他们很快地意识到:在一些最要害的利用背地,那些新式的关系型数据库岂但限度了迁徙的速度,而且根本无法无效地实现灵便的业务扩大。许多企业既心愿放弃诸如Oracle、SQL Server、Postgres和MySQL之类关系型数据库的可靠性,又可能享受到云服务所带来的规模效应、以及全局稳定性等“红利”。 为了满足此类需要,人们开始转向应用NoSQL数据库。然而因为NoSQL并非齐全为提供真正的一致性而设计的,因而它无奈作为事务型数据库而应用。当然,最近有一些NoSQL解决方案宣称可能提供“ACID事务”。不过,它们无奈提供诸如:财务分帐、库存管制、以及身份治理等要害工作所需的隔离级别。 分布式SQL--一种新的数据库2012年,Google发表了一篇无关Spanner的论文。文中介绍了一种全新的基于分布式系统的,且能够全球性扩大的散布数据库。总的说来,Google Cloud Spanner是一种可扩大的、多版本的、同步复制(synchronously-replicated)型数据库。它是第一个可能在寰球范畴内散发数据,并反对内部一致性(externally-consistent)的分布式事务的零碎。 上面咱们此基础上,一起来具体探讨此类分布式SQL的根本相干概念,特地是如何实现可扩展性和一致性的。通常,为了可能在分布式环境中真正具备可扩展性,分布式SQL数据库具备如下七种外围特色: 1.可扩大正如咱们无需沉重的筹备就可能实现扩大式计算那样,分布式SQL数据库可能在不减少操作复杂性的状况下,适应云端环境的无缝扩大。也就是说,它具备在多个分布式参与者之间均匀分布数据的能力。 2.一致性分布式SQL数据库必须在分布式环境中提供高度的隔离性。云端环境往往是由各种分布式系统和微服务所组成,而不同的调用和操作可能会指向同一块数据,因而咱们很难保障事务一致性。分布式SQL数据库除了可能调节资源的争用,还可能提供与单实例数据库雷同的事务隔离级别。 3.弹性分布式SQL数据库可能在无需任何内部工具的条件下,提供最高级别的弹性。凭借着云服务为咱们的业务所提供继续在线环境,分布式数据库能够将故障复原的用时减到起码,并且无需任何内部配置,即可自动化地复制数据。 4.异地复制因为云服务可能以一种可承受的服务水平,将用户的业务触达寰球的各个角落,因而分布式SQL数据库也可能据此冲破地区的限度。在简单、宽泛、扩散的地理环境中,它可能进行散布解决和数据存储,以满足各地用户的业务需要。 5.反对SQL家喻户晓,SQL是数据库所应用的结构化语言,也是所有应用逻辑的默认语言。凭借着其通用性,咱们不用从新培训开发人员,即可熟练地对接和调用数据库资源。除了下面提到的Spanner,诸如Amazon Aurora、Yugabyte、FaunaDB和CockroachDB等都可能反对SQL。 6.数据本地化在分布式系统中,因为数据被扩散到了各个地区的数据中心,因而利用架构师往往须要理解每个站点的地位,在程序逻辑上找到最近的地位,以便将须要调用的存储数据绑定为利用的一部分。那么,分布式SQL能够在其数据表中,基于某些字段对数据进行天文分区,进而让数据更靠近用户侧。这就是所谓的数据库的数据主权(data sovereignty)问题。据此,开发人员能够确保用户对其信息的低提早拜访,从而最大水平地缩小数据在云端传输的费用和流量的开销。 7.多云(Multi-cloud)模式分布式SQL数据库的一个独特特色是:半自治单元(semi-autonomous units),它们能够参加到较大的零碎中。也就是说,每个单元都可能自行部署,而后退出到CockroachDB集群之类更大的零碎中。通过该特色,分布式SQL数据库能够更好地扩大到真正的多云环境中,而不仅仅依赖于单个网络,来实现数据的散发。在此模式下,参与者(participant)的云服务类别将不再受到限制,它们能够位于任何中央,任何一种公共云、公有云、甚至是单个的本地(on-premise)实例。显然,这对于咱们在分布式混合与多云环境中的各类利用来说,都是至关重要。 分布式SQL的根本要求上述七项特色堪称分布式SQL在云端环境中所独有的。然而,说到底它依然是一种数据库,因而也该当具备数据库的如下基本功能: 可管理性:用户能够应用一组命令行、或基于图形化的工具,来轻松地装置和配置指标数据库。用户通过针对运行环境的管制、数据生命周期的治理、以及惯例的备份与还原,以实现数据表的创立,schema的定义与实现,索引与分区的设置,以及DDL的重建等。可优化:DBA能够深刻理解数据库在查问响应方面的性能,使用基于老本的优化器(cost-based optimizer)等高级性能,进而实现查问效率的优化。具备安全性:与企业的其余常用软件相似,安全性是一个不容忽视的环节。数据库应提供认证、受权和可问责性,这样的AAA机制。而且,此类性能不应该只独立数据库外部,而该当与具备身份治理和治理性能的集中式管控系统集成一起,以便对流转在整个零碎中各个级别的数据(包含表、行和列等级别)设置一致性的策略。可集成:显然,数据库须要可能通过通过测试的、或已知的驱动程序,与前端利用相集成,以实现批量获取或导出数据等服务。与此同时,数据库还应通过与ETL(Extract-Transform-Load)工具的配合应用,将捕捉到的数据,与数据流剖析、或云端存储等更高级的服务相集成。当然,上述所谓“根本”性能要求,其实并不简略,它们旨在提供更加成熟的、针对企业级利用的数据库。 总结作为一种新兴的类别和演变的方向,分布式SQL数据库还须要在数据一致性和本地化等方面,进一步配合云端环境来不断改进。毕竟,在严苛的生产环境中,此类数据库会碰到更多无关性能和效率等方面的理论问题。 前文提到的CockroachDB,是一种云原生的分布式SQL数据库。它能够帮忙各种企业级利用,将最根本的工作负载和一些关键性的工作迁徙到云端,并实现了对于各种高级云端原生环境的策略编排。您能够作为理解分布式SQL的一个切入口进行试用。

September 4, 2020 · 1 min · jiezi

关于sql:哪里下载全部股票历史数据下载全部股票历史数据怎么下

4000+只个股所有股票的历史数据,500+个指数的全副历史数据,曾经打包好了,而且能够随时下载最近一个交易日的全副股票历史数据,一个在线下载的工具只有两步就能下载: 填股市代码、邮箱5分钟后收到股市历史数据Excel放在公主号下载也实属无奈,心愿大家体谅【不然很容易被歹意下载】,股票历史数据下载是很不便的,在公主号里进行1、2两个步骤就能够了,个别5分钟就能收到股票历史数据。【搜公主号【数据即服务】即可1、2两步下载,0¥,不必转发分享。】在线下载很容易被有限歹意下载,十分影响失常用户的下载,【失常用户基本挤不过歹意下载的】。所以起初为了屏蔽掉这些歹意下载股票历史数据的,就设置了通过公主号提交、邮件发送的形式。 就是因为在线下载容易被攻打、歹意下载,所以最初抉择了放在公主号,这样的话要攻打也是先攻打公主号,应该还没有谁有这么大的本事,所以这种办法【一是M费(0¥),二是能短暂】,还是心愿大家能了解 当初做在线下载的,基本上都是套路要钱的,不信你找一圈还得回来... 哪里下载全副股票历史数据?下载全副股票历史数据怎么下? import reimport pandasimport requestsurl = '指标网站的url' # 这里不写具体网站的链接了,大体做法都是一样的。response = requests.get(url).text # 失去网页的源代码###上面是解析收盘数据的代码,大部分都能够这么参考,简略的正则表达式###times = re.findall('class="first left bold noWrap">(.*?)</td>').group(1) # 获取到所有历史的交易工夫open_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td data-real-value="(.*?)"').group(1) # 失去所有历史开盘价数据close_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据high_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据###上面是数据下载老本地数据局部,以下载为本地Excel为例###df = pandas.DataFrame(a, columns=['open_price', 'close_price', 'vol']) # 把数据转成DataFrame格局wt = ExcelWriter(path) # path 是文件的保留门路,要准确到文件名。数据下载老本地数据之后,就要到这个门路去找。例如:C:\\Users\\Administrator\\Desktop\\股票所有历史收盘数据下载老本地数据.xls 就依照这个门路找到保留好的Excel就行了df.to_excel(wt, sheet_name='如何下载股票的历史收盘价' , index=False)

September 2, 2020 · 1 min · jiezi

关于sql:a股历史行情下载怎么下Excel如何下载a股历史行情走势数据

来讲一下a股历史行情下载怎么下载到本地Excel,要下载a股历史行情走势数据并不难,之前很多券商客户端都提供,不过当初如同都不给下或者有限度了。只须要两步,0¥,不要下载软件,随时随地在线下载只有两步就能下载: 填股市代码、邮箱5分钟后收到股市历史数据Excel放在公主号下载也实属无奈,心愿大家体谅【不然很容易被歹意下载】,下载是很不便的,在公主号里进行1、2两个步骤就能够了,个别5分钟就能收到数据。 在线下载很容易被有限歹意下载,十分影响失常用户的下载,【失常用户基本挤不过歹意下载的】。所以起初为了屏蔽掉这些歹意下载,就设置了通过公主号提交、邮件发送的形式。 就是因为在线下载容易被攻打、歹意下载,所以最初抉择了放在公主号,这样的话要攻打也是先攻打微信,应该还没有谁有这么大的本事,所以这种办法一是M费(0¥),二是能短暂,还心愿大家能了解 当初做在线下载的,基本上都是套路要钱的,不信你找一圈还得回来... 如果你懂代码,更简略了,间接送你代码: import reimport pandasimport requestsurl = '指标网站的url' # 这里不写具体网站的链接了,大体做法都是一样的。response = requests.get(url).text # 失去网页的源代码###上面是解析收盘数据的代码,大部分都能够这么参考,简略的正则表达式###times = re.findall('class="first left bold noWrap">(.*?)</td>').group(1) # 获取到所有历史的交易工夫open_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td data-real-value="(.*?)"').group(1) # 失去所有历史开盘价数据close_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据high_price = re.findall('class="first left bold noWrap">.*?</td>\s+<td.*?</td>\s+<td.*?</td>\s+<td data-real-value="(.*?)">').group(1) # 失去所有历史收盘价数据###上面是数据下载老本地数据局部,以下载为本地Excel为例###df = pandas.DataFrame(a, columns=['open_price', 'close_price', 'vol']) # 把数据转成DataFrame格局wt = ExcelWriter(path) # path 是文件的保留门路,要准确到文件名。数据下载老本地数据之后,就要到这个门路去找。例如:C:\\Users\\Administrator\\Desktop\\股票所有历史收盘数据下载老本地数据.xls 就依照这个门路找到保留好的Excel就行了df.to_excel(wt, sheet_name='如何下载股票的历史收盘价' , index=False)出处:股票股市历史数据下载股票历史数据

August 27, 2020 · 1 min · jiezi

关于sql:纯干货15000-字语法手册分享给你看完搞懂再也不担心SQL写不好了

起源:cnblogs.com/liuqifeng/p/9148831.html一、根底1、创立数据库 CREATE DATABASE database-name2、删除数据库 drop database dbname3、备份sql server --- 创立 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 4、创立新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) #依据已有的表创立新表: A:create table tab_new like tab_old (应用旧表创立新表) B:create table tab_new as select col1,col2… from tab_old definition only5、删除新表 drop table tabname 6、减少一个列 Alter table tabname add column col type注:列减少后将不能删除。DB2中列加上后数据类型也不能扭转,惟一能扭转的是减少varchar类型的长度。 7、主键 增加主键:Alter table tabname add primary key(col) 删除主键:Alter table tabname drop primary key(col) 8、索引 创立索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname注:索引是不可更改的,想更改必须删除从新建。9、阐明: 创立视图:create view viewname as select statement删除视图:drop view viewname10、几个简略的根本的sql语句 抉择:select * from table1 where 范畴插入:insert into table1(field1,field2) values(value1,value2)删除:delete from table1 where 范畴更新:update table1 set field1=value1 where 范畴查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!排序:select * from table1 order by field1,field2 [desc]总数:select count as totalcount from table1求和:select sum(field1) as sumvalue from table1均匀:select avg(field1) as avgvalue from table1最大:select max(field1) as maxvalue from table1最小:select min(field1) as minvalue from table111、几个高级查问运算词 ...

August 27, 2020 · 5 min · jiezi

关于sql:postgre数据导出为文件

数据迁徙的时候,须要通过文件的形式导出输出,再导入新的数据库,具体操作分以下三步走: 1、登录数据库的服务器端psql -h 1.1.1.1(ip) -p (端口) -d (库名) --username=用户名2、导出数据文件\COPY (select * from schema.table_1) TO '/data/table_1.csv' with delimiter '^' null as '';这里的文件目录个别是数据库所在服务器上的某目录。分隔符能够采纳任何单字节的单个字符,但不能和字段内容中有的字符反复。这里采纳^是因为字段中比拟少见^,而,:;等符号比拟常见,易反复或者存在。 如果全副的分隔符都在字段中蕴含怎么办呢?倡议采纳其余同步形式,比方Datax, cloud canal, kettle等。。切实不想弄其余形式呢,有个不是坏方法,就是先把含字符的那一个害群之马字段改掉,同步后再改回去 3、在要导入的指标数据库创立表面映射到服务器上的数据文件CREATE external TABLE "schema"."table_1" ( "id" int8 , "code" varchar(32) , "createtime" timestamp(0) ) location ('gpfdist://指标数据库ip:端口/table_1.csv') format 'csv' (DELIMITER '^');

August 26, 2020 · 1 min · jiezi

关于sql:create-table-as-与create-table-like

相同点:都是创立一个新表 不同点create table as 只是复制原数据,其实就是把查问的后果建一个表create table like 产生与源表雷同的表构造,包含索引和主键,数据须要用insert into 语句复制进去。举例:`DROP TABLE IF EXISTS l_medicine.user_tmp; CREATE TABLE l_medicine.user_tmp LIKE l_medicine.user; INSERT INTO l_medicine.user_tmp PARTITION (platform_id) SELECT...u.created_at, u.updated_at, CASE WHEN n.user_id IS NULL THEN 0 ELSE 1 END AS noise, u.platform_id FROM l_medicine.user AS u LEFT JOIN transforms.medicine_inquiry_user_noise AS n ON u.user_id = n.user_id;`

August 18, 2020 · 1 min · jiezi

关于sql:create-table-as-与create-table-like

相同点:都是创立一个新表 不同点create table as 只是复制原数据,其实就是把查问的后果建一个表create table like 产生与源表雷同的表构造,包含索引和主键,数据须要用insert into 语句复制进去。举例:`DROP TABLE IF EXISTS l_medicine.user_tmp; CREATE TABLE l_medicine.user_tmp LIKE l_medicine.user; INSERT INTO l_medicine.user_tmp PARTITION (platform_id) SELECT...u.created_at, u.updated_at, CASE WHEN n.user_id IS NULL THEN 0 ELSE 1 END AS noise, u.platform_id FROM l_medicine.user AS u LEFT JOIN transforms.medicine_inquiry_user_noise AS n ON u.user_id = n.user_id;`

August 18, 2020 · 1 min · jiezi

关于sql:SQL语句基础

1、SQL语句简介SQL语句的根底语法不是特地多,次要还是要多用多纯熟,了解一些基本原理和背地的货色。SQL语句次要分为DDL、DML和DCL。DDL(Data Definition Language,数据定义语言)用于数据库或者表的构造定义/批改等。DML(Data Manipulation Language,数据操纵语言)用于查问或变更数据记录,也是应用最多的一部分,波及最多的一部分(增删改查都属于DML)。而DCL(Data Control Language,数据管制语言)用于事务管制和权限管制等其余事项。 本文是《SQL基础教程》读书笔记。相干所有的语句都能够在mysql命令行中获取帮忙,间接help [command]即可。比方help CREATE;。多用多查就能逐步把握各种语句了。 上面是这三种语句的一些罕用关键词介绍: 1.1、DDLCREATE:用于创立数据库和数据表等对象。ALTER:用于批改数据库和数据表等对象的构造。DROP:用于删除数据库和数据表等对象。1.2、DMLSELECT:查问表中记录 FROM:从指定数据表获取记录。WHERE:依据条件判断进行记录筛选。GROUP BY:分组键,用于将数据分组。HAVING:和GROUP BY一起应用,对分组后的数据进行删选。ORDER BY:对输入后果进行排序。INSERT:向表中插入新记录UPDATE:更新表内已存记录DELETE:删除表中记录1.3、DCLCOMMIT:确认对数据库中数据的变更。(提交事务)ROLLBACK:勾销对数据库中数据的变更。(回滚事务)GRANT:赋予用户操作权限。REVOKE:勾销用户操作权限。2、罕用语句上面是一些我集体感觉刚开始学习时可能会用上的语句。先记一些根底语句再操作会更轻松。 SHOW DATABASES; 确认数据库列表。USE [DATABASE_NAME]; 切换到指定的数据库。SELECT database(); 确认以后所在数据库。SHOW TABLES; 确认数据表的列表。DESC [TABLE_NAME]; 确认指定数据表的构造。一般来说,操作前最好确认分明,以后在哪个数据库?须要操作哪个数据库的表?表的构造(列)定义是否正确?上述的这些语句能够提供帮忙。其次,除了下面这些和数据内容相干的语句,有时候还须要确认服务器的状态和参数。对于数据库服务自身还会有一些语句来查看服务器状态和参数,能够用STAUTS;和SHOW STATUS;以及SHOW VARIABLES;等。 SHOW语句也可通过help命令进行进一步理解。3、SQL语句应用办法上面是一些SQL语句的语法以及注意事项。 3.1、常见DDL语句语法-- 创立数据库CREATE DATABASE [数据库名]; -- 删除数据库DROP DATABASE [数据库名];-- 在以后数据库下新建一个表CREATE TABLE [表名]([列名1]    [数据类型]    [该列所需束缚],[列名2]    [数据类型]    [该列所需束缚],[列名3]    [数据类型]    [该列所需束缚],      .      .      .[表束缚1],[表束缚2], .......);-- 在以后数据库下,删除指定表DROP TABLE [表名];-- 在以后数据库下,给指定表减少一列ALTER TABLE [表名] ADD COLUMN [列定义];-- 在以后数据库下,删除指定表的一列(留神,列删除审慎操作)ALTER TABLE [表名] DROP COLUMN [列名];-- 表名批改的2种形式ALTER TABLE [旧表名] RENAME TO [新表名];RENAME TABLE [旧表名] TO [新表名];创立表时,应用的是圆括号,不是大括号。主键束缚能够写在最初,也能够间接写在每行最初的该列所需束缚上。比方: id, INTEGER, NOT NULL PRIMARY KEY, 其次,主键默认带非空。其余的列默认可空,须要指定非空。 ...

August 13, 2020 · 1 min · jiezi

关于sql:强势推荐SQL-语句单引号双引号的用法

作者:peterYong原文:https://www.cnblogs.com/peter...对于Insert字符串 ,在(单引号,双引号)这个方面产生了问题,其实次要是因为数据类型和变量在作怪。上面咱们就别离讲述,尽管说的是Insert语句, 然而Select、Update、Delete语句都是一样的。 如果有下述表格: mytabe字段1    username     字符串型(姓名)字段2    age          数字型(年龄)字段3    birthday      日期型(生日)字段4    marry        布尔型(是否结婚,结婚为True,未结婚为False)字段5    leixing       字符串型(类型)插入字符串型 如果要插入一个名为张红的人,因为是字符串,所以Insert语句中名字两边要加单撇号,数值型能够不加单引号 如: strsql=“Insert into mytable(username) values(‘张红')”如果当初姓名是一个变量thename,则写成 strsql=”Insert into mytable(username) values(‘” & thename & “')”阐明:&改为+号也能够吧,字符串连贯 这里 Insert into mytable(username) values(‘  是张红后面的局部,thename是字符串变量,   ')是张红前面的局部。 将thename变量替换成张红,再用&将三段连接起来,就变成了  strsql=“Insert into mytable(username) values(‘张红')”如果要插入两个字段,如姓名为“张红”,类型为“学生” strsql=“Insert into mytable(username,leixing) values(‘张红','学生')”如果当初姓名是一个变量thename,类型也是一个变量thetype, 则写成: strsql=”Insert into mytable(username,leixing) values(‘” & thename & “','” & thetype & “')”和第一个例子一样,将thename和thetype替换后,再用连接符,就连接成和下面一样的字符串了。 插入数字型 如果插入一个年龄为12的记录,要留神数字不必加单撇号 strsql=“Insert into mytable(age) values(12)” 如果当初年龄是一个变量theage,则为: strsql=“Insert into mytable(age) values(“ & theage & “)” 这里 Insert into mytable(age) values (是12后面的局部,theage是年龄变量,)是12前面局部。 将theage替换,再用&连接符将三局部连接起来,就变为了和下面一样的字符。 插入日期型 日期型和字符串型相似,然而要将单撇号替换为#号。(不过,access数据库中用单撇号也能够) strsql=“Insert into mytable(birthday) values(#1980-10-1#)” 如果换成日期变量thedate strsql=“Insert into mytable(birthday) values(#” & thedate & “#)” 插入布尔型 布尔型和数字型相似:只不过只有两个值 True和False, 如: strsql=“Insert into mytable(marry) values(True)” 如果换成布尔变量themarry strsql=“Insert into mytable(birthday) values(” & themarry& “)” 综合示例 插入一个姓名为张红,年龄为12的记录 strsql=“Insert into mytable(username,age) values(‘张红',12)” 认真留神上式:因为姓名是字符串,所以张红两边加了单撇号;年龄是数字,所以没有加单撇号。 如果换成字符串变量thename和数字变量theage,则变为: strsql=“Insert into mytable(username,age) values(‘” & thename & “',” & theage & “)” 留神上式,总之,替换变量,再连贯后要实现和上边一样的字符串。 小窍门 要把上面的语句题换成变量的写法: strsql=“Insert into mytable(username) values(‘张红')”第一步:先把张红抹去,在原地位 加 两个引号 strsql=“Insert into mytable(username) values(‘”   “')”第二步:在两头增加两个连接符& strsql=“Insert into mytable(username) values(‘” & & “')”第三步:把变量写在两个连接符之间 strsql=“Insert into mytable(username) values(‘” & thename & “')” -咱们在写SQL查问的时候还是不厌其烦的加上单引号吧,仿佛那没有害处。因为对于主键为字符串类型的查问语句,加不加单引号的性能是相差百倍一上的。 如有谬误 ,欢送斧正,如有帮忙,欢送点赞并转发反对。 更多技术干货分享,敬请关注民工哥集体微信公众号:民工哥技术之路

August 11, 2020 · 1 min · jiezi

关于sql:数仓面试四个在工作后才知道的SQL密技

SQL是大数据从业者的必备技能,大部分的大数据技术框架也都提供了SQL的解决方案。能够说SQL是一种经久不衰、历久弥新的编程语言。尤其是在数仓畛域,应用SQL更是粗茶淡饭。本文会分享四个在面试和工作中罕用的几个应用技巧,具体包含: 日期与期间的应用长期表与Common Table Expression (WITH)Aggregation 与CASE WHEN的联合应用Window Function的其余用处数仓?不就是写写SQL吗…第一:日期与期间的应用日期与时间段的筛选在工作中是常常被用到的,因为在拉取报表、仪表板和各种剖析时,周、月、季度、年度的体现往往是剖析须要考量的重点。 工夫区段的提取:Extract语法-- field能够是day、hour、minute, month, quarter等等-- source能够是date、timestamp类型extract(field FROM source)应用SELECT extract(year FROM '2020-08-05 09:30:08'); -- 后果为 2020SELECT extract(quarter FROM '2020-08-05 09:30:08'); -- 后果为 3SELECT extract(month FROM '2020-08-05 09:30:08'); -- 后果为 8SELECT extract(week FROM '2020-08-05 09:30:08'); -- 后果为 31,一年中的第几周SELECT extract(day FROM '2020-08-05 09:30:08'); -- 后果为 5SELECT extract(hour FROM '2020-08-05 09:30:08'); -- 后果为 9SELECT extract(minute FROM '2020-08-05 09:30:08'); -- 后果为 30SELECT extract(second FROM '2020-08-05 09:30:08'); -- 后果为 8下面可供提取的字段,不同的数据库存在些许的差别。以Hive为例,反对day, dayofweek, hour, minute, month, quarter, second, week 和 year。其中周、月、年应用最为宽泛,因为无论是公司外部产品,还是商用的产品所提供的数据后盾统计,周报和月报(比方近7天、近30天)最重视体现的周期。 ...

August 7, 2020 · 3 min · jiezi

关于sql:数仓面试四个在工作后才知道的SQL密技

SQL是大数据从业者的必备技能,大部分的大数据技术框架也都提供了SQL的解决方案。能够说SQL是一种经久不衰、历久弥新的编程语言。尤其是在数仓畛域,应用SQL更是粗茶淡饭。本文会分享四个在面试和工作中罕用的几个应用技巧,具体包含: 日期与期间的应用长期表与Common Table Expression (WITH)Aggregation 与CASE WHEN的联合应用Window Function的其余用处数仓?不就是写写SQL吗…第一:日期与期间的应用日期与时间段的筛选在工作中是常常被用到的,因为在拉取报表、仪表板和各种剖析时,周、月、季度、年度的体现往往是剖析须要考量的重点。 工夫区段的提取:Extract语法-- field能够是day、hour、minute, month, quarter等等-- source能够是date、timestamp类型extract(field FROM source)应用SELECT extract(year FROM '2020-08-05 09:30:08'); -- 后果为 2020SELECT extract(quarter FROM '2020-08-05 09:30:08'); -- 后果为 3SELECT extract(month FROM '2020-08-05 09:30:08'); -- 后果为 8SELECT extract(week FROM '2020-08-05 09:30:08'); -- 后果为 31,一年中的第几周SELECT extract(day FROM '2020-08-05 09:30:08'); -- 后果为 5SELECT extract(hour FROM '2020-08-05 09:30:08'); -- 后果为 9SELECT extract(minute FROM '2020-08-05 09:30:08'); -- 后果为 30SELECT extract(second FROM '2020-08-05 09:30:08'); -- 后果为 8下面可供提取的字段,不同的数据库存在些许的差别。以Hive为例,反对day, dayofweek, hour, minute, month, quarter, second, week 和 year。其中周、月、年应用最为宽泛,因为无论是公司外部产品,还是商用的产品所提供的数据后盾统计,周报和月报(比方近7天、近30天)最重视体现的周期。 ...

August 7, 2020 · 3 min · jiezi

关于sql:Mysql原理和源码学习记录学而思网校早读会技术-0806李乐什么时候会使用内部临时表

学而思网校早读会-技术08-06-李乐-什么时候会应用外部长期表 点击观看点击观看 学而思网校技术团队公众号: 微信交换群:

August 7, 2020 · 1 min · jiezi

关于sql:Mysql原理和源码学习记录学而思网校早读会技术-0806李乐什么时候会使用内部临时表

学而思网校早读会-技术08-06-李乐-什么时候会应用外部长期表 点击观看点击观看 学而思网校技术团队公众号: 微信交换群:

August 7, 2020 · 1 min · jiezi

关于sql:SQL语法DDLDQLDCL

SQL语法:通用语法: SQL 语句能够单行或多行书写,以分号结尾。可应用空格和缩进来加强语句的可读性。MySQL 数据库的 SQL 语句不辨别大小写。三种正文 单行正文: -- 正文内容 或 # 正文内容(mysql 特有)多行正文: / 正文 /SQL分类DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等DML(Data Manipulation Language)数据操作语言用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等 DQL(Data Query Language)数据查询语言用来查询数据库中表的记录(数据)。关键字:select, where 等 DCL(Data Control Language)数据管制语言用来定义数据库的拜访权限和安全级别,及创立用户。关键字:GRANT, REVOKE 等 DDL:操作数据库、表1. 操作数据库:CRUD 1. C(Create):创立 * 创立数据库: * create database 数据库名称; * 创立数据库,判断不存在,再创立: * create database if not exists 数据库名称; * 创立数据库,并指定字符集 * create database 数据库名称 character set 字符集名; * 练习: 创立db4数据库,判断是否存在,并制订字符集为gbk * create database if not exists db4 character set gbk; 2. R(Retrieve):查问 * 查问所有数据库的名称: * show databases; * 查问某个数据库的字符集:查问某个数据库的创立语句 * show create database 数据库名称; 3. U(Update):批改 * 批改数据库的字符集 * alter database 数据库名称 character set 字符集名称; 4. D(Delete):删除 * 删除数据库 * drop database 数据库名称; * 判断数据库存在,存在再删除 * drop database if exists 数据库名称; 5. 应用数据库 * 查问以后正在应用的数据库名称 * select database(); * 应用数据库 * use 数据库名称;2. 操作表 1. C(Create):创立 1. 语法: create table 表名( 列名1 数据类型1, 列名2 数据类型2, .... 列名n 数据类型n ); * 留神:最初一列,不须要加逗号(,) * 数据库类型: 1. int:整数类型 * age int, 2. double:小数类型 * score double(5,2) 3. date:日期,只蕴含年月日,yyyy-MM-dd 4. datetime:日期,蕴含年月日时分秒 yyyy-MM-dd HH:mm:ss 5. timestamp:工夫错类型 蕴含年月日时分秒 yyyy-MM-dd HH:mm:ss * 如果未来不给这个字段赋值,或赋值为null,则默认应用以后的零碎工夫,来主动赋值 6. varchar:字符串 * name varchar(20):姓名最大20个字符 * zhangsan 8个字符 张三 2个字符 * 创立表 create table student( id int, name varchar(32), age int , score double(4,1), birthday date, insert_time timestamp ); * 复制表: * create table 表名 like 被复制的表名; 2. R(Retrieve):查问 * 查问某个数据库中所有的表名称 * show tables; * 查问表构造 * desc 表名; 3. U(Update):批改 1. 批改表名 alter table 表名 rename to 新的表名; 2. 批改表的字符集 alter table 表名 character set 字符集名称; 3. 增加一列 alter table 表名 add 列名 数据类型; 4. 批改列名称 类型 alter table 表名 change 列名 新列别 新数据类型; alter table 表名 modify 列名 新数据类型; 5. 删除列 alter table 表名 drop 列名; 4. D(Delete):删除 * drop table 表名; * drop table if exists 表名 ;DML:增删改表中数据1. 增加数据: * 语法: * insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n); * 留神: 1. 列名和值要一一对应。 2. 如果表名后,不定义列名,则默认给所有列增加值 insert into 表名 values(值1,值2,...值n); 3. 除了数字类型,其余类型须要应用引号(单双都能够)引起来2. 删除数据: * 语法: * delete from 表名 [where 条件] * 留神: 1. 如果不加条件,则删除表中所有记录。 2. 如果要删除所有记录 1. delete from 表名; -- 不举荐应用。有多少条记录就会执行多少次删除操作 2. TRUNCATE TABLE 表名; -- 举荐应用,效率更高 先删除表,而后再创立一张一样的表。3. 批改数据: * 语法: * update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件]; * 留神: 1. 如果不加任何条件,则会将表中所有记录全副批改。DQL:查问表中的记录 select * from 表名;1. 语法: select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定2. 根底查问 1. 多个字段的查问 select 字段名1,字段名2... from 表名; * 留神: * 如果查问所有字段,则能够应用*来代替字段列表。 2. 去除反复: * distinct 3. 计算列 * 个别能够应用四则运算计算一些列的值。(个别只会进行数值型的计算) * ifnull(表达式1,表达式2):null参加的运算,计算结果都为null * 表达式1:哪个字段须要判断是否为null * 如果该字段为null后的替换值。 4. 起别名: * as:as也能够省略 3. 条件查问 1. where子句后跟条件 2. 运算符 * > 、< 、<= 、>= 、= 、<> * BETWEEN...AND * IN( 汇合) * LIKE:含糊查问 * 占位符: * _:单个任意字符 * %:多个任意字符 * IS NULL * and 或 && * or 或 || * not 或 ! -- 查问年龄大于20岁 SELECT * FROM student WHERE age > 20; SELECT * FROM student WHERE age >= 20; -- 查问年龄等于20岁 SELECT * FROM student WHERE age = 20; -- 查问年龄不等于20岁 SELECT * FROM student WHERE age != 20; SELECT * FROM student WHERE age <> 20; -- 查问年龄大于等于20 小于等于30 SELECT * FROM student WHERE age >= 20 && age <=30; SELECT * FROM student WHERE age >= 20 AND age <=30; SELECT * FROM student WHERE age BETWEEN 20 AND 30; -- 查问年龄22岁,18岁,25岁的信息 SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25 SELECT * FROM student WHERE age IN (22,18,25); -- 查问英语问题为null SELECT * FROM student WHERE english = NULL; -- 不对的。null值不能应用 = (!=) 判断 SELECT * FROM student WHERE english IS NULL; -- 查问英语问题不为null SELECT * FROM student WHERE english IS NOT NULL; -- 查问姓马的有哪些? like SELECT * FROM student WHERE NAME LIKE '马%'; -- 查问姓名第二个字是化的人 SELECT * FROM student WHERE NAME LIKE "_化%"; -- 查问姓名是3个字的人 SELECT * FROM student WHERE NAME LIKE '___'; -- 查问姓名中蕴含德的人 SELECT * FROM student WHERE NAME LIKE '%德%';

August 4, 2020 · 3 min · jiezi

关于sql:Trainee0731-SQL简介及MySQL80的安装

SQL概述什么是SQL? SQL(Structured Query Language)是一种简洁易用的关系数据库语言合乎ANSI规范的计算机语言Oracle、SQL Server、MySQL、PostgreSQL等都实现了SQL语言Dbase、Access等局部实现了SQL语言HTML中嵌入SQL语句能够通过WWW拜访数据库在C、Java等能够嵌入SQL语句SQL能做什么? SQL 面向数据库执行查问、可从数据库取回数据SQL 可在数据库中插入、更新、删除数据SQL 可创立新数据库SQL 可在数据库中创立新表、存储过程和视图SQL 能够设置表、存储过程和视图的权限SQL的DML与DDL把SQL分为两个局部:数据操作语言DML(Data Manipulation Language)和数据定义语言DDL(Data Definition Language)。 查问和更新指令形成了SQL 的DML 局部 SELECT - 从数据库表中获取数据UPDATE - 更新数据库表中的数据DELETE - 从数据库表中删除数据INSERT INTO - 向数据库表中插入数据数据定义语言(DDL)可创立或删除表格,也能够定义索引(键)、规定表之间的链接,以及施加表间的束缚。 SQL中最重要的DDL语句 create database(table) - 创立新数据库/表alter database(table) - 批改数据库/表drop database(table) - 删除数据库/表create index - 创立索引(搜寻键)drop index - 删除索引SQL语法不分大小写! MySQL简介MySQL由瑞典T.c.X公司开发,最早开始于1979年。 MySQL是一个客户机/服务器构造的实现 须要一个服务器守护程序mysqld和客户程序MySQL特点 反对多用户、多线程,能在多平台应用源码凋谢执行性能高,运行速度快,容易应用为用户提供了一个绝对简略的解决方案装置下载资源进入官网下载页面,抉择本人零碎、须要的MySQL版本和装置办法(利用程序安装或zip包):出于集体习惯,抉择zip包的办法。 将zip解压到本人想要的地位即可。 配置环境变量右键此电脑 ➡ 属性 ➡ 高级零碎设置 ➡ 环境变量:编辑零碎变量中的Path变量,新建: MySQL的bin文件夹门路,比方我的:D:\Developer\MySQL\mysql-8.0.21-winx64\bin装置以管理员身份运行cmd窗口: 进入MySQL的bin目录: 装置MySQL: 输出mysqld -installby the way,移除MySQL服务的命令是:mysqld -remove初始化: 输出mysqld --initialize ...

July 31, 2020 · 1 min · jiezi

关于sql:伴鱼数据库选型的思考为什么我们-all-in-TiDB

作者:伴鱼技术团队 技术选型是由技术方向和业务场景 trade-off 决定的,脱离业务场景来说技术选型是没有任何意义的,所以本文只是论述了伴鱼技术团队数据库选型的过程,这并不是 MySQL、MongoDB 和 TiDB 之间间接的比拟,只能阐明 TiDB 更适宜伴鱼的业务场景和技术布局,另外因为 TiDB 是十分新的数据库技术,所以这也能体现出伴鱼技术团队对新技术的态度、技术后发优势的了解、老本与效率的衡权和技术生态与红利的思考。 为什么放弃 MongoDB?伴鱼是 2015 年成立的,那个时候 NoSQL 还如日中天,关系型数据库为了应酬海量的数据只能业务侵入式的分库分表,尽管 Google 在 2012 年公布了 NewSQL 数据库 Spanner 的论文,然而工业界还没有一款能够应用的 NewSQL 数据库,综合过后的各种状况,伴鱼抉择的是 MongoDB。 不过,在 2015 年到 2017 年之间,对于伴鱼来说 MongoDB 的确是一个上佳之选,次要有以下几个方面的起因: 开发更高效:公司初期处于探索期,产品迭代十分快,MongoDB 是 NoSQL 数据库,不须要做建库建表等 DDL 操作,特地在产品疾速迭代,须要频繁增减字段的时候就更高效,当然这个也是有代价的,从实质上来说,MongoDB 是读模式,它简直不查看写入的内容是否非法,对数据 Schema 的解释是在应用程序的代码中,导致写入数据的约束性是没有保障的。运维更高效:过后公司研发非常少,这段时间整个后端只有两个工程师,没有专职的运维和 DBA ,然而 MongoDB 的单机性能比 MySQL 要高不少,岂但对数据库的运维老本要低不少,并且过后除了几个热点库外,其余的库 MongoDB 能够间接扛住流量压力,省去了两头的 Cache 层,让开发和运维都更高效。有事务需要的场景不多:过后应用的是 MongoDB 2.x 和 3.x,只提供了数据一致性的抉择(强一致性、枯燥一致性和最终一致性)和原子操作,在多数的几个场景,比方交易相干的场景,通过抉择强一致性和原子操作,再在应用层实现 MVCC 的机制,能够满足简略的事务需要。总体来说,在伴鱼产品的探索期,为了效率就义一点数据约束性和事务能力是值得的,然而 2017 年底伴鱼产品方向比拟明确后,业务场景从探索期转变到疾速发展期,对数据库的需要从效率优先转变为效率、事务能力与生态并重: 有事务需要的场景急增:事务场景从最后与钱相干的交易扩大到一些虚构货币,并且因为并发量的减少,之前没有事务保障的场景呈现竞争的状况越来越多,还在应用层通过 MVCC 机制实现简略的事务是十分低效的,并且在应用层实现事务的正确性也是很难保障的。(一个乏味的故事:Jeff Dean 已经说过本人对 Bigtable 最悔恨的事件是没有提供跨行事务反对,导致业务就会在下层希图本人搞事务,并且业务实现的分布式事务大部分都是错的,所以在起初的 Spanner 数据库中 Jeff Dean 间接提供了官网分布式事务反对。)对大数据生态的需要急增:在产品探索期的时候,也有很强的数据分析需要,不过过后数据总量小,在 MongoDB 的暗藏从库中间接剖析就足够了,然而产品疾速发展期,数据量急剧减少,在 OLTP 数据库中进行 OLAP 操作曾经力不从心了。然而通过大数据生态来进行数据分析,对于 MongoDB 来说有一个十分残暴的事实,根本所有的大数据生态都是围绕 MySQL 生态打造的,如果想接入 MongoDB 的数据,意味着须要从新大量造轮子。对数据约束性的要求更高:因为业务疾速的倒退,服务可能会呈现多人保护和移交的状况,如果存储的数据没有束缚,意味着存储的数据 Schema 是不可控的,这很容易让前面参加的工程师解体和掉进坑里,这个时候数据的约束性变成是一个更高优良级的需要,关系数据库的写模式变成更好的抉择。到产品疾速发展期,因为业务场景对数据库的需要曾经产生了很大的扭转,所以在这个时候,伴鱼技术团队开始审慎思考数据库从新选型的问题,咱们现实型的数据库是这样的: ...

July 31, 2020 · 3 min · jiezi

关于sql:推荐几个sql在线练习网站

零根底 次要面向齐全没根底的同学学sql概念常识的话能够看看数据库的书/C语言网/菜鸟runoob挑一个看一遍就差不多了。晋升 晋升熟练度最好的办法就是多练。牛客网乐扣书的话,《mysql必知必会》,《MYSQL技术底细》等飞升目前我还处于晋升阶段,所以给不了倡议,我猜想对更偏差效率,更会向底层靠。 牛客网试题解答示例比方:不必order by查当日第二大:这种作法是否想得到呢? SELECT e.emp_no,s.salary,e.last_name,e.first_nameFROM employees eJOIN salaries sON e.emp_no = s.emp_noAND s.to_date='9999-01-01'AND s.salary =(SELECT s1.salary FROM salaries s1 JOIN salaries s2 ON s1.salary <= s2.salary AND s1.to_date='9999-01-01' AND s2.to_date='9999-01-01' GROUP BY s1.salary HAVING count(DISTINCT s2.salary)=2);最初: 刷题要多看他人的题解站在伟人的肩膀上,视线会更加宽阔。

July 27, 2020 · 1 min · jiezi

关于sql:推荐几个sql在线练习网站

零根底 次要面向齐全没根底的同学学sql概念常识的话能够看看数据库的书/C语言网/菜鸟runoob挑一个看一遍就差不多了。晋升 晋升熟练度最好的办法就是多练。牛客网乐扣书的话,《mysql必知必会》,《MYSQL技术底细》等飞升目前我还处于晋升阶段,所以给不了倡议,我猜想对更偏差效率,更会向底层靠。 牛客网试题解答示例比方:不必order by查当日第二大:这种作法是否想得到呢? SELECT e.emp_no,s.salary,e.last_name,e.first_nameFROM employees eJOIN salaries sON e.emp_no = s.emp_noAND s.to_date='9999-01-01'AND s.salary =(SELECT s1.salary FROM salaries s1 JOIN salaries s2 ON s1.salary <= s2.salary AND s1.to_date='9999-01-01' AND s2.to_date='9999-01-01' GROUP BY s1.salary HAVING count(DISTINCT s2.salary)=2);最初: 刷题要多看他人的题解站在伟人的肩膀上,视线会更加宽阔。

July 27, 2020 · 1 min · jiezi

关于sql:SQL判断是否存在还在用-count-操作试试这条-SQL-语句性能杠杠的

起源 | https://urlify.cn/JjYBJn 依据某一条件从数据库表中查问 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要select count(*) 呢? 无论是刚入道的程序员新星,还是精湛疆场多年的程序员老白,都是判若两人的count. 目前少数人的写法屡次 review 代码时,发现如现景象: 业务代码中,须要依据一个或多个条件,查问是否存在记录,不关怀有多少条记录。广泛的SQL及代码写法如下 SQL写法:SELECT count(*) FROM table WHERE a = 1 AND b = 2Java写法:int nums = xxDao.countXxxxByXxx(params);if ( nums > 0 ) { //当存在时,执行这里的代码} else { //当不存在时,执行这里的代码}是不是感觉很OK,没有什么问题 优化计划举荐写法如下: SQL写法:SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1Java写法:Integer exist = xxDao.existXxxxByXxx(params);if ( exist != NULL ) {  //当存在时,执行这里的代码} else {  //当不存在时,执行这里的代码}SQL不再应用count,而是改用LIMIT 1,让数据库查问时遇到一条就返回,不要再持续查找还有多少条了 业务代码中直接判断是否非空即可 总结依据查问条件查出来的条数越多,性能晋升的越显著,在某些状况下,还能够缩小联结索引的创立。 举荐浏览十分钟入门RocketMQSpring Boot 构建多租户 SaaS 平台核心技术指南Redis 缓存和MySQL数据一致性计划详解Nginx 限流配置深刻探秘 Netty、Kafka中的零拷贝技术!学习材料分享12 套 微服务、Spring Boot、Spring Cloud 核心技术材料,这是局部材料目录: Spring Security 认证与受权Spring Boot 我的项目实战(中小型互联网公司后盾服务架构与运维架构)Spring Boot 我的项目实战(企业权限治理我的项目))Spring Cloud 微服务架构我的项目实战(分布式事务解决方案)...公众号后盾回复arch028获取材料:

July 26, 2020 · 1 min · jiezi

关于sql:给一句-SQL-就能做多维分析

【摘要】 多维分析程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷,去乾学院看个到底:给一句 SQL 就能做多维分析!《把 Excel 透视表搬到 WEB 上》咱们以 Excel 文件数据集为例,介绍了如何把 Excel 的数据透视表嵌入到俺的应用程序中。爱学习的同学会问了,Excel 数据透视表能够应用 Excel 里取到的任何数据,比方数据库取数,你们能间接从数据库取数做剖析吗?Yes,I Can! 俺的程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷! 好了,言归正传,注释马上开始! 定义物理数据源增加 SQL 数据集时首要任务就是先在 [web 利用根目录]/WEB-INF/raqsoftConfig.xml 中定义好要应用的物理数据源。 <DBList><DB name="dqldemo"><property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property><property name="driver" value="org.hsqldb.jdbcDriver" ></property><property name="type" value="13" ></property><property name="user" value="sa" ></property><property name="password" ></property>… …</DB>… …</DBList> <DBList><DB name="dqldemo"><property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property><property name="driver" value="org.hsqldb.jdbcDriver" ></property><property name="type" value="13" ></property><property name="user" value="sa" ></property><property name="password" ></property>… …</DB>… …</DBList> 界面增加 SQL 数据集物理数据源创立好后,接下来最重要的一步就是增加 SQL 数据集了。只需抉择物理数据源,写上 SQL 语句,点击查问数据,缓存入文件保留就 ok 了!没错,就是这么不便! 数据集创立实现后万事俱备只欠东风,接下来就能够开始多维分析的体验之旅了。 点击【增加报表】,抉择数据集,填写报表名称【确定】,齐活! 数据集有了,剖析指标有了,当初就能够任性拖拽你想要查问的指标了,对 SQL 数据集的剖析也能像文件剖析从单机一步跃升 WEB 环境了,是不是又找到了倍儿爽的感觉?哈哈 ...

July 24, 2020 · 2 min · jiezi

关于sql:给一句-SQL-就能做多维分析

【摘要】 多维分析程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷,去乾学院看个到底:给一句 SQL 就能做多维分析!《把 Excel 透视表搬到 WEB 上》咱们以 Excel 文件数据集为例,介绍了如何把 Excel 的数据透视表嵌入到俺的应用程序中。爱学习的同学会问了,Excel 数据透视表能够应用 Excel 里取到的任何数据,比方数据库取数,你们能间接从数据库取数做剖析吗?Yes,I Can! 俺的程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷! 好了,言归正传,注释马上开始! 定义物理数据源增加 SQL 数据集时首要任务就是先在 [web 利用根目录]/WEB-INF/raqsoftConfig.xml 中定义好要应用的物理数据源。 <DBList><DB name="dqldemo"><property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property><property name="driver" value="org.hsqldb.jdbcDriver" ></property><property name="type" value="13" ></property><property name="user" value="sa" ></property><property name="password" ></property>… …</DB>… …</DBList> <DBList><DB name="dqldemo"><property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property><property name="driver" value="org.hsqldb.jdbcDriver" ></property><property name="type" value="13" ></property><property name="user" value="sa" ></property><property name="password" ></property>… …</DB>… …</DBList> 界面增加 SQL 数据集物理数据源创立好后,接下来最重要的一步就是增加 SQL 数据集了。只需抉择物理数据源,写上 SQL 语句,点击查问数据,缓存入文件保留就 ok 了!没错,就是这么不便! 数据集创立实现后万事俱备只欠东风,接下来就能够开始多维分析的体验之旅了。 点击【增加报表】,抉择数据集,填写报表名称【确定】,齐活! 数据集有了,剖析指标有了,当初就能够任性拖拽你想要查问的指标了,对 SQL 数据集的剖析也能像文件剖析从单机一步跃升 WEB 环境了,是不是又找到了倍儿爽的感觉?哈哈 ...

July 24, 2020 · 2 min · jiezi

关于sql:第17问如何评估-alter-table-的进度

问题咱们执行 alter table 语句后,常常面临“跑又跑不完,杀又不敢杀”的困境。 如果能评估 alter table 的进度就幸福多了。 试验MySQL官网曾经给出了文档:https://dev.mysql.com/doc/ref...,咱们来实际一下: 先建个数据库: 咱们设置了一些跟 performance_schema 相干的参数,开启了查看进度必要的性能。 还是依照之前试验 11的技巧,疾速造一些数据: 反复执行 insert,让表中有足够数据: 咱们来跑一个alter table: 在另一个 session 中,执行 SQL 查看进度: 看起来 SQL 比较复杂,咱们先来看看成果: 这里列出了正在执行的 DDL SQL,进度评估,以后运行语句的工夫,和估算的剩余时间。 一直获取进度: 能够看到,估算的剩余时间不是齐全准确,在整个过程中,进度在不停被评估。不过这种精确度对于咱们也足够用了。 咱们来看看评估的次要原理: 在这张表里,MySQL 提供了如下信息: DDL 语句运行的以后阶段以后阶段的开始工夫和完结工夫,以后阶段未完结时,完结工夫为以后工夫父事件 ID,语句运行的各个阶段,会具备雷同的父事件 ID工作量评估,MySQL 将 DDL 的运行过程拆成一个一个工作包,这里提供了曾经实现的工作包数量和估算的工作包总数量,两者的比值即为以后进度(留神:这里的工夫是以后阶段的工夫,而工作量评估是整个语句的工作量)这下咱们应用的评估 SQL 就不难看懂了: 附上评估语句的文字版: select stmt.SQL_TEXT as sql_text, concat(WORK_COMPLETED, '/' , WORK_ESTIMATED) as progress, (stage.TIMER_END - stmt.TIMER_START) / 1e12 as current_seconds, (stage.TIMER_END - stmt.TIMER_START) / 1e12 * (WORK_ESTIMATED-WORK_COMPLETED) / WORK_COMPLETED as remaining_seconds from events_stages_current stage, events_statements_current stmt where stage.THREAD_ID = stmt.THREAD_ID and stage.NESTING_EVENT_ID = stmt.EVENT_ID;小贴士必定会有同学问:那开启 performance_schema 会不会影响性能呢?答:在美妙的生存背后,不要因噎废食,多用 1% 的 CPU,不会耗太多电的。对于 MySQL 的技术内容,你们还有什么想晓得的吗?连忙留言通知小编吧! ...

July 24, 2020 · 1 min · jiezi

关于sql:MySQL排名函数实现

本文出处MySQL排名函数实现转载请阐明出处当初有个需要对所有学生分数进行排名,并且列出名次。刚看到这个需要,我有点懵逼,齐全没有思路????,为什么难一点需要,我就不会做呢???? 去网上查问材料,把所有实现都列出来,全副都要学会。 数据库筹备创立一个分数表s_score CREATE TABLE `s_score` ( `id` int NOT NULL AUTO_INCREMENT, `score` int NOT NULL DEFAULT 0, `name` varchar(20) CHARACTER SET utf8mb4 NULL, PRIMARY KEY (`id`));插入数据 INSERT INTO `s_score` (`name`, `score`) VALUES('张三', 80),('小明', 90),('小红', 60),('李四', 70),('赵武', 80),('梁晨', 87),('小绿', 69),('威廉', 69),('大卫', 91),('王五', 96),('赵六', 96),('小五', 80),('小龙', 88);一般实现在MySQL8.0推出Rank排名函数RANK,齐全反对这种需要,然而必须MySQL8.0 以上版本才反对这个个性。8.0以下的版本有什么办法实现呢,应用用户变量,记录名次。用户变量:以"@"开始,模式为"@var_name",以辨别用户变量及列名。它能够是任何随机的,复合的标量表达式,只有其中没有列指定。上面写一个小例子,展现如何应用用户变量 select @a:=1 a,@b:=@a+1 b执行后果 ab12:= 是赋值的意思,与编程语言赋值有点区别。上面开始展现应用简略SQL实现RANK排名函数成果 用户变量简略实现名次显示SELECT name,score, @rank:=@rank+1 `rank` from s_score s,(select @rank:=0) q ORDER BY score descnamescorerank赵六961王五962大卫913小明904小龙885梁晨876小五807张三808赵武809李四7010威廉6911小绿6912小红6013并排名次展现当初还有一个问题,呈现分数雷同,并列排名,名次应该雷同。咱们应用一个temp变量来记录前一个分数值,判断后面分数是否与以后相等,相等间接返回上一个排名状况,否则排名+1。 ...

July 22, 2020 · 1 min · jiezi

SQL-Exists-⚡️Group-by-⚡️Case-when-⚡️Having-⚡️常用函数

EXISTS用法tableaaid aNAME 1 A12 A23 A3tablebbID AID bNAME1 1 B12 2 B2 3 2 B3这是俩张表... select * from tablea awhere EXISTS (select * from tableb b where a.aid = b.aid ) select * from tablea awhere EXISTS (select * from tableb b where a.aid = 1 ) select * from tablea awhere EXISTS (select * from tableb b where b.aid = 1 ) 上面三条语句的返回后果别离是: 1 A12 A2============================1 A1============================1 A12 A23 A3能够这么了解能够看成后面和前面的 双层 for循环exists前面如果的语句, 每次执行 如果返回true, 后面的语句就会执行,如果每次执行返回false, 后面的语句就不执行。 就这么简略 ...

July 15, 2020 · 3 min · jiezi

职场小白关联表查询方式

前言设想场景:小白初入职场,看到很多数据库的代码发现都不分明,急哭小白了,急急忙忙的去百度,收集到的材料很多,也很迷,乌七八糟的都是 虫虫:为了不便小白 虫虫把关联表的查问形式总结了 关联查问品种等值连贯、天然连贯、内连贯、自连贯、左外连贯、右外连贯、全连贯 试验用表本次用到的表有test表和user表,上面是两个表的sql代码 SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for test-- ----------------------------DROP TABLE IF EXISTS `test`;CREATE TABLE `test` ( `location_id` int(11) DEFAULT NULL, `location_name` varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL, INDEX `name_index`(`location_name`) USING BTREE) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;-- ------------------------------ Records of test-- ----------------------------INSERT INTO `test` VALUES (1, 'UK');INSERT INTO `test` VALUES (2, 'US');INSERT INTO `test` VALUES (3, 'Chain');SET FOREIGN_KEY_CHECKS = 1;SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL, `username` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL, `birthday` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL, `sex` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL, `location_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;-- ------------------------------ Records of user-- ----------------------------INSERT INTO `user` VALUES (1, 'Tom', '1', 'boy', 'UK');INSERT INTO `user` VALUES (2, 'Bob', '2', 'boy', 'US');INSERT INTO `user` VALUES (4, 'Worm', '4', 'boy', 'Chain');SET FOREIGN_KEY_CHECKS = 1;等值连贯应用”=”关系将表连接起来的查问,其查问后果中列出被连贯表中的所有列,包含其中的反复列。 ...

July 13, 2020 · 2 min · jiezi

SQL循环语句

前言有时咱们须要增加很多测试的数据 在不应用Java的状况下 如何用SQL语句进行增加 ? 本文将讲述单层循环,双层循环,以及日期循环 单层循环测试表代码 create table test(location_id int ,location_name varchar(10));再编写存储过程,其中波及到循环的应用。咱们欲通过这个存储过程,来达到往表中插入数据的成果 drop procedure if exists insert_while;delimiter //create procedure insert_while()begin declare i int default 1; while i<10 do insert into test values(i,concat('bookworm',i)); set i=i+1; end while; commit;end //delimiter ;上面是输入后果: mysql> select * from test;Empty set (0.00 sec)mysql> call test_loop();Query OK, 0 rows affected (0.35 sec)mysql> select * from test;+-------------+---------------+| location_id | location_name |+-------------+---------------+| 1 | bookworm1 || 2 | bookworm2 || 3 | bookworm3 || 4 | bookworm4 || 5 | bookworm5 || 6 | bookworm6 || 7 | bookworm7 || 8 | bookworm8 || 9 | bookworm9 |+-------------+---------------+9 rows in set (0.00 sec)drop procedure if exists insert_while:如果存在函数insertwhile先删除它 ...

July 10, 2020 · 2 min · jiezi

openGuassDB介绍及安装实践

一、openGuass介绍 openGaussDB(openGauss)是华为云深度交融在数据库畛域多年的教训,联合企业级场景需要,推出的新一代企业级分布式数据库,反对集中式与分布式两种部署状态。在撑持传统业务的根底上,继续构建竞争力个性,为企业面向5G时代的挑战,提供了有限可能。(来自华为云官网)。openGauss 于2019年9月19日正式开源,于2020年6月30日正式凋谢源代码,并成立openGuass社区。官方网站地址 https://opengauss.org。 openGuass 底层框架源自 PostgreSQL,内建 PostgreSQL 版本为 9.2.4 版本。版本定义在include/postgresql/server/pg_config.h /* PostgreSQL version as a string */#define PG_VERSION "9.2.4"兼容 Oracle 数据类型和函数如varchar2(n) 数据类型定义在 include/ecpgtype.h enum ECPGttype { ECPGt_varchar2}add_months()定义在include/postgresql/server/utils/timestamp.h extern Datum add_months(PG_FUNCTION_ARGS);1等。 openGauss 也是一款分布式数据库,外部实现采纳pgxc架构。 二、版本及个性介绍 openGauss-1.0.0 为 openGuass 的第一个版本。 版本介绍数据类型,表,长期表,视图,索引,序列,存储过程,函数,触发器等SQL性能;数据类型,表,长期表,视图,索引,序列,存储过程,函数,触发器等SQL性能;认证,权限治理,网络通信平安,数据库审计等平安个性;主备双机,物理备份,逻辑备份,极致RTO高可用性能;大并发链接,分区,plan hint,NUMA化优化高性能能力。 个性介绍规范SQL反对反对规范的SQL92/SQL99/SQL2003/SQL2011标准,反对GBK和UTF-8字符集,反对SQL规范函数与剖析函数,反对存储过程。数据库存储管理性能反对表空间,能够把不同表布局到不同的存储地位。提供主备双机事务反对ACID个性、单节点故障复原、双机数据同步,双机故障切换等。利用程序接口反对规范JDBC 4.0的个性、ODBC 3.5个性。管理工具提供装置部署工具、实例启停工具、备份复原工具。平安治理反对SSL平安网络连接、用户权限治理、明码治理、平安审计等性能,保障数据库在管理层、应用层、零碎层和网络层的安全性。 三、根本架构 openGuass反对SQL 2003 语法规范,反对主备部署的高可用关系型数据库。适宜如下场景: 多种存储模式反对合乎业务场景NUMA 化数据结构反对高性能主备模式,CRC校验反对高可用 利用场景:交易型利用大并发、大数据量、以联机事务处理为主的交易型利用,如电商、金融、O2O、电信CRM/计费等,利用可按需抉择不同的主备部署模式。物联网数据在工业监控和近程管制、智慧城市的延展、智能家居、车联网等物联网场景下,传感监控设施多,采样率高,数据存储为追加模型,操作和剖析并重的场景。 四、装置指南 openGauss 反对单机装置和主备环境装置,此处示例仅仅演示单机装置。单机环境介绍:CPU:AMD-2700x内存:32GCPU核数:8核 4.1 软件依赖环境 #yum install -y libaio-devel\flex \bison \ncurses-devel \glibc-devel \patch \lsb_release4.2 敞开防火墙和SELinux #systemctl stop firewalld#systemctl disable firewalld#setenforce 0#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config4.3 禁用SWAP内存 ...

July 9, 2020 · 5 min · jiezi

故障分析-MySQL-优化案例-select-count

作者:xuty本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。本文关键字:count、SQL、二级索引一、故事背景项目组联系我说是有一张 500w 左右的表做select count(*)速度特别慢。 二、原 SQL 分析Server version: 5.7.24-log MySQL Community Server (GPL)SQL 如下,仅仅就是统计 api_runtime_log 这张表的行数,一条简单的不能再简单的 SQL: select count(*) from api_runtime_log;我们先去运行一下这条 SQL,可以看到确实运行很慢,要 40 多秒左右,确实很不正常~ mysql> select count(*) from api_runtime_log;+----------+| count(*) |+----------+| 5718952 |+----------+1 row in set (42.95 sec)我们再去看下表结构,看上去貌似也挺正常的~存在主键,表引擎也是 InnoDB,字符集也没问题。 CREATE TABLE `api_runtime_log_copy` ( `BelongXiaQuCode` varchar(50) DEFAULT NULL, `OperateUserName` varchar(50) DEFAULT NULL, `OperateDate` datetime DEFAULT NULL, `Row_ID` int(11) DEFAULT NULL, `YearFlag` varchar(4) DEFAULT NULL, `RowGuid` varchar(50) NOT NULL, ...... `apiid` varchar(50) DEFAULT NULL, `apiname` varchar(50) DEFAULT NULL, `apiguid` varchar(50) DEFAULT NULL, PRIMARY KEY (`RowGuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8三、执行计划通过执行计划,我们看下是否可以找到什么问题点。 ...

July 7, 2020 · 3 min · jiezi

12800字SQL-语法速成手册干货满满建议收藏

作者:静默虚空原文:https://juejin.im/post/5c7e52... 本文针对关系型数据库的一般语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。 一、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。列(column) - 表中的一个字段。所有表都是由一个或多个列组成的。行(row) - 表中的一个记录。主键(primary key) - 一列(或一组列),其值能够唯一标识表中每一行。SQL 语法SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。SQL 语法结构 SQL 语法结构包括: 子句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。)表达式 - 可以产生任何标量值,或由列和行的数据库表谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。查询 - 基于特定条件检索数据。这是 SQL 的一个重要组成部分。语句 - 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。SQL 语法要点SQL 语句不区分大小写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。例如:SELECT 与 select 、Select 是相同的。 多条 SQL 语句必须以分号(;)分隔。处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成一行,也可以分写为多行。-- 一行 SQL 语句UPDATE user SET username='robot', password='robot' WHERE username = 'root';-- 多行 SQL 语句UPDATE userSET username='robot', password='robot'WHERE username = 'root';SQL 支持三种注释## 注释1-- 注释2/* 注释3 */SQL 分类数据定义语言(DDL)数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。 ...

July 4, 2020 · 5 min · jiezi

SQL面试题1-Mysql或者Oracle数据库

如下有三道面试题: 创建两张表格: CREATE TABLE CUSTOMERS(ID NUMBER(2),NAME VARCHAR2(10));CREATE TABLE ORDERS(ID NUMBER(2),CUSTOMERID NUMBER(2));SELECT * FROM CUSTOMERS;INSERT INTO CUSTOMERS VALUES(1,'JOE');INSERT INTO CUSTOMERS VALUES(2,'HENRY');INSERT INTO CUSTOMERS VALUES(3,'SAM');INSERT INTO CUSTOMERS VALUES(4,'MAX');SELECT * FROM ORDERS;INSERT INTO ORDERS VALUES(1,3);INSERT INTO ORDERS VALUES(2,1);解题答案: /* 某网站包含两张表,Customer和Orders表。编写一个SQL查询。找出所有从不订购任何东西的用户。*/SELECT * FROM CUSTOMERS WHERE ID NOT IN(SELECT CUSTOMERID FROM ORDERS); 创建两张表格: CREATE TABLE T_EMAIL(ID NUMBER(2) PRIMARY KEY,EMAIL VARCHAR2(20));SELECT * FROM T_EMAIL;INSERT INTO T_EMAIL VALUES(1,'ganzexin@163.com');INSERT INTO T_EMAIL VALUES(2,'ganzexin@163.com');INSERT INTO T_EMAIL VALUES(3,'1395520340@qq.com');解题答案: ...

June 28, 2020 · 1 min · jiezi

RedGate-Sql-Compare使用命令行进行数据库同步

@TOC 养成良好习惯第一次在CSDN上面写博客,我有些强迫症,也是一个重度的工具依赖者,在工作中使用了各种各样的工具,喜欢发现更多黑科技和高科技产品,这都是废话,只是为了养成良好的习惯,写个开头。 关于RedGate红门是比较出名的公司了,相信大家都知道,尤其是在数据库上,绝对是sql server中的高富帅,平时使用最多的就是RedGate的sql工具网上,网上有一位前辈已经有详细的说明,我就不单独说明了。本文主要是提供一种使用命令行模式,来进行数据库同步的方法,官网说的也很明确,你可以使用这种方式,来自动的进行数据库的同步,当然实际工作可能会有更多的用途。下面直接上代码: //数据库的完全同步cd "C:\Program Files\Red Gate\SQL Compare 8"sqlcompare /scr1:"C:\Scripts\WidgetScripts" /db2:WidgetTest /o:Default /Report:"C:\SchemaDiffReport.html" /ReportType:Interactive /ScriptFile:"C:\SchemaSyncScript.sql" /synccd "C:\Program Files\Red Gate\SQL Data Compare 8"sqldatacompare /scr1:"C:\Scripts\WidgetScripts" /db2:WidgetTest /o:Default /Exclude:table:WidgetPurchases /ScriptFile:"C:\DataSyncScript.sql" /sync /v > C:\DataDeploy.txt //注意:sqldatacompare 后面的命令 需要在一条命令中执行你可以将其保存为bat文件,在C# 应用程序中就可以自动的运行同步数据库了,狠方便实用。 下面附上一个实际实用例子供参考: //数据库数据的同步cd C:\Program Files (x86)\Red Gate\SQL Data Compare 13sqldatacompare /project:"D:\test.sdc" /o:Default /Force /ScriptFile:"D:\DataSyncScript.sql" /synchronize /makebackup /backupcompression:1 /v /out:"D:\DataDeploy.txt" //注意:sqldatacompare 后面的命令 需要在一条命令中执行其中的project 文件是 RedGate软件保存的文件,如果想要实用命令行,必须是注册版的sql compare才行。附上命令的命令,也可以通过/help 来查看相关命令,具体大家可以登录官网查看,没有代理的话,网速会慢一些,实用这种方式实时同步数据库非常灵活,而且简便,大家可以参考一下。 /AbortOnWarnings:<warning level>/activateSerial:<serial number>/Argfile:<file path>/Assertidentical/Backup1:<file path1>;<file path2>;...;<file pathN>/Backup2:<file path1>;<file path2>;...;<file pathN>/BackupCompression:<compression level>/BackupEncryption/BackupFile:<file name>/BackupFolder:<folder path>/BackupNumberOfThreads:<number of threads>/BackupOverwriteExisting/BackupType:<backup type>/BackupPassword:<password>/BackupPasswords1:<password1>,<password2>,...,<passwordN>/BackupPasswords2:<password1>,<password2>,...,<password1N>/BackupProvider:<backup format>/BackupSet1:<backup set>/BackupSet2:<backup set>/Database1:<database name>/Database2:<database name>/deactivateSerial/empty2/exclude:<type>:<regular expression>/Filter/Force/Help/HTML/IgnoreParserErrors/IgnoreSourceCaseSensitivity/include:<type>:<regular expression>/LogLevel:<level>/MakeBackup/MakeSnapshot:<file name>/Options:<option1>,<option2>,<option3>/Out:<file path>/OutputProject:<file path>/OutputWidth:<columns>/Password1:<password>/Password2:<password>/Project:<file path>/Quiet/Report:<file path>/ReportAllObjectsWithDifferences/ReportType:<report type>/Revision1:<revision>/Revision2:<revision>/ScriptFile:<file path>/Scripts1:<folder>/Scripts2:<folder>/ScriptsFolderXML:<file path>/Server1:<server name>/Server2:<server name>/ShowWarnings/Snapshot1:<file name>/Snapshot2:<file path>/Sourcecontrol1/Sourcecontrol2/Synchronize/SyncScriptEncoding:<script encoding>/TransactionIsolationLevel:<transaction isolation level>/UserName1:<username>/UserName2:<username>/Verbose/VersionUserName1:<username>/VersionUserName2:<username>/VersionPassword1:<password>/VersionPassword2:<password>/AllowIdenticalDatabases/IncludeIdentical:<IncludeIdentical>

June 27, 2020 · 1 min · jiezi

SQL基础入门36题-题目及解题思路

这里涉及聚合函数,分析函数,条件函数,以及自身映射。 一共有以下几张表(EMP,Dept)以及表的结构和下面的36条基础题。 下面我会用*号特定展示,那些比较重要,优先处理。 1.1 列出至少有两个员工的所有部门。 SELECT DEPTNO,COUNT(1)FROM EMPGROUP BY DEPTNOHAVING COUNT(1) >= 2; 1.2 查询工资大于或者等于2000 的员工信息 SELECT * FROM EMP WHERE SAL >= 2000; 1.3 查询至少有两个员工的工资不低于2000的部门编号 SELECT DEPTNO,COUNT(1) FROM EMPWHERE SAL >= 2000GROUP BY DEPTNOHAVING COUNT(1) >= 2; 2.1列出薪金比“SMITH”多的所有员工。 SELECT * FROM EMP WHERE SAL >(SELECT SAL FROM EMP WHERE ENAME = 'SMITH'); 2.2 查询工资 与 SCOTT 相同的员工信息 SELECT * FROM EMP WHERE SAL = (SELECT ENAME FROM EMP WHERE ENAME = 'SCOTT'); ...

June 24, 2020 · 4 min · jiezi

为什么-SQL-查询不是先执行-SELECT-语句

作者:Julia Evans 译者:无明 链接:infoq.cn/article/Oke8hgilga3PTZ3gWvbg很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。 于是我又想到了另一个问题:SQL 查询的执行顺序是怎样的? 好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。 SQL 查询的执行顺序于是我研究了一下,发现顺序大概是这样的。SELECT 并不是最先执行的,而是在第五个。 这张图回答了以下这些问题这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题: 可以在 GRROUP BY 之后使用 WHERE 吗?(不行,WHERE 是在 GROUP BY 之前!)可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后)可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)LIMIT 是在什么时候执行?(在最后!)但数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在以后的文章中解释。 所以: 如果你想要知道一个查询语句是否合法,或者想要知道一个查询语句会返回什么,可以参考这张图;在涉及查询性能或者与索引有关的东西时,这张图就不适用了。混合因素:列别名有很多 SQL 实现允许你使用这样的语法: SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY full_name从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎可以把查询重写成这样: ...

June 18, 2020 · 1 min · jiezi

PostgreSQL中的ACID特性介绍

任何关系型数据库中,ACID 是组成数据库的重要部分,是数据库事务的一组属性,该特性目的主要确保数据库在异常情况下保证数据的有效性。 数据库ACID特性 A(Atomicity)原子性:    事务通常由多个语句组成。原子性保证将每个事务视为单个单元,该事务要么完全成功,要么完全失败。换句话说,如果在一个事务中,任何语句都未能完成,整个事务都会失败,未完成事务中的数据条目在数据库中保持不变。一个原子系统必须保证在任何情况下都具有原子性,包括电源故障,数据库错误和实例奔溃。同时,原子性可以防止在数据库中发生部分数据更新的情况。举一个例子,假设用户USER1 和 USER2 之间进行转账。这之间会进行两个动作,第一个动作,从USER1 账户中划钱;第二个动作,将从USER1账户中划拨的钱保存到 USER2 账户中。原子性在这个过程中可以保证数据库中的状态一致,即意味着从用户 USER1 账户减去(事务失败回滚不变)转账金额,在用户 USER2 账户中加上(事务失败回滚不变)转账金额。    上图中,假设用户USER1 有1000元,USER2用户有500 元,现在用户USER1向用户USER2 进行转账交易500元,如果在系统正常情况下,转账成功,那么 USER1账户的将会减去 500,用户USER2 账户的金额将会增加500。整个过程在事务完成后,数据库中的数据状态也将发生变化,用户USER1 将会被减去500 ,用户USER2将会被加上100,,并最终保持总账户金额一致。否则,用户之间的金额在数据库中保持原有数据状态。 C(Consistency)一致性:    一致性确保事务只能使数据库从一个有效的状态进入到另一种有效的状态,并保证数据库数据最终的状态一致。一致性主要通过定义的一些规则来保证,比如在表对象上定义约束,触发器,级联或者之间组合而成的规则。通过这些规则来防止数据库中的非法事务(异常事务)。主外键主要维护数据库对象之间的参照完整性。例如在上面原子性的示例中,用户USER1 向用户USER2转账,那么就要在事务规则的约束下验证 USER1 + USER2 = 1500的一致有效性。假设在这个事务中,用户 USER1 向用户USER2 转账 500 元,那么用户 USER1 账户减去500,而 USER2 账户却没有变化,那么就要根据验证规则验证用户 USER1 + USER2 最终的状态是否为1500,现在看来,USER1账户转账 500 元,这个事务中用户 USER1 账户已经扣除了500 元,那么用户 USER1 现在的账户上剩余 500 元,对于事务来说,实现了原子性,但是账户验证结果为用户 USER1 + USER2 = 1000 元,这与事务规则验证用户 USER1 + USER2 = 1500 的状态不一致,那么必须要取消这个事务,并将受影响进行转账的事务回滚到事务前的一个状态。如果在一个事务中,存在其它约束、触发器等行为,则在提交事务之前,以相同的验证规则去检查每个更改操作。可能还有其它的约束规则,如要求表中的两列 COL1 和 COL 2必须为整数,那么如果此时输入 COL1 的值为一个浮点数,那么事务将会被取消,如果此列上有触发器,那么将会提示用户。还有在完整性约束的规则下,无论该表是参照表(主实体)或者引用表(子实体),是不允许删除其中一个表中的行,因为表主体之间收到主外键的约束影响。 ...

June 16, 2020 · 2 min · jiezi

sql-常见用法

1. where and having需要的条件 >=2 + 需要使用合计条件; 分析哪些条件,要用合计函数运算;where 中设立不需要合计;得到合计函数;设立group by 和 having 需要的合计函数条件;2. Join 和 Aggregate Function合计条件 + table数量 >= 2 join 的条件(join的类型和条件);合计函数条件(group by / Aggregate Func)Join + group by + Aggregate Func 3. 重复值windows function / distinct / join / group by / having clause ; (找重还是去重);distinct, group by 和 windows Func 去重;找重 : having 和 windows Func;简单粗暴 : 用window function (partial by 和 order by 排序, 然后找重或者去重)。select * from table group by name having (count *) > 2sql : qualifywhere ---> Join ---> **qualify** ---> select 4. 找nthwindows function , max ...

June 16, 2020 · 1 min · jiezi

left-join-执行原理

create table class( class_id varchar(10),class_name varchar(50)) insert into class values (1,'语文');insert into class values (2,'数学');insert into class values (3,'英语'); create table score( class_id varchar(10),Student_id varchar(10),Score int) insert into score values (1,'A001',90);insert into score values (2,'A001',95);insert into score values (1,'A002',80);insert into score values (2,'A002',85);insert into score values (1,'B001',88); select * from classselect * from score --一个课程表,一个成绩表--表数据分布是--成绩表:有三个学生A,B,C,--A,B都有语文和数学成绩,--C只有语文成绩;--A,B,C都没有英语成绩,--课程表,有语文,数学,英语三门课程,没有“体育”这门课程 --如果你对left join足够熟悉的话,先不要看结果,是否可以直接说出下面查询的结果 select * from class A left join score B on A.class_id=B.class_id and A.class_name='语文'select * from class A left join score B on A.class_id=B.class_id and A.class_name='数学'select * from class A left join score B on A.class_id=B.class_id and A.class_name='英语'select * from class A left join score B on A.class_id=B.class_id and A.class_name='体育' ...

June 9, 2020 · 1 min · jiezi

视图

什么是视图?视图是虚拟表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。 为什么要使用视图?一般,应该将视图用于检索。重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施,并且达到了重用SQL语句的目的。 使用视图创建可重用的视图:创建不受特定数据限制的视图是一种好办法。例如,创建的视图返回生产所有产品的客户而不是仅仅是生产TNT2的客户。 创建视图: CREATE VIEW myView ASSELECT id,NAME,part,age FROM tablea;删除视图: DROP VIEW viewname;

June 8, 2020 · 1 min · jiezi

组合查询

Mysql允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并或复合查询。 使用组合查询: 在单个查询中从不同的表返回类似结构的数据对单个表执行多个查询,按单个查询返回数据其中组合查询和多个where条件查询完成的工作相同。 创建组合查询SELECT id,NAME,part,age FROM tablea WHERE age<=30 SELECT id,NAME,part,age FROM tablea WHERE id IN (1,4) SELECT id,NAME,part,age FROM tablea WHERE age<=30 UNIONSELECT id,NAME,part,age FROM tablea WHERE id IN (1,4)从中可以看出union指示MySql执行两条select语句,并把输出组合成单个查询结果集。 也可以使用多条where子句完成相同的功能: SELECT id,NAME,part,age FROM tablea WHERE age<=30 OR id IN (1,4) 2种方法都会自动去除了重复的行。如果确实需要每个条件的匹配行全部出现(包括重复行),则必须使用union all而不是where。 union规则规则: union必须由两条或两条以上的select语句组成,语句之间用关键字union分隔。union中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型。对组合查询结果排序其中只能使用一条order by子句,它必须出现在最后一条select语句之后: SELECT id,NAME,part,age FROM tablea WHERE age<=30 UNIONSELECT id,NAME,part,age FROM tablea WHERE id IN (1,4)ORDER BY id DESC

June 4, 2020 · 1 min · jiezi

联结表

创建联结内联结或者where子句,返回两个表的交集(阴影)部分,ansi sql规范首选inner join语法: SELECT * FROM tableA INNER JOIN tableB ON tableA.id = tableB.id;SELECT * FROM tableA,tableB WHERE tableA.id = tableB.id;结果: 左连接:左表(tableA)的记录将会全部表示出来,而右表(tableB)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。 SELECT * FROM tableA LEFT JOIN tableB ON tableA.id = tableB.id;结果: 右连接:与左(外)连接相反,右(外)连接,左表(tableA)只会显示符合搜索条件的记录,而右表(tableB)的记录将会全部表示出来。左表记录不足的地方均为NULL。 SELECT * FROM tableA RIGHT JOIN tableB ON tableA.id = tableB.id;结果:

June 4, 2020 · 1 min · jiezi

SQL常用语句2

SELECTE.EmployeeID, E.EmployeeName, M.EmployeeName AS Manager FROM Employee_T E, Employee_T M WHERE E.EmployeeSupervisor = M.EmployeeID; [self join, find out all the managing relationships,]SELECTCOUNT(OrderID) as N_APP FROM OrderLine_T WHERE ProductID = 4 AND OrderID IN (SELECTOrderID FROM OrderLine_T WHERE ProductID = 7); [Frequent Item-Pair Calculate the number of times the pair of products with ProductID=4 AND ProductID=7 appear together on the same order. ] SELECTCOUNT(*) AS N_APP FROM OrderLine_T L1, OrderLine_T L2 WHERE L1.OrderID = L2.OrderID AND L1.ProductID = 4 AND L2.ProductID = 7; [same as previous one ] ...

June 1, 2020 · 4 min · jiezi

order-by-优化

写在前面文章涉及到的 customer 表来源于案例库 sakila,下载地址为 http://downloads.mysql.com/do... MySQL 排序方式通过索引顺序扫描直接返回有序数据通过对返回数据进行排序,即 FileSort 排序。所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。FileSort 并不代表通过磁盘文件进行排序,而只是说进行了一个排序操作,至于排序操作是否使用了磁盘文件或临时表取决于 MySQL 服务器对排序参数的设置和需要排序数据的大小。 EXPLAIN 排序分析customer DDL CREATE TABLE `customer` ( `customer_id` smallint unsigned NOT NULL AUTO_INCREMENT, `store_id` tinyint unsigned NOT NULL, `first_name` varchar(45) NOT NULL, `last_name` varchar(45) NOT NULL, `email` varchar(50) DEFAULT NULL, `address_id` smallint unsigned NOT NULL, `active` tinyint(1) NOT NULL DEFAULT '1', `create_date` datetime NOT NULL, `last_update` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`customer_id`), KEY `idx_fk_store_id` (`store_id`), KEY `idx_fk_address_id` (`address_id`), KEY `idx_last_name` (`last_name`), KEY `idx_storeid_email` (`store_id`,`email`), CONSTRAINT `fk_customer_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON DELETE RESTRICT ON UPDATE CASCADE, CONSTRAINT `fk_customer_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON DELETE RESTRICT ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;CREATE DEFINER=`root`@`%` TRIGGER `customer_create_date` BEFORE INSERT ON `customer` FOR EACH ROW SET NEW.create_date = NOW();返回所有用户记录,根据 customer_id 进行排序。因为 customer_id 是主键,记录都是按照主键排好序的,所以无需进行额外的排序操作,直接返回所有数据即可。 ...

May 28, 2020 · 2 min · jiezi

SQL常用语句-1

(CREATE TABLE Order_T ( OrderID NUMBER(5,0) NOT NULL, OrderDate DATE DEFAULT SYSDATE,CustomerID NUMBER(3,0), CONSTRAINT Order_PK PRIMARY KEY (OrderID)); (Default DATE format: DD-MON-YY HH:MI:SS AM/PM(DROP TABLE Order_T; DROP TABLE Customer-T CASCADE CONSTRAINTS;(INSERT INTO Order_T VALUES (12001, '10/16/2015', 99); (DELETE FROM Customer_T WHERE CustomerID = 101;(ALTER TABLE Customer_T MODIFY CustomerAddress VARCHAR2(30);(ALTER TABLE Order_T ADD CONSTRAINT Order_FK FOREIGN KEY (CustomerID) REFERENCES Customer_T(CustomerID);(ALTER TABLE Customer_T ADD (CustomerCity VARCHAR2(20), CustomerState CHAR(2), CustomerPostalCode VARCHAR2(9)); (UPDATE Order_T SET OrderDate = '12/28/2015' WHERE OrderID = 12002;(SELECT AVG(ProductStandardPrice) AS Average_Price FROM Product_T; ...

May 28, 2020 · 3 min · jiezi

sql在线练习

原创网址:https://www.jianshu.com/p/3f2...

May 26, 2020 · 1 min · jiezi