语法

verb + subject + predicate

commannds(命令)

SQL由命令组成,以分号为结束。命令有token组成,token由white space分隔,包括空格、tab、换行。

literals

有三种

  1. 字符串。由单引号'包围。如果字符中要有',用两个连续的'。比如'kenny''s chicken'
  2. 数值。整型、小数、科学计数法
  3. 二进制。x'0000'。二进制值长度必须是8bit的倍数。

关键字和标识符

于此,SQL是对大小写不敏感的。

SELECT * from foo;
SeLeCt * FrOm FOO:

是一样的。对字符串,是大小写敏感的。Mikemike不一样。

注释

  • 单行:--开头
  • 多行。/**/

创建数据库

创建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.

同时使用limitoffset时,可以用,代替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的更多相关文章

  1. .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式

    便签记录Mysql,Sql server,Sqlite,Access四种数据库的简单连接方式 //using MySql.Data.MySqlClient; #region 执行简单SQL语句,使用M ...

  2. 数据库SQL、SQLite语句单引号、双引号的用法

    最近编程操作数据库语句的时候出现一些问题. 关于Insert字符串 ,在(单引号,双引号)这个方面发生了问题,其实主要是因为数据类型和变量在作怪. 下面我们就分别讲述,虽然说的是Insert语句, 但 ...

  3. SQL&SQLite

    注册博客园有一年多了,每次都是来找点资料,从来没有写过点什么,促使我开始写博客的原因主要有两点 一是在查找资料的过程中,经常需要重复的查找某个知识点,一个知识点时间长了之后总是忘记,这样重复的过程却是 ...

  4. db.sqlite如何导出转储为sql文件

    在使用 django框架写博客时,用的是sqlite数据库,想要将其中的db.sqlite转储为sql文件, 我是在linux下使用的,很多linux系统下都自带sqlite 检查是否安装sqlite ...

  5. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  6. About SQLite

    About SQLite See Also... Features When to use SQLite Frequently Asked Questions Well-known Users Boo ...

  7. [转]HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  8. Web SQL Database实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Android-adb 常用命令 和 sqlite

    Android开发环境中,ADB是我们进行Android开发经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的. ADB概述 Android Debug Bridge,Androi ...

随机推荐

  1. Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 1755 (CrBrowserMain)问题

  2. 浏览器退出之后php还会继续执行么?

    浏览器退出之后php还会继续执行么? 前提:这里说的是典型的lnmp结构,nginx+php-fpm的模式 如果我有个php程序执行地非常慢,甚至于在代码中sleep(),然后浏览器连接上服务的时候, ...

  3. C#多线程技术总结(同步)

    二.串行(同步): 1.lock.Monitor--注意锁定的对象必需是引用类型(string类型除外) 示例: private static object syncObject = new obje ...

  4. 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法

    废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...

  5. ROS 多台电脑间进行通信

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5773822.html 在我看来,ROS最牛逼的地方就是它的通信机制了,不仅仅是进程间 ...

  6. Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)

    在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...

  7. web前端学习笔记---实现雪花飘落的效果

    看了javascript网页特效实例大全中的图片飘下的效果实例,觉得值得动手学习下. 就把图片改成雪花图,完成一个雪花飘下的效果. 并且,其中有些内容比较陈旧了,那么就学者改掉吧. 包括: 1.对le ...

  8. ASP.NET MVC程序播放H.264视频

    在这篇之前,Insus.NET不管是在ASP.NET还是ASP.NET MVC实现很多视频播放,你可以参考这篇链接:http://www.cnblogs.com/insus/category/4650 ...

  9. jQuery的Ajax请求数据时type无法使用GET

    写一个ASP.NET MVC例子,它是使用jQuery的$.Ajax来呼叫控制器的数据. 创建一个视图: 运行结果: 一切正常,但是本例子我们只是获取数据,并没有做任何数据POST上传至控制器,我们尝 ...

  10. 关于c++操作符的优先级

    优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级. 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符.条件运算符.赋值运算符.其它的都是从左至右结合. 具有最 ...