当前位置:u赢电竞手机版 > uwin电竞app官网下载 > SQL 必知必会uwin电竞app官网下载

SQL 必知必会uwin电竞app官网下载

文章作者:uwin电竞app官网下载 上传时间:2019-08-21
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;

where...in...

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

关键字:in,用来指定条件范围,范围中的每个条件都可以进行匹配。in操作符一般比一组or操作符执行的更快。in最大的优点是可以包含其他select语句,能够更动态的建立where子句。

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.

3.记住除count(*)之外,  聚合函数都是忽略NULL标记  如果有一组数据“1,1,3,4,5,null”列名为qty   表达式Count(*) 返回的是6 但是 Count(qty)

where...or...

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

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

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

4.因为 group by 属于行处理 在having 先计算所以having 中可以出现  聚合函数 。

创建高级联结

1.from  

插入数据

 

唯一约束 unique

唯一约束用来保证一列中的数据是唯一的。与主键的区别如下:

  • 表可包含多个唯一约束,但每个表只允许一个主键。
  • 唯一约束列可包含NULL值。
  • 唯一约束列可修改或更新。
  • 唯一约束列的值可重复使用。
  • 与主键不一样,唯一约束不能用来定义外键。

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

alert table

使用alert table更改表的结构,必须给出下面的信息:

  • alter table之后给出要更改的表名。
  • 列出要做出哪些更改。
alter table Vendors
add vend_phone char(20);

SQLite对使用alter table执行的操作有所限制。最重要的一个限制是,它不支持使用alter table定义主键和外键。

使用alter table要极为小心,应该在进行改动钱做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除他们。

在仔细分析每个执行顺序代表的意思 (它的实际顺序)

函数

一下所用到的是适用于sqlite的函数,不一定适用于其他DBMS。

5.select

distinct

 SELECT DISTINCT name FROM TB_BOOK_TAG;

关键字distinct,用于去除name列中所有行中重复元素。

5.返回查询出的数据 以及你要展示的字段

执行算术计算

3.group by

创建计算字段

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

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

关键字:||rtrim()||拼接操作符。rtrim()去除文本右边的空格。trim()去除两边的空格。

输入的键入顺序和处理顺序不一致是有原因的,SQL设计师是为了让用户按照英文的方式提供自己的请求

where

SELECT * FROM TB_BOOK_TAG WHERE count = 1;

关键字:where,指定搜索条件进行过滤。where子句在表名(from子句)之后给出。在同时使用whereorder by时,应该让order by位于where之后。

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

注意:NULL和非匹配
通过过滤选择不包含(如<>)指定值的所有行时,你可能希望返回含NULL值的行,但是这做不到,因为NULL有特殊的含义,数据库不知道它们是否匹配,所以在进行匹配过滤或非匹配过滤时,不会返回这些结果。

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;

7.使用 order by 对有大量重复的字段进行排序是无效的  例如对日期进行排序 这样一个排序选10条 会有多个被认为是对的结果 所以我们要确保排序字段的数据唯一性, 以及在 select distinct  时 排序 会导致 单个结果对应多个源数据行。

注释

 --this is a comment

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

 /* comments */

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

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

like

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

通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索

我们来详细分析一下sql语句的逻辑处理顺序,虽然select在每条语句的第一位,但实际上它是被最后才处理的

as

select name || 'is foolish' as title from contacts;

关键字:as,全称alias。它指示SQL创建一个包含指定计算结果的名为title的计算字段,任何客户端应用可以按名称引用这个列,就像一个实际表列一样。

5.像上面的 “YEAR(orderdate)” SQL Server 只对它运行一次  能识别查询中重复使用的相同表达式

使用表别名

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语句中多次使用相同的表

1.从 Orders 表查询数据

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子句。

  1. where 子句相当重要  SQL Server 会对where 条件 进行评估访问请求数据要使用的索引,通过索引可以大大减少表扫描时间

删除视图 drop view

drop view customeremaillist;

True,False 或 UNKNOWN ,  返回true 行 并不等同于 不返回False  实际上是不返回 False 行 和 UNKNOWN 行 以后会再博客中专门讲NULL。

where...and...

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

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

同时 where 子句检索 完成后  它返回的是检索结果为True的行  ,但始终记住, SQL 数据库使用三值谓词逻辑,也就是说有三个结果。

自联结

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处理联结远比处理子查询快得多

首先看下面一条比较完成语句,都是比较常见的关键字。

删除索引 drop index

DROP INDEX index_name;

6.最终对客户id 和订单 进行排序

%通配符

在搜索字符串中,%表示任何字符出现任意次数

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

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

'%' 不会匹配为NULL的行

6.order by

update...set... where...

update customers 
set cust_email = 'chenzhen@gmainl.com' 
where cust_id = '1000000008';

更新多个列时,只需使用一条set命令:

update customers 
set cust_email = 'lala@qq.com',
    cust_contact = 'sam' 
where cust_id = '1000000008';

没有where子句,DBMS将会更新表中所有行。

  1. uwin电竞app官网下载,from 表时  最好给定 库名和表名  Sales.Orders  让表显示表示 不用程序检索。

高级SQL特性

约束,索引,触发器。

是5  count中给定显示值 就会默认寻找已知值  也可以  count(distinct qty ) 返回的是4 去重复  这个 可以用来 处理  返回每个不重复统计问题很方便 它和 select distinct 有很大性能区别 以后会细讲 也可以 sum(distinct qty ) 是13 也是用作统计不重复数据。

聚集不同值

7.输出

索引 create index

索引用来排序数据以加快搜索和排序操作的速度。想象一本书后的索引。

在开始创建索引前,应该记住以下内容:

  • 索引改善检索操作的性能,但降低了数据插入,修改,和删除的性能。在执行这些操作时,DBMS必须动态的更新索引。
  • 索引数据可能要占用大量的存储空间。
  • 并非所有数据都适合做索引。
  • 索引用于数据过滤和数据排序。
  • 可以在索引中定义多个列(例如,州加上城市)。这样的索引仅在以州加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。
CREATE INDEX index_name
ON table_name (column_name);

建议、坑

管理事务处理

使用事务处理(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;

2.where

insert into... values

insert into customers 
values ('1000000006', 'Chenzhen', 'Hennansheng', 'henan', 'China', '476300', 'China', 'John jdge', 'chen@gaiml.com');

这种写法简单,但不安全,高度依赖表中列定义的次序,还依赖于其容易获得的次序信息。编写依赖列次序的SQL语句是很不安全的,这样做迟早会出问题。

更安全的方法:

insert into customers(cust_id,
                      cust_name, 
                      cust_address, 
                      cust_city, 
                      cust_state, 
                      cust_zip, 
                      cust_country, 
                      cust_contact, 
                      cust_email) 
values('1000000007',
       'Chenzhen', 
       'Hennansheng', 
       'henan', 
       'shangqiu', 
       '476300', 
       'China', 
       'John jdge', 
       'chen@gaiml.com');

插入行时,DBMS将用values列表中的相应值填入列表中的对应项。其优点是,即使表的结构改变,这条insert语句仍然可以正常工作。

2.根据条件筛选客户ID等于71的

union规则

  • union必须由两条或两条以上的select语句组成,语句之间用关键字union分隔。
  • union中的每个查询必须包含相同的列,表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型。
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;

SQL 必知必会

在mac终端操作sqlite:

  • cd 数据库所在的目录
  • sqlite3 数据库文件名 //带后缀)(此时已经打开数据库)
  • .tables //显示数据库中所有已经创建的表
  • .schema //显示所有表的模式
  • .headers on //显示字段名(查询时才会显示)
  • .mode column/list/line
  • 执行sql语句必须在末尾加分号

7.TOP

union all

DBMS不取消重复行。

主键

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

表中任意列只要满足以下条件,都可以用于主键。

  • 任意两行主键值都不相同。
  • 每行都具有一个主键值(既列中不允许NULL)。
  • 包含主键的列从不修改或更新。
  • 主键值不能重用。

使用视图

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。

SQLite仅支持只读视图,所以视图可以创建,可以读,但其内容不能更改。

下划线_通配符

用途和%一样,但它只匹配单个字符,而不是多个。

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

使用通配符的技巧

SQL通配符搜索比其他搜索更耗时。

1. 不要过度使用通配符,如果其他操作能达到目的,使用其他操作。
2. 在确实需要使用的时候,也尽量不要把它用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
3. 特别要注意通配符的位置不要放错。

本文由u赢电竞手机版发布于uwin电竞app官网下载,转载请注明出处:SQL 必知必会uwin电竞app官网下载

关键词: SQL必知