SQL必知必会(一)

将之前学习的数据库知识在整理下,主要是看的《SQL必知必会》。这本书不愧是经典,入门数据库真的完全足够啦!

image

数据库基础

数据库

保存有组织的数据的容器,通常是一个文件或者一组文件

结构化的文件,用来存储某种特定的数据

列和数据类型

列指的是表中的字段。所有的表都是有一个或者多个列组成的。表中的每列存储着某种特定的信息。数据库中的每个列对应着相应的字段类型。

表中的数据是按照行存储的。垂直为列,水平为行。行指的是表中的一个记录

主键

表中的每一行都应该有一列或者几列可以唯一标识自己。主键满足的条件是:

  • 任意两行不具有相同的主键值
  • 每行必须有一个主键值
  • 主键列中的值不允许修改或者更新
  • 主键值不能重用

创建表

create table products(
  prod_id char(10) not null,
  vend_id char(20) not null,
  prod_name char(20) not null,
  prod_price decimal(8,2) not null,   -- 指定小数位:2位
  quantity integer not null default 1,   -- 指定默认值
  prod_desc varchar(1000) null
);

插入数据

insert into customers(cust_id,
                      cust_name,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country,
                      cust_contact,
                      cust_email
                     )
values('1000006',
       'Toy Land',
       '123 any street',
       'NY',
       '11111',
       'USA',
       null,
       null);

检索数据select

select prod_id, prod_name   -- 检索部分或者全部字段信息
from products;

select * 
from products; 

select distinct vend_id   -- 检索不同的字段值 distinct
from products;

select top 5 prod_name   -- 限制最多返回5行数据(SQL server)
from products;

select prod_name 
from products
limit 5;    -- mysql中使用limit来限制返回的条数

select prod_name 
from products
limit 5 offset 4   -- 表示从第4行开始(offset),显示5行数据(limit)
limit 4, 5   -- 简化版,逗号之后5表示的是limit限制的条数

排序检索数据order by

主要使用的是order by子句,在select语句中是最后的位置。

按照字段排序

select prod_name
from products 
order by prod_name;   -- 通过单个字段进行排序

select prod_id, prod_price, prod_name
from products
order by prod_price, prod_name  -- 多个字段进行排序
order by 2,3  -- 按照字段的位置进行排序

指定升降序

默认是asc升序,降序是desc。关键字只能够应用到直接作用于其前面的列名上。

select prod_id, prod_name, prod_price
from products
order by prod_price desc;   -- 指定为降序
order by prod_price desc, prod_name;  -- 先对prod_price降序,再对prod_name默认升序 

笔记:order by 子句必须是select语句的最后语句

过滤语句where

order by要在where子句之后。

基础过滤

只需要搜索数据指定搜索条件,搜索条件也称之为过滤条件

select prod_name, prod_price
from products
where prod_price <= 50;
where prod_price <> 50;  -- != 和<> 大部分数据库系统可以互换
where prod_price between 50 and 60;
where prod_price is null;

高级过滤

select prod_name, prod_price
from products
where prod_price <= 50 and prod_name='DLL01';  --and

select prod_name, prod_price
from products
where prod_price <= 50 or prod_price >=60;  --or

笔记:and的优先级在or之前;如果同时存在最好加上圆括号来进行明确的分割。

select prod_name, prod_price
from products
where vend_id in ('DLL01', 'BRS01')  -- 等价于如下 or 表示的语句
where vend_id in 'DLL01' or vend_id in 'BRS01')
order by prod_name;  -- order by 一定在 where 之后

笔记:使用in的好处

  • 语法清楚,更直观
  • 求值顺序更容易管理
  • in子句中可以包含更多其他的select子句,动态地建立where子句
select prod_name, prod_price
from products
where not vend_id = 'DLL01';
where  vend_id <> 'DLL01';   -- <>同样的功能
order by prod_name

通配符使用like

使用通配符能够创建比较特定数据的搜索模式。通配符通常是用来匹配一部分的特殊字符,只能用于文本字段,非文本数据不能使用通配符搜索。

百分号%

匹配的是0个、1个或者多个字符

select prod_id, prod_name
from products
where prod_name like 'Fish%';  -- 实现右、左、左右同时匹配
where prod_name like '%Fish';
where prod_name like '%Fish%';

短横线_

只能匹配单个字符,不能多也不能少

select prod_id, prod_name
from products
where prod_name like '__inch teddy bear'   -- 2个短横线,匹配2个字符

方括号[]

方括号通配符通常是用来指定一个字符集,必须匹配指定位置的一个字符。使用^可以进行取反操作

-- 找出名字是以J和M开头的人
select cust_contact
from customers
where cust_contact like '[JM]%'   -- 2个通配符的使用,一个是[],另一个是%
order by cust_contact;

-- 找出名字不是以J和M开头的人:取反操作
select cust_contact
from customers
where cust_contact like '[^JM]%'   -- 使用^进行取反操作
order by cust_contact;

笔记:使用通配符的技巧

  1. 不要过度使用
  2. 尽量不要把通配符置于开始处,速度慢
  3. 注意通配符的位置

计算相关

拼接concatenate

select concat(vend_name, '(',  vend_country, ')')
from vendors
order by vend_name;

笔记:SQL中使用RTRIM()函数来去掉右边的空格;LTRIM去掉左边;TRIM去掉左右两边的空格

使用别名as

select concat(vend_name, '(',  vend_country, ')') 
            as vend_title   -- 别名使用 
from vendors
order by vend_name;

笔记:别名最常用的功能是将多个单词的列名重命名为一个单词的名字

算术运算

对检索出的数据进行算术运算

select prod_price, item_price, quantity,
                quantity * item_price as expanded_price   -- 计算之后再起别名
from orderitems
where order_num = 2008;

使用函数处理数据

去掉空格

  • RTRIM:去掉右边
  • LTRIM:去掉左边
  • TRIM:去掉两边

文本处理

  • upper:将文本转化为大写

  • lower:将文本转化为小写

  • length:返回的是字符串长度

  • soundex:任何一个文本返回其soundex值(描述发音)

数值处理

ABS:绝对值

COS/SIN:余弦和正弦值

EXP:指数值

TAN:角度正切值

汇总和聚合

常见的聚合函数

函数 功能
avg() 平均值;<br />忽略列值为NULL的行
count() 行数;<br />count(*):统计所有的行数,包含列是NULL的行<br />count(column):特定的列进行统计,忽略NULL值
max() 最大值<br />忽略列值为NULL的行
min() 最小值<br />忽略列值为NULL的行
sum() 某列值之和<br />忽略列值为NULL的行
select avg(prod_price) as avg_price
from products
where vend_id = 'DLL01';

select max(prod_price) as max_price   -- max列出最大值
from products

select sum(item_price*quantity) as total_price  -- sum用于合计计算值
from orer_items
where order_num=20005;

上面5个函数的使用方法:

  • 对所有行执行计算,指定all或者不指定参数,因为是默认ALL
  • 只包含不同的列值,指定DISTINCT参数
  • DISTINCT参数不能用于count(*),只能用于count(column)指定特定字段
select avg(distinct prod_price) as avg_price
from products
where vend_id = 'DLL01';

组合聚集函数

多个聚集函数同时使用

select count(*) as num_items,
                min(prod_price) as price_min,
                max(prod_price) as price_max,
                avg(prod_price) as price_avg
from products;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272