语法

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. ASP.NET MVC使用SSI来实现页面静态化

    页面静态化分为两种:伪静态和真静态,这里主要介绍的是真静态. 进入正题之前先简单介绍一下SSI和shtml: 1).SSI是Server Side Include的简称(服务器端嵌入) 2).shtm ...

  2. VS2015如何新建MVC空模版项目

    直接看图吧:

  3. SingalR--介绍

    什么是SignalR? ASP.NET SignalR是为简化开发开发人员将实时web内容添加到应用程序过程而提供的类库.实时web功能指的是让服务器代码可以随时主动推送内容给客户端,而不是让服务器等 ...

  4. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误

    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...

  5. 删除div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. mysql ,为什么一张表的varchar关联另一张表varchar执行失败的一个原因

    CONSTRAINT `orderdts_ibfk_2` FOREIGN KEY (`address`) REFERENCES `test列` (`address`) 很可能的原因是另一张表的test ...

  7. hibernate----1-1

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  8. redis-desktop-manager

    介绍一款Redis图形管理工具:redis-desktop-manager 下载地址:点击打开链接 我们打开redis-cl.exe 客户端,在里面添加了key= name ,value=heyang ...

  9. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...

  10. php中读写excel表格文件示例。

    测试环境:php5.6.24.这块没啥兼容问题. 需要更多栗子,请看PHPExcel的examples.还是蛮强大的. 读取excel文件. 第一步.下载开源的PHPExcel的类库文件,官方网站是h ...