必知必会,SQL语句管理顺序的坑

3.记住除count(*)之外, 
聚合函数都以忽视NULL标识  若是有一组数据“一,一,三,肆,5,null”列名称叫qty  
表达式Count(*) 重返的是六 可是Count(qty)

主键

create table Orders
(
    order_num integer not null primary key,
    cust_id char(10) not null references Customers(cust_id)
);

表中自便列只要满意以下规则,都能够用于主键。

  • 自由两行主键值都不均等。
  • 每行都抱有一个主键值(既列中不允许NULL)。
  • 包涵主键的列从不修改或更新。
  • 主键值无法重用。

伍.赶回查询出的数据 以及你要出示的字段

自联结

select  cust_id, cust_name, cust_contact 
from customers 
where cust_name = (select cust_name 
                   from customers 
                   where cust_contact = 'Jim Jones');

以上子查询功能同样自联结:

select c1.cust_id, c1.cust_name, c1.cust_contact 
from customers as c1, customers as c2 
where c1.cust_name = c2.cust_name 
and c2.cust_contact = 'Jim Jones';

平凡境况下,多数DBMS管理统1远比管理子查询快得多

6.order by

动用表小名

select cust_name, cust_contact 
from customers as c, orders as o, orderitems as oi 
where c.cust_id = o.cust_id 
and oi.order_num = o.order_num 
and prod_id = 'RGAN01';

利用表别称的三个关键理由:

  • 缩短SQL语句
  • 允许在一条select语句中屡屡应用同样的表
USE Temp;

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

count(distinct name)

select count(distinct name) from tb_book_tag;

二.依照条件筛选客户ID等于7一的

union

select cust_name, cust_contact, cust_email 
from customers 
where cust_state in ('IL', 'IN', 'MI') 
union 
select cust_name, cust_contact, cust_email 
from customers 
where cust_name = 'Fun4All';

1.从 Orders 表查询数据

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子句在此以前。

True,False 或 UNKNOWN ,  重返true 行 并不等同
不回来False  实际上是不回去 False 行 和 UNKNOWN 行
今后会再博客中等专门的学业高校门讲NULL。

治工夫务管理

采纳事务管理(transaction
processing),通过保险成批的SQL操作仍然完全推行,要么完全不施行,来维护数据库的完整性。

有关事务管理的部分术语:

  • 事务(transaction)指一组SQL语句;
  • 回退(rollback)指撤除钦命SQL语句的经过;
  • 付给(commit)指将未存款和储蓄的SQL语句结果写入数据库表;
  • 保留点(savepoint)指事务管理中安装的不时占位符,能够对它揭露回退(与回退整个事务管理不一致)。

可以回退哪些语句:
insert,update,delete

管理专门的学业的关键在于将SQL语句分解为逻辑块,并分明规定数据何时应该回退,哪一天不应有回退。

begin;
delete from orders where order_num = 20009;
delete from orderitems where order_num = 20009;
commit;

7.TOP

创办视图create view

create view ProductCustomers as
select cust_name, cust_contact, prod_id
from Customers, Orders, OrderItems
where Customers.cust_id = Orders.cust_id
and OrderItems.order_num = Orders.order_num;

where子句与where子句
从视图检索数据时如果使用了一条where子句,则两组子句(一组子在视图中,另一组,另一组是传递给视图的)将自动组合。

视图为虚拟的表。它们含有的不是数据,而是基于供给探求数据的查询。视图提供了壹种封装select语句的层系,可用来简化数据管理,重新格式化或保卫安全基础数据。

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;

avg()

select avg(mobile) as avg_id from contacts;

关键字:avg(),对表中某列全数行或特定行中的数据求平均值。该函数会忽略值为NULL的行。

输入的键入顺序和拍卖顺序不等同是有缘由的,SQL设计员是为着让用户依照英文的艺术提供温馨的乞请

使用子查询

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

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

5.像下边包车型大巴 “YEALacrosse(orderdate)” SQL Server 只对它运行二回 
能鉴定区别查询中重复使用的如出1辙表明式

limit … offset …

关键字LIMIT ... OFFSET ...,limit后跟的数字钦点呈现多少行,offset后跟的数字代表从怎么着岗位上马。(0是第一行)

7.输出

like

通配符(wildcard)用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值,通配符或两者组合构成的搜索条件。

通配符找出只可以用来文书字段(字符串),非文本数据类型字段无法运用通配符寻觅

  1. where 子句分外关键  SQL Server 会对where 条件
    举行评估访问请求数据要动用的目录,通过索引能够大大减少表扫描时间

group by…having…

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

关键字:having。对分组进行过滤。而where对分组不起成效,它是指向表中每壹行来过滤。

是5  count中加以显示值 就能够暗许寻找已知值 
也足以  count(distinct qty ) 重临的是四 去重新  这几个 能够用来 管理 
重回每一种不另行总结难题很方便 它和 select
distinct
有极大质量差别 现在会细讲 也足以
sum(distinct qty
) 是1三也是用作计算不重复数据。

删除视图 drop view

drop view customeremaillist;

7.施用 order by 对有雅量再次的字段实行排序是船到江心补漏迟的  举例对日期进行排序
那样一个排序选十条 会有三个被以为是对的结果
所以大家要确定保证排序字段的多寡唯壹性, 以及在 select distinct  时 排序
会导致 单个结果对应七个源数据行。

not

select * from contacts where not mobile = '12';

关键字:not,where子句中用来否认其后条件的要害字。上边的事例也可以用<>。在简练语句中,not从没什么优势,不过,在更眼花缭乱的子句中,not特别有效。举例,在与in操作符联合使用时,not能够非常轻松的寻觅与原则列表不匹配的行。如下例子:

 SELECT * FROM CONTACTS WHERE NOT mobile IN ('111111', '3333');

3.group by

%通配符

在寻觅字符串中,%表示别的字符出现自便次数

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

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

'%' 不会匹配为NULL的行

1.from  

从3个表复制到另1个表

create table custcopy as select * from customers;

要想只复制部分列,能够肯定给出列名。

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

更新表

5.select

分组数据

2.where

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列中全部值都是唯1的,则不会按pubdate实行排序。

建议、坑

delete

delete无需列名或通配符,因为它删除的是整行而不是删除列,要删减钦命列,使用update

delete from custcopy 
where cust_id = '1000000008';

若是省略where子句,它将去除表中的各类顾客。假如想从表中删除全数行,不要采用delete,可应用truncate
table语句,它的速度越来越快,因为不记录数据的退换。

 

唯1约束 unique

唯一约束用来保障1列中的数据是并世无两的。与主键的界别如下:

  • 表可含蓄多少个唯一约束,但各类表只允许贰个主键。
  • 唯1约束列可含蓄NULL值。
  • 唯一约束列可修改或更新。
  • 唯一约束列的值可重复使用。
  • 与主键不一致样,唯壹约束不能用来定义外键。

六.终极对客户id 和订单 举行排序

count()

select count(*) as num_cust from contacts;

select count(name) as num_name from contacts;

关键字:count(),使用count(*),对表中央银行的数量进行计数,不管表列中是还是不是包涵NULL值。使用count(column_name),对特定列中具备值的行开展计数,忽略NULL值。

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

安顿数据

3.对客户id和订单年度 进行分组

联结表

  1. 再选出大于3个订单的组

sum()

select sum(mobile) as sum_mobile from contacts;

关键字:sum(), 忽略NULL值

首先看上面一条相比较到位语句,都是相比常见的基本点字。

动用视图

视图是虚拟的表。与富含数据的表不等同,视图只含有使用时动态检索数据的查询。
视图(View)只然而是经过有关的称号存储在数据库中的二个 SQLite
语句。视图(View)实际上是三个以预订义的 SQLite 查询情势存在的表的组成。

SQLite仅支持只读视图,所以视图可以创建,可以读,但其内容不能更改。
  1. from 表时  最佳给定 库名和表名  Sales.Orders 
    让表显示表示 不用程序检索。

注释

 --this is a comment

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

 /* comments */

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

在精心剖判各种执行种种代表的意思 (它的其实顺序)

insert into… select…from…

insert into customers(cust_id,
                      cust_name,
                      cust_address, 
                      cust_city, 
                      cust_state, 
                      cust_zip, 
                      cust_country, 
                      cust_contact, 
                      cust_email) 
select cust_id, 
       cust_name, 
       cust_address, 
       cust_city, 
       cust_state, 
       cust_zip, 
       cust_country, 
       cust_contact, 
       cust_email
from CustNew;

select语句从CustNew检索出要插入的值,而不是列出她们。DBMS不珍惜select再次来到的列名,它选择的是列的地方,由此select的第三列(不管列名怎样)将用来填充表列中钦点的率先列,如此等等。

insert select 语句能够蕴含where子句。

咱俩来详细解析一下sql语句的逻辑处理顺序,尽管select在每条语句的首先位,但实在它是被末了才管理的

组合集中函数

select count(*) as num_items, min(count) as count_min, max(count) as count_max, avg(count) as count_avg from tb_book_tag;

4.having

触发器 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;

并且 where 子句检索 达成后 
它回到的是搜求结果为True的行  ,但一贯牢记, SQL
数据库使用三值谓词逻辑,也正是说有四个结果。

索引 create index

索引用来排序数据以加速寻找和排序操作的速度。想象一本书后的目录。

在开端创制索引前,应该牢记以下内容:

  • 目录改革检索操作的属性,但下落了数量插入,修改,和删除的习性。在实行这一个操作时,DBMS必须动态的换代索引。
  • 目录数据大概要侵占多量的积累空间。
  • 决不全部数据都合乎做索引。
  • 目录用于数据过滤和数码排序。
  • 能够在目录中定义四个列(举个例子,州加上城市)。那样的目录仅在以州加城市的相继排序时有用。假使想按城市排序,则这种索引未有用处。

CREATE INDEX index_name
ON table_name (column_name);

where

SELECT * FROM TB_BOOK_TAG WHERE count = 1;

关键字:where,钦定寻找条件实行过滤。where子句在表名(from子句)之后给出。在同期利用whereorder by时,应该让order by位于where之后。

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为NULL值

注意:NULL和非匹配
因此过滤选用不包罗(如<>)内定值的全数行时,你可能希望回到含NULL值的行,但是那做不到,因为NULL有优异的含义,数据库不知道它们是或不是合作,所以在进展相称过滤或非匹配过滤时,不会回来这一个结果。

履新和删除数据

进行算术总结

发表评论

电子邮件地址不会被公开。 必填项已用*标注