一,数据库

(1)数据库

数据库:是一个以某种有组织的方法存储的数据集合

数据库软件:数据库管理系统(DBMS),一般用DBMS创建和操作数据库

(2)数据类型

(3)主键

主键:表中每一行都应该有一列唯一标识自己

特点:a,任意两行不应该有相同的主键值;

b,每一行必须有一个主键值(主键列不许有空值);

c,主键列中的值不允许有更新或更改;

d,主键值不能重复使用(若某行值被删除,它的主键值不可以赋给新的行)

(4)什么是SQL

SQL:是一种专门用来与数据库沟通的语言(Structured Query Language)

优点:简单易学;灵活,可以进行非常复杂和高级的数据库操作

注意:不区分大小写

二,SELECT语句

(1)检索单列

select ‘字段名’ from ‘表名’;(一般用;表示一条语句结束)

(2)检索多列

1,select ‘字段名1’,‘字段名2’,‘字段名3’ from ‘表名’;(字段用,隔开)

2,select * from ‘表名’;(*表示所有字段名)

3,select distinct ‘字段名’ from ‘表名’;(distinct表示去重)

4,限制结果

select top 5 ‘字段名’ from ‘表名’;(SQL Server 和 Access,用top5限制前5行)

select ‘字段名’ from ‘表名’ fetch first 5 rows only;(DB2,限制前5行)

select ‘字段名’ from ‘表名’ where rownum <= 5;(Oracle需要rownum行计数器计算行)

select ‘字段名’ from ‘表名’ limit 5;(MySQL,MariaDB,PostgreSQL,SQLLite)

select ‘字段名’ from ‘表名’ limit 5 offset 5;(第一个数字指从哪开始,第二个指检索几行)

5,使用注释

-- (两个连字符--加空格)

#(一行注释)

/*   */(多行注释)

(3)排序检索

select ‘字段名’ from ‘表名’ order by ‘字段名1’;(按字段名1升序排列)

select ‘字段名’ from ‘表名’ order by ‘字段名1’ desc;(按字段名1降序排列)

select ‘字段名1’ from ‘表名’ order by ‘字段名1’,‘字段名2’;(在按1排的基础上按2排)

select ‘字段名1’,‘字段名2’,‘字段名3’ from ‘表名’ order by 1;(按‘字段名1’排序)

若需对a和A进行排序,则请求数据库管理员帮助

三,WHERE语句

where位于from之后

(1)操作符

=        !=    >=    <=

(2)范围匹配(and操作符优先级高于or)

1,满足其中一个值即可

in操作符比or操作符执行更快

where ‘字段’ in (‘值1’,‘值2’);(in后也可以包含其他select语句)

where 条件1 or 条件2;

2,同时满足

where ‘字段’ between ‘值1’ and ‘值2’ ;(包含值1和值2)

where 条件1 and 条件2;

(3)模糊匹配 like

1,通配符%

where ‘字段’ like ‘值%’;(字段包含值,且值在第一位)

where ‘字段’ like ‘%数值’;(字段包含数值,且数值处于最后)

%表示多个字符,可位于前面,中间,后面

若字母后面有空格则不会被筛选出来,需要用函数去掉空格

不会匹配null

2,通配符_(DB2不支持通配符_)

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

3,通配符技巧

a,不要过度使用,如其他操作符可达到目的,应使用操作符;

b,使用时,不要放在开始处,搜索起来最慢;

c,仔细通配符放置的位置;

(4)找到空值

where ‘字段’ is not null;(筛选出字段为不为空的值)

not操作符用来表示否定,一般和其他操作符一起使用

四,创建计算字段

计算字段:

我们需要直接从数据库中检索出转化,计算,格式化过的数据,然后在客户端重新格式化。

操作符,+,-,*,/

拼接字段:

创建由两列组成的标题,vendors表中包含供应商和地址信息。

假如,要生成一个供应商报表,需要在格式化的名称中列出供应商的位置。此报表需要一个值,而表中的数据存储在两个列vend_name和vend_country中。需要将vend_country用括号括起来,这些东西没有存储在数据库表中。

解决办法:把两个列撇接起来,在SQL中select语句中,可用一个特殊的操作符来拼接两个列。可用(+)和(||)表示。

Access和SQL Server使用+

DB2,Oracle,PostgreSQL,SQLite,Open Office Base使用||

select vend_name + ‘(’ + vend_country +‘)’ from Vendors order by vend_name;

select concat(vend_name,‘(’,vend_country,‘)’)from Vendors order by vend_name

concat()拼接函数

分析:

a,存储在vend_name列中的名字;

b,包含一个空格和一个(的字符串;

c,存储在vend_country列中的国家;

d,包含一个)的字符串

select rtrim(vend_name)+‘(’+rtrim(vend_country)+‘)’ from Vendors

rtrim()函数:去掉右边的所有空格

ltrim()函数:去掉左边的所有空格

trim()函数:去掉两边的空格

创建的没有表名,需要对它进行命名

select rtrim(vend_name)+‘(’+rtrim(vend_country)+‘)’  as vend_title from Vendors

五,函数

1,文本处理函数

rtrim():去掉右边的所有空格

upper():将所有小写字母转换成大写字母

lower():将字母全部转换成小写

left(‘hello’,‘Word’):返回字符串左边的字符       ‘hello’

left(‘hello’,4):返回字符串从左边的几个字符     ‘hell’

right(‘hello’,3):返回字符串右边的几个字符       ‘llo’

replace(‘vessel’,‘e’,‘a’):将字母e转换成a         ‘vassel’

substring(‘Angola’,2,4):从第2位开始取4个字符     ‘ngol’

position(‘ll’ in ‘hello’):看第一个字符串是否包含在第二个字符串,输出位置       3

position(‘an’ in ‘camper’): 若不存在,返回0                0

locate(x,y,z):在y中找x,从z位开始查找,

locate(‘k’,‘12k-15k’):k在第3位,返回3

locate(‘k’,‘8k-15k’,3):返回6,若从第2位开始查找,则返回2

soundex():返回类似发音字符和音节

where soundex(cust_countact)= soundex(‘Micheal Green’)        ‘Michelle Green’

2,日期和时间处理函数

from_unixtime():将时间戳转化成日期时间格式

datepart():含有两个参数,返回成分和从中返回的日期

datepart(‘yyyy’,‘字段’):从字段中返回年份

SQL Server,Sybase,Access版本使用datepart函数

date_part():返回检索日期     date_part(‘year’,order_date)

PostgreSQL版本使用date_part

ro_number(to_char(order_date,‘YYYY’))

Oracle版本使用to_number()用来捋提出的成分转化成数值,to_char()用来提取日期成分

to_date(‘01-01-2010’):将字符串转化成日期

Oracle版本

convert():将字符串转化成日期

SQL Server版本

year(order_date):提取字段年份

MySQL和MariaDB版本

interval  n  day:返回n天后的日期

date ‘2016-05-20’ + interval 5 day :5天后‘2016-05-25’

date ‘2016-05-20’ + 5 :5天后‘2016-05-25’

date ‘2016-05-20’ +interval 5 month :5月后‘2016-10-20’

date ‘2016-05-20’ + interval 5 year:5年后 ‘2021-05-20’

extract():检索日期组成部分

year    month     day     hour     minute     second

extract(year  from  ‘2006-05-20’): ‘2006’

3,数值处理函数

一般用于代数,三角,几何运算

abs():返回绝对值

nvl(x,y):返回不是空值的第一个

coalesce(x,y,z):返回不为空的第一个值,否则返回null

coalesce(‘null’,‘none’):    ‘none’

nullif(x,y):x=y,返回null,否则返回第一个

nullif(‘snp’,‘lab’):‘snp’

floor(32.9):返回整数值32

ceil(3.2):四入五入,返回 4

concat():合并

mod(a,b):取余a%b

round():将小数保留几位

round(7.86,1):7.9

round(7253.86,-3):7000

sin():返回一个角度的正弦

cos():返回一个角度的余弦

tan():返回一个角度的正切

exp():返回一个数的指数值

sqrt():返回一个数的平方根

pi():返回圆周率

4,聚集函数

sum():求和(忽略值为null的行)

avg():求平均值(忽略列值为null的行)

count():计数(指定列名会忽略空值)

max():最大值(忽略值为null的行)

min():最小值(忽略值为null的行)

5,聚集函数

可以使用多个函数,记得取别名

六,分组数据

select ‘字段’,count(*) from ‘表名’ group by ‘字段1’

表示对字段进行分组后计算

在 group by 后不可以跟别名

在 where 之后 order by 之前

1,过滤分组(having)

select ‘字段’,count(*) from ‘表名’ group by ‘字段1’ having count(*)>2;

where 和 having 语句区别:

where 不可以筛选分组,先运行 where 筛选,后 having 筛选

having 和 where 使用语法相同,要结合 group by 语句使用

2,分组和排序

group by 和 order by一般同时使用

七,使用子查询

子查询:嵌套在其他查询中的查询

order表中存储订单日期,顾客ID

orderItems表存储各订单的物品

customers表存储顾客的有关信息

(1)利用子查询进行过滤

需列出订购物品RGAN01的所有顾客

1,筛选出购买RGAN01的订单编号

select order_num from orderItems where prod_id = ‘RGAN01’;

2,有订单编号的顾客ID

select cust_id from orders where order_num in(20007,20008);

3,返回顾客信息

select cust_name,cust_contact from customers where cust_id in (‘1000000004’,‘1000000005’);

用子查询语句:

select cust_name,cust_contact from customer where cust_id

in(select order_num from orders where order_num

in(select order_num from orderItems where prod_id = ‘RGAN01’));

从内向外处理,只能是单列

(2)计算字段使用子查询

需要显示customers表中每个顾客的订单总数

1,从customers表中检索顾客列表

2,检索出的每个顾客,统计在orders表中的订单数目

select cust_name,cust_state,

(select count(*) from orders where orders.cust_id = customers.cust_id) as 购买顾客ID

from customers order by cust_name;

完全限定列名

八,表连接

1,关系表

把信息分解为多个表,一类数据一个表,各表通过某些共同的值相互关联

2,等值连接

select vend_name,prod_price from Vendors v,products p where v.vend_id=p.vend_id;

完全限定

第一个表中第一行和第二个表中每一行配对

3,笛卡尔积:由没有联结条件的表关系返回的结果

4,内连接:基于两个表之间的相等测试

select * from Vendors v inner joinproducts p onv.vend_id=p.vend_id

三个表链接:

select cust_name,cust_contact from customer where cust_id

in(select order_num from orders where order_num

in(select order_num from orderItems where prod_id = ‘RGAN01’));

等价于

select cust_name,cust_contact from customer c,orders o,orderItems d

where c.cust_id=o.cust_id and d.order_num=o.order_num and prod_id = ‘RGAN01’;

5,自连接

要与Jim Jones同一公司的所有顾客发送一封信

1,找出与Jim Jones的公司

2,找出公司内的顾客信息

子查询

select cust_id,cust_name,cust_contact from customers where

cust_name =(select cust_name from customers where cust_contact = ‘Jim Jones’);

等价于

select cust_id,cust_name,cust_contact from customers c1,customers c2 where

c1.cust_name=c2.cust_name and c2.cust_contact = ‘Jim Iones’;

6,自然连接

排除多次出现的列,是每列只返回一次

select c.*,o.order_num,o.order_date from customers c,orders o where

c.cust_id = o.cust_id

通配符只对customers表进行全部取,对orders表只取一部分,以保证没有重复列

7,外连接

包含了在相关表中没有关联行的行

select c.cust_id,o.order_num from customers c left (outer) join orders o

on  c.cust_id = o.cust_id;

left outer join :左链接,左边的表为主表链接右边的表(包含左边所有的值)

right outer join : 右链接,右边的表为主表链接左边的表(包含右边所有的值)

可以通过改变 left outer join 两边的表,转换为右链接

full outer join :全外连接(包含左右两边所有的值)

Access,MariaDB,MySQL,Open Office Base,SQLite不支持full outer join

也可以在 select 后添加聚集函数

8,注意事项

a,一般使用内连接,使用外连接也有效;

b,看相应的DBMs支持何种语法;

c,保证使用正确的连接条件;

d,提供连接条件,否则会出现笛卡尔积;

e,在一个连接中包含多个表,可以对每个连接采用不同的连接类型

server sql 分组 去重 字符串拼接_SQL必知必会相关推荐

  1. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法

    | 作者:无眠 | 来源:知乎 前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:"楼主能分享一下文科生怎么转行做数据分析吗??".&qu ...

  2. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  3. SQL Server必知必会

    SQL Server必知必会 2009-10-27-17:57:57 Structure     Query     Language:SQL 结构化       查询      语言 数据库产品: ...

  4. sql 数据库前两列值乘_SQL | SQL 必知必会笔记 (一 )

    原文:SQL | SQL 必知必会笔记 (一 ) 作者: PyStaData 基本概念 一些规则 多条 SQL 语句必须以分号分隔. SQL 不区分大小写,但一般习惯关键字用大写,列名和表名使用小写. ...

  5. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

  6. SQL必知必会第4版读书笔记

    SQL必知必会_4 前言 @author 鲁伟林 在读电子版<<SQL必知必会>> 第4版时,做了下笔记.供以后自己或者其他学习者参考. 电子版<<SQL必知必会& ...

  7. 【SQL】【读书笔记】《MySQL必知必会》

    本文为<MySQL必知必会>[1]读书笔记,用于总结知识点和框架,仅供参考和交流,如有不妥请联系.由于软件版本更新,书中的一些代码已经不再适用,本文主要从SQL基本语句进行增删减.窗口函数 ...

  8. SQL必知必会挑战题答案

    SQL必知必会挑战题答案 创建数据表 -- ----------------------------------------- -- Sams Teach Yourself SQL in 10 Min ...

  9. SQL必知必会(第五版)

    SQL必知必会 了解SQL 1.数据库 数据库就像是一个容器,存放各种表.需要与DBMS区分 1.1表 一个结构化的清单,存储各种数据. sql全称是struct query language 结构化 ...

最新文章

  1. archlinux安装chrome-webdriver
  2. router6 QoS 1 基础知识
  3. Activity栈管理(三):Intent的Flag与taskAffinity
  4. NFS挂载的问题svc: failed to register lockdv1 RPC service
  5. 如何展示富文本_自助建站如何做出个性化效果?
  6. 实数范围内(包含负数)的求模与求余运算异同
  7. python爬取2019年计算机就业_2019年最新Python爬取腾讯招聘网信息代码解析
  8. 关于 httpUrlConnection 的 setDoOutput 与 setDoInput的区别
  9. VS2019调试查看变量_机器人调试(六十六)
  10. 机械工程人工智能_机械工程中的人工智能
  11. 软件工程毕设项目 - 基于SSM的毕业设计管理系统(含源码+论文)
  12. Struts1与Struts2原理以及区别
  13. Spark学习内容介绍
  14. 水水的证件-身份证、证件加水印小工具
  15. PSIFT:Pore Scale-invariant feature transform;毛孔尺度不变特征点
  16. {转载}circos绘图(3)
  17. JQuery UI的拖拽功能
  18. 锁的优化机制了解嘛?请进!
  19. Pr 仿漫威片头效果~
  20. 听音乐用什么蓝牙耳机好?听音乐音质好的蓝牙耳机推荐

热门文章

  1. 需要c语言,需要C语言的需要什么工具软件
  2. 微信小程序 - 授权页面
  3. 【转】Java计算文件的hash值
  4. Excel向数据库插入数据(执行一次只需连接一次)-batch简单使用
  5. arcgis flexviewer中由Application向widget传值
  6. 第四届HTML5峰会 - 上海站
  7. poj 2240 Arbitrage(bellman-ford spfa 判断正环)
  8. FireMonkey 源码学习(2)
  9. Android布局控件之LinearLayout详解
  10. python队列来做什么_简单介绍python的双向队列