SQL for SQLite
语法
verb + subject + predicate
commannds(命令)
SQL由命令组成,以分号为结束。命令有token组成,token由white space分隔,包括空格、tab、换行。
literals
有三种
- 字符串。由单引号
'包围。如果字符中要有',用两个连续的'。比如'kenny''s chicken' - 数值。整型、小数、科学计数法
- 二进制。
x'0000'。二进制值长度必须是8bit的倍数。
关键字和标识符
于此,SQL是对大小写不敏感的。
SELECT * from foo;
SeLeCt * FrOm FOO:
是一样的。对字符串,是大小写敏感的。Mike和mike不一样。
注释
- 单行:
--开头 - 多行。
/**/
创建数据库
创建table
SQL由几部分组成。
- DDL(data definition language). 用于创建和destory数据库对象。
- DML(data manipulation language). 用于操作对象。
创建数据库属于DDL。语法如下:
creat [temp] table table_name (column_definitions[, constraints])
temp是指创建的数据库会在session结束时被消失。(数据库连接不存在)
column_definitions由逗号,分隔的列定义组成。每一列的定义包括name、domain、逗号分隔的一系列列约束。
domain,也叫type,也叫"storage class".有五种类型integer, real, text, blob, null.
alter table
可以重命名table或者增加列。
alter table table {rename to name | add column column_def}
查询数据库
关系操作
- 基础操作(在集合理论中有基础)
- 约束
- 投射
- 笛卡尔积
- 联合
- 差(difference)
- 重命名
- additional operations(为了使用方便,一些常用的操作)
- 交叉
- 自然联接
- 赋值
- 扩展操作
- 一般(generalized) 投射
- 左外联
- 右外联
- 全外联
SQLite支持除了右外联和全外联外所有的ANSI SQL定义的关系操作。
select and Operational Pipeline
select [distinct] heading
from tables
where predicate
group by columns
having predicate
order by columns
limit count, offset
过滤
为每一行执行where语句。
values
表达方式有很多。
- literal values
- 变量
- 表达式
- 函数的值
- ...
操作
- like. 用于匹配字符串和给定的pattern。通配符
%和_ - glob. 和like很像。大小写敏感,通配符
*和?
###限制和排序 limit. 不在ANSI标准里offset. 不在ANSI标准里order by, asc default.
同时使用limit和offset时,可以用,代替offset
可以使用limit不用offset,使用offset必须使用limit
函数和总计(aggregate)
分类(grouping)
group by. 执行在where语句和select语句之间。输入为where语句的输出,将其分为若干组。每一组输入select语句,输出一个总计(aggregate)结果。
having 过滤group by输出的group。以统计形式表达。
select type_id, count(*) from foods group by type_id having count(*) < 20;
去除重复
distinct
joining tables
外键:一个表中某一列中的值在另一个表中是主值,这种关系叫做外键。
使用外键可以将表连接起来。
sqlite> select foods.name, food_types.name
...> from foods, food_types
...> where foods.type_id=food_types.id limit 10;
name name
---------- ----------
Bagels Bakery
Bagels, ra Bakery
Bavarian C Bakery
Bear Claws Bakery
Black and Bakery
Bread (wit Bakery
Butterfing Bakery
Carrot Cak Bakery
Chips Ahoy Bakery
Chocolate Bakery
内联
内联:两个表通过表中列的关系连接起来,最常用也最重要。
内联使用了_交集(interdsection)_操作。
sqlite> Select *
...> From foods inner join food_types on foods.id = food_types.id;
id type_id name id name
---------- ---------- ---------- ---------- ----------
1 1 Bagels 1 Bakery
2 1 Bagels, ra 2 Cereal
3 1 Bavarian C 3 Chicken/Fo
4 1 Bear Claws 4 Condiments
5 1 Black and 5 Dairy
6 1 Bread (wit 6 Dip
7 1 Butterfing 7 Drinks
8 1 Carrot Cak 8 Fruit
9 1 Chips Ahoy 9 Junkfood
10 1 Chocolate 10 Meat
11 1 Chocolate 11 Rice/Pasta
12 1 Chocolate 12 Sandwiches
13 1 Cinnamon B 13 Seafood
14 1 Cinnamon S 14 Soup
15 1 Cookie 15 Vegetables
交叉连接
把A表每一列和B表每一列连接起来,会产生很多无意义的结果。
外联
外联:外联选出内联的所有行和不符合关系条件的一些行。
select *
from foods left outer join foods_episodes on foods.id=foods_episodes.food_id;
foods是左表,对于foods的每一行,都尝试建立连接,并通过关系条件。符合条件的行被展示,不符合的也会被展示,episodes列展示为null。
全外联:左外联和右外联的合集。
自然连接
内联的特殊情况。通过相同的列名连接。如果列的名称改变,结果会不同,所以尽量不要使用。
推荐的语法
使用显式的join语法。
select * from foods, food_types where foods.id=food_types.food_id;
这个是旧式的语法。
select * from foods inner join food_types on foods.id=food_types.food_id;
这个是新式的语法。
names and aliases
select f.name as food, e1.name, e1.season, e2.name, e2.season
from episodes e1, foods_episodes fe1, foods f,
episodes e2, foods_episodes fe2
where
-- Get foods in season 4
(e1.id = fe1.episode_id and e1.season = 4) and fe1.food_id = f.id
-- Link foods with all other epsisodes
and (fe1.food_id = fe2.food_id)
-- Link with their respective episodes and filter out e1's season
and (fe2.episode_id = e2.id AND e2.season != e1.season)
order by f.name;
子查询(subquey)
把select的结果作为from、orderby语句的输入。
联合查询(compound query)
有点像子查询的对面。使用union,intersect,except来处理多个查询的结果。
前提条件
- 需要处理的结果的列数相同
- 只能有一个
order by语句,在联合查询的最后。
条件结果(conditional results)
- 使用静态值
select name || case type_id
when 7 then ' is a drink'
when 8 then ' is a fruit'
when 9 then ' is junkfood'
when 13 then ' is seafood'
else null
end description
from foods
where description is not null
order by name
limit 10;
- 在when中使用表达式
select name (select
case
when count(*) > 4 then 'Very High'
when count(*) = 4 then 'High'
when count(*) in (2,3) then 'Moderate'
else 'Low'
end
from foods_episodes
where food_id=f.id) frequency
from foods f
where frequency like '%High';
处理NULL
SQL for SQLite的更多相关文章
- .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式
便签记录Mysql,Sql server,Sqlite,Access四种数据库的简单连接方式 //using MySql.Data.MySqlClient; #region 执行简单SQL语句,使用M ...
- 数据库SQL、SQLite语句单引号、双引号的用法
最近编程操作数据库语句的时候出现一些问题. 关于Insert字符串 ,在(单引号,双引号)这个方面发生了问题,其实主要是因为数据类型和变量在作怪. 下面我们就分别讲述,虽然说的是Insert语句, 但 ...
- SQL&SQLite
注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...
- db.sqlite如何导出转储为sql文件
在使用 django框架写博客时,用的是sqlite数据库,想要将其中的db.sqlite转储为sql文件, 我是在linux下使用的,很多linux系统下都自带sqlite 检查是否安装sqlite ...
- HTML5本地存储——Web SQL Database
在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...
- About SQLite
About SQLite See Also... Features When to use SQLite Frequently Asked Questions Well-known Users Boo ...
- [转]HTML5本地存储——Web SQL Database
在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...
- Web SQL Database实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android-adb 常用命令 和 sqlite
Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...
随机推荐
- Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 1755 (CrBrowserMain)问题
- 浏览器退出之后php还会继续执行么?
浏览器退出之后php还会继续执行么? 前提:这里说的是典型的lnmp结构,nginx+php-fpm的模式 如果我有个php程序执行地非常慢,甚至于在代码中sleep(),然后浏览器连接上服务的时候, ...
- C#多线程技术总结(同步)
二.串行(同步): 1.lock.Monitor--注意锁定的对象必需是引用类型(string类型除外) 示例: private static object syncObject = new obje ...
- 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法
废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...
- ROS 多台电脑间进行通信
版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5773822.html 在我看来,ROS最牛逼的地方就是它的通信机制了,不仅仅是进程间 ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- web前端学习笔记---实现雪花飘落的效果
看了javascript网页特效实例大全中的图片飘下的效果实例,觉得值得动手学习下. 就把图片改成雪花图,完成一个雪花飘下的效果. 并且,其中有些内容比较陈旧了,那么就学者改掉吧. 包括: 1.对le ...
- ASP.NET MVC程序播放H.264视频
在这篇之前,Insus.NET不管是在ASP.NET还是ASP.NET MVC实现很多视频播放,你可以参考这篇链接:http://www.cnblogs.com/insus/category/4650 ...
- jQuery的Ajax请求数据时type无法使用GET
写一个ASP.NET MVC例子,它是使用jQuery的$.Ajax来呼叫控制器的数据. 创建一个视图: 运行结果: 一切正常,但是本例子我们只是获取数据,并没有做任何数据POST上传至控制器,我们尝 ...
- 关于c++操作符的优先级
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级. 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符.条件运算符.赋值运算符.其它的都是从左至右结合. 具有最 ...