T-SQL:SQL语句处理顺序的坑(4)

我们来详细分析一下sql语句的逻辑处理顺序,首先看下面一条比较完成语句,返回name列指定行数,关键字,我们可能知道必须改进什么,互联网架构技术清单,但对于性能问题,但我们遇到性能问题时

 

+ – * /

select mobile, (mobile + 1)*2 as count_mobile from contacts;

关键字:+-*/

叁,sql优化措施

优化学工业作数据

优化数据布置

优化流程设计

优化sql语句

优化学物理理结构

优化内部存款和储蓄器分配

优化I/O

优化内部存款和储蓄器竞争

优化操作系统

五,什么是好的sql语句

尽心尽力简单,模块化

易读,易维护

节省能源

内存

cpu

环视的数额块要少

少排序

不造成死锁

  1. from 表时  最佳给定 库名和表名  Sales.Orders 
    让表展现表示 不用程序检索。

去除视图 drop view

drop view customeremaillist;

二,sql调优领域

应用程序级调优

sql语句调优

管理转变调优

示例级调优

内存

数据结构

实例配置

操作系统交互

I/O

swap

Parameters

6,sql语句的处理进程

sql语句的多少个处理阶段:

 

金沙国际唯一官网网址 1

解析(PARSE):

自作者批评语法

检查语义和有关的权柄

在共享池中摸索sql语句

统一(ME途观GE)视图定义和子查询

明显实施陈设

绑定(BIND)

在言辞中检索绑定变量

赋值(或另行赋值)

执行(EXECUTE)

运用执行安顿

实践须要的I/O和排序操作

提取(FETCH)

从询问结果中回到记录

供给时实行排序

使用ARRAY FETCH机制

5.select

count(distinct name)

select count(distinct name) from tb_book_tag;

壹,sql品质优化基础方法论

对此成效,大家大概清楚必须创新什么;但对于品质难题,有时我们只怕无从入手。其实,任何总结机应用系统最后队能够归纳为:

cpu消耗

内部存款和储蓄器使用

对磁盘,网络或别的I/O设备的输入/输出(I/O)操作。

读书本文,提出大家已经控制了扎实的互连网架构技术,可参考:互连网架构技术清单

但大家相遇品质难题时,要一口咬住不放的首先点便是“在那二种能源中,是还是不是有哪1种财富达到了有题目标品位”,因为那或多或少能引导大家搞明白“需求优化重构什么”和“如何优化重构它”

金沙国际唯一官网网址 2

二,sql调优领域

采取程序级调优

sql语句调优

管制浮动调优

示例级调优

内存

数据结构

实例配置

操作系统交互

I/O

swap

Parameters

FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
ORDER BY empid, orderyear;

注释

 --this is a comment

关键--加注释,单行注释。

 /* comments */

关键/**/,多行注释。

4,sql优化进度

稳定万分的言辞

检查执行陈设

自小编批评执行布署中优化器的计算消息

解析相关表的记录数、索引景况

改写sql语句、使用HINT、调整目录、表分析

有点sql语句不负有优化的或然,必要优化处理方式

高达最好实践布署

4,sql优化进程

一定有有失常态态的语句

反省实施布置

检查实施布署中优化器的总结消息

浅析相关表的记录数、索引情形

改写sql语句、使用HINT、调整目录、表分析

稍加sql语句不抱有优化的或是,供给优化处理格局

落得最好实践安顿

在仔细分析种种执行顺序代表的意思 (它的莫过于顺序)

where…or…

select * from contacts where name = "fff" or mobile = "d";

关键字:or,组合where子句。

注意:在同时利用and和or时要注意求值顺序,and优先级大于or。因而在其余时候利用具有and和or操作符的where子句时,都应有使用圆括号显明地分组操作符

柒,sql表的中央连接方式

表连接有两种?

sql表连接分成外连接内连接交叉连接。

新建两张表:

表1:student  截图如下:

金沙国际唯一官网网址 3

表二:course  截图如下:

金沙国际唯一官网网址 4

(此时那样建表只是为了演示连接SQL语句,当然实际支出中大家不会那样建表,实际付出中那多个表会有协调不相同的主键。)

一、外连接

外接连可分为:左连接、右连接、完全外接连。

1、左连接  left join 或 left outer join

SQL语句:select * from student left join course on student.ID=course.ID

实践结果:

金沙国际唯一官网网址 5

左外连接包涵left
join左表全体行,假如左表中某行在右表没有相称,则结果中对应行右表的有个别全部为空(NULL).

注:此时我们无法说结果的行数等于左表数据的行数。当然那里查询结果的行数等于左表数据的行数,因为左右两表此时为1对一关乎。

2、右连接  right join 或 right outer join

SQL语句:select * from student right join course on
student.ID=course.ID

实施结果:

金沙国际唯一官网网址 6

右外连接包蕴right
join右表全部行,假诺左表中某行在右表未有相配,则结果中对应左表的壹对全部为空(NULL)。

注:同样此时我们无法说结果的行数等于右表的行数。当然那里查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

三、完全外连接  full join 或 full outer join

SQL语句:select * from student full join course on student.ID=course.ID

实践结果:

金沙国际唯一官网网址 7

统统外接连包涵full
join左右两表中享有的行,假诺右表中某行在左表中一贯不匹配,则结果中对应行右表的壹些全部为空(NULL),要是左表中某行在右表中绝非相称,则结果中对应行左表的有个别全部为空(NULL)。

二、内连接  join 或 inner join

SQL语句:select * from student inner join course on
student.ID=course.ID

施行结果:

金沙国际唯一官网网址 8

inner join 是比较运算符,只回去符合条件的行。

此刻一定于:select * from student,course where student.ID=course.ID

三、交叉连接 cross join

一.概念:未有 WHERE
子句的接力联接将发出连接所涉嫌的表的笛Carl积。第一个表的行数乘以第四个表的行数等于笛卡尔积结果集的分寸。

SQL语句:select * from student cross join course

执行结果:

金沙国际唯一官网网址 9

要是大家在那儿给那条SQL加上WHERE子句的时候比如SQL:select * from student
cross join course where student.ID=course.ID

那会儿将重返符合条件的结果集,结果和inner join所示执行结果壹律。

7,sql表的主题连接格局

表连接有两种?

sql表连接分成外接连、内连接和穿插连接。

新建两张表:

表1:student  截图如下:

 

金沙国际唯一官网网址 3

表贰:course  截图如下:

 

金沙国际唯一官网网址 4

(此时那样建表只是为着演示连接SQL语句,当然实际开销中大家不会这样建表,实际支出中这四个表会有协调差异的主键。)

一、外连接

外接连可分为:左连接、右连接、完全外接连。

1、左连接  left join 或 left outer join

SQL语句:select * from student left join course on student.ID=course.ID

实践结果:

 

金沙国际唯一官网网址 5

左外连接包蕴left
join左表全数行,即便左表中某行在右表未有相称,则结果中对应行右表的①对全体为空(NULL).

注:此时大家不能说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表此时为1对一涉嫌。

2、右连接  right join 或 right outer join

SQL语句:select * from student right join course on
student.ID=course.ID

实施结果:

 

金沙国际唯一官网网址 6

右外连接包罗right
join右表全部行,假使左表中某行在右表未有相配,则结果中对应左表的局地全部为空(NULL)。

注:同样此时大家无法说结果的行数等于右表的行数。当然那里查询结果的行数等于左表数据的行数,因为左右两表此时为一对壹关系。

3、完全外连接  full join 或 full outer join

SQL语句:select * from student full join course on student.ID=course.ID

实践结果:

 

金沙国际唯一官网网址 7

统统外接连包蕴full
join左右两表中享有的行,若是右表中某行在左表中绝非相称,则结果中对应行右表的一部分全部为空(NULL),若是左表中某行在右表中从不相称,则结果中对应行左表的1些全体为空(NULL)。

二、内连接  join 或 inner join

SQL语句:select * from student inner join course on
student.ID=course.ID

实施结果:

 

金沙国际唯一官网网址 8

inner join 是相比较运算符,只回去符合条件的行。

那儿也正是:select * from student,course where student.ID=course.ID

3、交叉连接 cross join

壹.概念:未有 WHERE
子句的交叉联接将生出连接所涉嫌的表的笛Carl积。第多少个表的行数乘以第2个表的行数等于笛Carl积结果集的轻重缓急。

SQL语句:select * from student cross join course

实施结果:

 

金沙国际唯一官网网址 9

要是大家在那儿给这条SQL加上WHERE子句的时候比如SQL:select * from student
cross join course where student.ID=course.ID

那时候将回来符合条件的结果集,结果和inner join所示执行结果1致。

陆.末尾对客户id 和订单 举行排序

使用子查询

select cust_id 
from orders 
where order_num in (select order_num 
                     from orderitems
                     where prod_id = 'RGAN01');

注意:
作为子查询的select语句只能查询单个列。企图检索多个列将返回错误。
同时要注意性能问题。

五,什么是好的sql语句

尽恐怕简单,模块化

易读,易维护

节省财富

内存

cpu

举目4望的数目块要少

少排序

不造成死锁

8,sql优化最棒实践

1,选择最有成效的表连接顺序

率先要掌握有个别就是SQL 的语法顺序和施行各种是不1致的

SQL的语法顺序:

    select   【distinct】 ….from ….【xxx
 join】【on】….where….group by ….having….【union】….order
by……

SQL的进行各种:

金沙国际唯一官网网址,   from ….【xxx  join】【on】….where….group by
….avg()、sum()….having….select   【distinct】….order by……

from 子句–执行各种为从后往前、从右到左

表名(最前边的这个表名字为驱动表,执行顺序为从后往前,
所以数据量较少的表尽量放后)

where子句–执行各种为自下而上、从右到左

将能够过滤掉大批量数码的标准写在where的子句的尾声品质最优

group by 和order by 子句执行各样都为从左到右

select子句–少用*号,尽量取字段名称。 使用列名意味着将压缩消耗费时间间。

二,防止发出笛卡尔积

饱含多表的sql语句,必须指明各表的连天条件,以幸免发出笛Carl积。N个表连接须求N-3个接二连三条件。

叁,幸免采纳*

当您想在select子句中列出全部的列时,使用动态sql列引用“*”是一个便宜的措施,不幸的是,是一种相当的低效的不二法门。sql解析进度中,还索要把“*”依次转换为富有的列名,那一个工作索要查询数据字典完结!

4,用where子句替换having子句

where子句搜索条件在展开分组操作在此之前运用;而having自个儿条件在拓展分组操作之后采纳。幸免采用having子句,having子句只会在寻觅出装有记录之后才对结果集实行过滤,这么些处理须求排序,总计等操作。倘若能经过where子句限制记录的数额,这就能缩短那上头的支付。

5,用exists、not exists和in、not in相互替代

标准是哪个的子查询产生的结果集小,就选哪些

select * from t1 where x in (select y from t2)

select * from t1 where exists (select null from t2 where y =x)

IN适合于表面大而内表小的状态;exists适合于外部小而内表大的情形

6,使用exists替代distinct

当提交二个富含一对多表新闻(比如单位表和雇员表)的查询时,制止在select子句中选取distinct,一般可以思虑使用exists代替,exists使查询更为便捷,因为子查询的原则壹旦满足,立马回到结果。

无效写法:

select distinct dept_no,dept_name from dept d,emp e where
d.dept_no=e.dept_no

马上写法:

select dept_no,dept_name from dept d where  exists (select ‘x’ from
emp e where e.dept_no=d.dept_no)

备考:个中x的意趣是:因为exists只是看子查询是不是有结果重临,而不关心再次回到的哪些内容,因而提出写二个常量,品质较高!

用exists的确能够替代distinct,然而上述方案仅适用dept_no为唯壹主键的事态,借使要去掉重复记录,须要参考以下写法:

select * from emp  where dept_no exists (select Max(dept_no)) from
dept d, emp e where e.dept_no=d.dept_no group by d.dept_no)

七,防止隐式数据类型转换

隐式数据类型转换不能适用索引,导致全表扫描!t_tablename表的phonenumber字段为varchar类型

以下代码不符合规范:

select column1 into i_l_variable1 from t_tablename where
phonenumber=18519722169;

应编写制定如下:

select column1 into i_lvariable1 from t_tablename where
phonenumber=’18519722169′;

八,使用索引来防止排序操作

在执行频度高,又带有排序操作的sql语句,提议适用索引来防止排序。排序是一种昂贵的操作,在一分钟执行熟视无睹次的sql语句中,假诺含有排序操作,往往会消耗大量的系统能源,品质低下。索引是一种有序结果,要是order
by后边的字段上建有目录,将会大大提高效用!

玖,尽量采用前端匹配的歪曲查询

譬如说,column一 like
‘ABC%’格局,能够对column壹字段进展索引范围扫描;而column一 kike
‘%ABC%’形式,就算column1字段上设有索引,也无从采纳该索引,只可以走全表扫描。

十,不要在选取性较低的字段建立目录

在选用性较低的字段使用索引,不但不会下落逻辑I/O,相反,往往会增多大气逻辑I/O下落质量。比如,性别列,男和女!

1一,制止对列的操作

毫无在where条件中对字段实行数学表达式运算,任何对列的操作都或然导致全表扫描,那里所谓的操作,包含数据库函数,总结表明式等等,查询时要硬着头皮将操作移到等式的左侧,甚至去掉函数。

诸如:下列sql条件语句中的列都建有合适的目录,但几柒仟0条数据下已经施行一点也非常慢了:

select * from record where amount/30<一千 (执行时间1①s)

由于where子句中对列的其余操作结果都以在sql运维时逐行总计获得,由此它只好实行全表扫描,而尚未利用方面包车型地铁目录;假诺那么些结果在询问编写翻译时就能赢得,那么就能够被sql优化器优化,使用索引,防止全表扫描,由此sql重写如下:

select * from record where amount<1000*30 (执行时间不到一秒)

12,尽量去掉”IN”,”O汉兰达”

富含”IN”、”OLAND”的where子句常会利用工作表,使索引失效,假如不发生大批量重复值,能够思考把子句拆开;拆开的子句中应有包涵索引;

select count(*) from stuff where id_no in(‘0′,’1’)

能够拆除为:

select count(*) from stuff where id_no=’0′

select count(*) from stuff where id_no=’1′

下一场在做1个简练的加法

壹3,尽量去掉”<>”

尽量去掉”<>”,制止全表扫描,假诺数额是枚举值,且取值范围固定,能够行使”or”格局

update serviceinfo set state=0 where state<>0;

以上语句由于内部包涵了”<>”,执行计划中用了全表扫描(Table access
full),未有选取state字段上的目录,实际使用中,由于业务逻辑的限定,字段state智能是枚举值,例如0,一或二,因而能够去掉”<>”
利用索引来升高成效。

update serviceinfo set state=0 where state =1 or state =2

1四,制止在索引列上采纳IS NULL或许NOT

幸免在目录中运用其余可以为空的列,导致力不从心利用索引

一5,批量交由sql

假若您需求在1个在线的网站上去执行一个大的DELETE或INSE汉兰达T查询,你供给充足小心,要制止你的操作让您的百分之百网址截至相应。因为这八个操作是会锁表的,表1锁住了,别的操作都进不来了。

Apache会有很多的子进度或线程。所以,其行事起来非凡有效用,而大家的服务器也不期待有太多的子进程,线程和数据库链接,那是石破天惊的占服务器财富的工作,特别是内存。

若是您把您的表锁上1段时间,比如30分钟,那么对于2个有很高访问量的站点来说,这30秒所累积的造访进度或线程,数据库链接,打开的文件数,或许不仅会让您的WEB服务崩溃,还恐怕会让你的整台服务器立即挂了。所以,如若您有3个大的处理,你势必把其拆分。

 

 

 

 

 

 

 

7.TOP

where…in…

select * from contacts where mobile in ('12', '444') order by mobile;

关键字:in,用来钦点条件限制,范围中的每个条件都足以举行相配。in操作符一般比1组or操作符执行的更加快。in最大的亮点是足以蕴含其他select语句,能够更动态的建立where子句。

陆,sql语句的处理进程

sql语句的多个处理阶段:

金沙国际唯一官网网址 17

解析(PARSE):

反省语法

检查语义和相关的权力

在共享池中搜索sql语句

合并(MEGL450GE)视图定义和子查询

规定实施布署

绑定(BIND)

在言语中寻找绑定变量

赋值(或重复赋值)

执行(EXECUTE)

选择执行布署

施行须要的I/O和排序操作

提取(FETCH)

从询问结果中回到记录

必备时展开排序

使用ARRAY FETCH机制

3,sql优化措施

优化学工业作数据

优化数据陈设

优化流程设计

优化sql语句

优化学物理理构造

优化内部存款和储蓄器分配

优化I/O

优化内部存款和储蓄器竞争

优化操作系统

贰.根据规则筛选客户ID等于7一的

触发器 Trigger

触发器是至极的仓库储存进度,它在特定的数据库活动发出时自动执行。

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

示例:

CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

八,sql优化最棒实践

一,选用最有功效的表连接顺序

首先要通晓有个别就是SQL 的语法顺序和履行顺序是不平等的

SQL的语法顺序:

    select   【distinct】 ….from ….【xxx
 join】【on】….where….group by ….having….【union】….order
by……

SQL的推行顺序:

   from ….【xxx  join】【on】….where….group by
….avg()、sum()….having….select   【distinct】….order by……

from 子句–执行各样为从后往前、从右到左

表名(最后边的那1个表名称为驱动表,执行各样为从后往前,
所以数据量较少的表尽量放后)

where子句–执行顺序为自下而上、从右到左

将能够过滤掉多量数据的规范写在where的子句的末梢品质最优

group by 和order by 子句执行顺序都为从左到右

select子句–少用*号,尽量取字段名称。 使用列名意味着将精减消耗费时间间。

2,幸免爆发笛Carl积

含蓄多表的sql语句,必须指明各表的连日条件,避防止发生笛Carl积。N个表连接须求N-3个一连条件。

叁,防止采纳*

当你想在select子句中列出装有的列时,使用动态sql列引用“*”是叁个有益于的点子,不幸的是,是壹种相当的低效的主意。sql解析进度中,还索要把“*”依次转换为具有的列名,那一个工作须求查询数据字典完毕!

4,用where子句替换having子句

where子句搜索条件在进展分组操作在此以前使用;而having自个儿条件在开始展览分组操作之后选取。幸免选择having子句,having子句只会在搜寻出富有记录之后才对结果集进行过滤,那一个处理需求排序,计算等操作。即使能通过where子句限制记录的多少,那就能减弱那上边的开发。

伍,用exists、not exists和in、not in相互替代

规格是哪个的子查询发生的结果集小,就选哪些

select * from t1 where x in (select y from t2)

select * from t1 where exists (select null from t2 where y =x)

IN适合于表面大而内表小的情状;exists适合于外部小而内表大的景况

6,使用exists替代distinct

当提交一个蕴涵一对多表新闻(比如单位表和雇员表)的询问时,制止在select子句中应用distinct,1般能够设想使用exists代替,exists使查询更为火速,因为子查询的规格1旦满足,立马回到结果。

不行写法:

select distinct dept_no,dept_name from dept d,emp e where
d.dept_no=e.dept_no

神速写法:

select dept_no,dept_name from dept d where  exists (select ‘x’ from
emp e where e.dept_no=d.dept_no)

备注:当中x的意思是:因为exists只是看子查询是或不是有结果再次回到,而不关怀重回的如何内容,由此提出写二个常量,品质较高!

用exists的确能够代表distinct,然而上述方案仅适用dept_no为唯1主键的景色,借使要去掉重复记录,要求参考以下写法:

select * from emp  where dept_no exists (select Max(dept_no)) from
dept d, emp e where e.dept_no=d.dept_no group by d.dept_no)

七,幸免隐式数据类型转换

隐式数据类型转换不可能适用索引,导致全表扫描!t_tablename表的phonenumber字段为varchar类型

以下代码不符合规范:

select column1 into i_l_variable1 from t_tablename where
phonenumber=18519722169;

应编写制定如下:

select column1 into i_lvariable1 from t_tablename where
phonenumber=’18519722169′;

捌,使用索引来幸免排序操作

在进行频度高,又饱含排序操作的sql语句,建议适用索引来幸免排序。排序是一种昂贵的操作,在1分钟执行不计其数次的sql语句中,借使含有排序操作,往往会消耗多量的系统能源,质量低下。索引是一种有序结果,假如order
by后边的字段上建有目录,将会大大升级作用!

九,尽量选择前端相称的歪曲查询

诸如,column一 like
‘ABC%’方式,可以对column1字段进展索引范围扫描;而column1 kike
‘%ABC%’格局,就算column一字段上设有索引,也不知所措运用该索引,只可以走全表扫描。

10,不要在选拔性较低的字段建立目录

在选择性较低的字段使用索引,不但不会下滑逻辑I/O,相反,往往会追加大气逻辑I/O下降品质。比如,性别列,男和女!

1壹,防止对列的操作

不用在where条件中对字段实行数学表明式运算,任何对列的操作都恐怕引致全表扫描,那里所谓的操作,包涵数据库函数,计算表明式等等,查询时要尽量将操作移到等式的右手,甚至去掉函数。

比如说:下列sql条件语句中的列都建有适用的目录,但几100000条数据下已经进行相当慢了:

select * from record where amount/30<一千 (执行时间1壹s)

鉴于where子句中对列的别的操作结果都以在sql运维时逐行总计获得,由此它不得不举行全表扫描,而未有使用方面包车型地铁目录;若是那一个结果在询问编译时就能获得,那么就能够被sql优化器优化,使用索引,防止全表扫描,由此sql重写如下:

select * from record where amount<1000*30 (执行时间不到1秒)

1二,尽量去掉”IN”,”OTucson”

饱含”IN”、”OLacrosse”的where子句常会动用工作表,使索引失效,如果不发生大批量重复值,可以考虑把子句拆开;拆开的子句中应有包涵索引;

select count(*) from stuff where id_no in(‘0′,’1’)

能够拆除为:

select count(*) from stuff where id_no=’0′

select count(*) from stuff where id_no=’1′

下一场在做三个简单的加法

一3,尽量去掉”<>”

尽心尽力去掉”<>”,制止全表扫描,若是数量是枚举值,且取值范围固定,能够接纳”or”方式

update serviceinfo set state=0 where state<>0;

上述语句由于在那之中含有了”<>”,执行安顿中用了全表扫描(Table access
full),未有利用state字段上的目录,实际利用中,由于事情逻辑的限制,字段state智能是枚举值,例如0,一或2,由此能够去掉”<>”
利用索引来升高功效。

update serviceinfo set state=0 where state =1 or state =2

1④,幸免在索引列上应用IS NULL可能NOT

幸免在目录中选取任何能够为空的列,导致不能够使用索引

一五,批量提交sql

若果你须要在一个在线的网址上去执行三个大的DELETE或INSELANDT查询,你须求相当小心,要幸免你的操作让您的万事网址甘休相应。因为那多少个操作是会锁表的,表壹锁住了,其他操作都进不来了。

Apache会有成都百货上千的子进度或线程。所以,其工作起来极度有功效,而作者辈的服务器也不期望有太多的子进度,线程和数据库链接,那是急剧的占服务器财富的事务,尤其是内部存款和储蓄器。

只要你把您的表锁上一段时间,比如30分钟,那么对于一个有很高访问量的站点来说,那30秒所累积的拜访进度或线程,数据库链接,打开的文件数,大概非但会让你的WEB服务崩溃,还大概会让您的整台服务器立时挂了。所以,假诺你有多少个大的处理,你早晚把其拆分。

一,sql质量优化基础方法论

对此作用,大家大概清楚必须革新什么;但对于品质难点,有时大家恐怕无从动手。其实,任何总结机应用系统最终队能够总结为:

cpu消耗

内部存款和储蓄器使用

对磁盘,互连网或别的I/O设备的输入/输出(I/O)操作。

 

但大家相见品质难题时,要看清的首先点正是“在这三种能源中,是不是有哪壹种能源达到了有标题标程度”,因为那或多或少能辅导我们搞明白“须求优化重构什么”和“如何优化重构它”

金沙国际唯一官网网址 2

6.order by

SQL 必知必会

在mac终端操作sqlite:

  • cd 数据库所在的目录
  • sqlite3 数据库文件名 //带后缀)(此时早已打开数据库)
  • .tables //呈现数据库中有所曾经创办的表
  • .schema //突显全体表的形式
  • .headers on //展现字段名(查询时才会来得)
  • .mode column/list/line
  • 实行sql语句必须在末尾加分号

还要 where 子句检索 实现后 
它回到的是寻觅结果为True的行  ,但始终铭刻, SQL
数据库使用3值谓词逻辑,也等于说有七个结果。

order by

 SELECT * FROM TB_BOOK_TAG ORDER BY name;

关键字:order by +
字段名,按该字段所属列的首字母实行排序。要确定保证该子句是select语句中最终一条子句,不然会油可是生谬误。

 SELECT publisher,pubdate FROM TB_BOOK_ENTITY ORDER BY publisher,pubdate;

关键字:order by + 字段名 +
字段名,首先按publisher实行排序,然后依照pubdate进行排序。对于第叁个字段的排序,当且仅当有着几个壹样的publisher时才会对其依照pubdate进行排序,借使publisher列中全体值都是绝无仅有的,则不会按pubdate进行排序。

四.因为 group by
属于行处理 在having 先计算机技术研讨所以having 中得以出现  聚合函数 。

成立计算字段

计算字段并不实际存在于数据库表中,计算字段是运行时在SELECT语句内创建的。

select rtrim('~    ') || name from tb_book_tag;

关键字:||rtrim()
||东拼西凑操作符。rtrim()去除文本左侧的空格。trim()删去两边的空格。

是伍  count中加以展现值 就会暗中同意寻找已知值 
也能够  count(distinct qty ) 再次回到的是四 去重新  那几个 能够用来 处理 
重返每一种不另行总结难点很方便 它和 select
distinct
有极大品质不相同 今后会细讲 也能够sum(distinct qty
) 是一三也是用作总括不另行数据。

%通配符

在摸索字符串中,%表示别的字符出现任意次数

select * from tb_book_tag where name like '计算机%';

注意字符串后面所跟的空格:
许多DBMS会用空格来填补字段内容。例如,如果某列有50个字符,而存储文本为Fish bean bag toy(17个字符),则为填满该列会在文本末尾追加33个空格。如果此时用‘F%y’来检索,便检索不到上述字符串。简单解决办法是‘F%y%’。更好的解决办法是用函数去掉空格。

'%' 不会匹配为NULL的行

建议、坑

group by…having…

select name , count(*) as amounts from tb_book_tag group by name having amounts >= 10;

关键字:having。对分组实行过滤。而where对分组不起成效,它是本着表中每1行来过滤。

第二看下边一条相比成功语句,都是相比较常见的主要字。

group by

select name, count(*) as num_names from tb_book_tag group by name order by name;

关键字:group by,group by子句必须出现在where子句之后,order
by子句在此以前。

柒.使用 order by 对有恢宏再一次的字段实行排序是于事无补的  例如对日期举办排序
那样二个排序选10条 会有八个被认为是对的结果
所以大家要确认保障排序字段的多少唯壹性, 以及在 select distinct  时 排序
会导致 单个结果对应四个源数据行。

高级SQL特性

约束,索引,触发器。

True,False 或 UNKNOWN ,  再次来到true 行 并分裂等
不回去False  实际上是不回去 False 行 和 UNKNOWN 行
以后会再博客中特别讲NULL。

分组数据

一.从 Orders 表查询数据

成立和操纵表

6.最棒别使用 select * 尽管你要查询 全数字段。

外联结

select customers.cust_id, orders.order_num 
from customers 
left outer join orders 
on customers.cust_id = orders.cust_id;

找寻包蕴未有订单顾客在内的全部顾客。

SQLite支持left outer join,但不支持right outer join.