sql查询语句DQL笔记

RDBMS指关系型数据管理库,全称为Relational Database Management System
RDBMS是SQL的基础
在这里插入图片描述
SQL是一门ANSI(American National Standards Institute美国国家标准化组织)标准的计算机语言

1. select&from

select 字段名 决定这一段查询最后展示的字段, 后面加*表示返回所有字段,并且按照原有顺序返回
from 表名 指定这段查询语句涉及的语句来源

SELECT name as 国家名, continent, population FROM world

as可以省略

SELECT distinct continent FROM world

select之后加上distinct得到去重后的数据
distinct后加多个字段,是对重复的行数据进行去重

1.1 计算字段

select name, gdp, population, gdp/population 人均gdp for world

2. where

select 字段名 决定这一段查询最后展示的字段,
from 表名 指定这段查询语句涉及的语句来源
where 表达式

SELECT name, gdp/population 人均gdp 
FROM world
WHERE population >= 200000000

where 表达式 限定查询行必须满足的条件,是可选项,
在这里插入图片描述

SELECT population, name
FROM world
WHERE name in ('Germany', 'Sweden','Denmark')

在这里插入图片描述

SELECT population, name
FROM world
WHERE area between 250000 and 300000

2.1 模糊查询like

SELECT 字段名
FROM 表名
WHERE 字段名 like ‘通配符’+字符

通配符:
% 表示任何字符出现任意次数
_表示任何字符出现一次

SELECT  name
FROM world
WHERE name like 'c%ia'

2.2 多条件查询

使用and和or逻辑运算符对多个条件进行组合筛选想要的数据
and的优先级大于or

SELECT  name
FROM world
WHERE name like '%a%a%a%' 
and area>600000
SELECT  name
FROM world
WHERE name like '%a%a%a%' 
and area>600000
or population > 1300000000
and area >= 5000000
SELECT  name
FROM world
WHERE (name like '%a%a%a%' 
and area>600000)
or (population > 1300000000
and area >= 5000000)

在这里插入图片描述

3. order by

排序

select 字段名
from 表名
where 表达式
order by 字段名 asc|desc

order by关键字后面可以加多个字段,先排什么再排什么
在这里插入图片描述
在这里插入图片描述

select winner, yr, subject
from nobel
where winner like 'Sir%'
order by yr desc, winner asc

在这里插入图片描述
在这里插入图片描述
subject in 将后面字段中所涉及到的条目设为1,其余的记为0

4. limit

在这里插入图片描述
在这里插入图片描述

select name,population
from world
order by population desc
limit 3,4

在这里插入图片描述

5. 聚合函数和group by

where不可以连接聚合函数
在这里插入图片描述

5.1 单独使用聚合函数

在这里插入图片描述
计算表格行数

select count(*)
from world

在这里插入图片描述

5.2 单独使用group by

在这里插入图片描述
在这里插入图片描述

5.3 group by和聚合函数联用

在这里插入图片描述
在这里插入图片描述

select yr, subject, count(winner)
from nobel
where yr<=2015 and yr >=2013
group by yr, subject
order by yr desc,count(winner) desc

在这里插入图片描述
在这里插入图片描述

select continent,count(continent)
from world
where population >= 10000000
group by  continent

6. having

**加粗样式**
在这里插入图片描述

select continent,count(population)
from world
group by  continent
having sum(population)>10000000

在这里插入图片描述

select continent, avg(gdp) 平均gdp
from world
where gdp>20000000000 and population>60000000 or gdp<800000 and capital like '%a%%a%%a%'
group by continent
having sum(population)>=300000000
order by count(name) desc
limit 1

在这里插入图片描述
在这里插入图片描述

select continent, sum(population) ,sum(gdp)/sum(population)
from world
where gdp between 20000000000 and 30000000000
group by continent
having sum(gdp)/sum(population)>3000

自己写的这个有错误,avg(gdp)是除以count的,而人均gdp就除以相应人数的

select continent, sum(population) ,avg(gdp)
from world
where gdp between 20000000000 and 30000000000
group by continent
having avg(gdp)>3000

7. 部分常见函数

7.1 stuff函数

使用stuff的场景:

  1. 从字符串中删除字符数
  2. 再字符串中指定开始位置,从该位置开始,需要删除使用length参数定义的字符数
  3. 可以在新的子字符串中指定替换子字符串。
    语法:
    STUFF (character_expression , start , length , new_expression )

SELECT STUFF (@Character_Expression, 5, 6, 'On SQLShack') AS 'STUFF Function'

我们要从位置5开始并删除六个字符,并在起始位置5放置新的子字符串。
在这里插入图片描述
以下几种情况会输出null:

  1. STUFF函数的起始位置值大于字符串长度
  2. 以零作为起始位置的STUFF函数
  3. 使用STUFF函数删除和填充超出现有长度的字符
  4. 起始位置值为负的STUFF函数
    参考链接:sql stuff 函数_SQL STUFF函数概述
    【数学函数】

7.2 round函数(x,y)

round(x,y)-四舍五入函数
round函数对x值进行四舍五入,精确到小数点后y位
· y为负值时,保留小数点左边相应的位数为0,不进行四舍五入
· 例如:round(3.15,1)返回3.2,round(14.15,-1)返回10
【字符串函数】

7.3 concat函数

concat(s1,s2,,…) 连接字符串函数
在这里插入图片描述

replace(s,s1,s2)–替换函数
在这里插入图片描述

left(s,n)、right(s,n)&substring(s,n,len)–截取字符串一部分的函数

在这里插入图片描述

cast()在这里插入图片描述

7.3 获取年月日的函数

year(date)、month(date)&day(date)- 获取年月日的函数 1.58
在这里插入图片描述

7.4 对时间进行加减操作

date_add(date,interval expr type)&date_sub(date,interval expr type)-—对指定起始时间进行加减操作
在这里插入图片描述

7.5 计算两个日期之间间隔的天数

datediff(datel,date2)——计算两个日期之间间隔的天数
在这里插入图片描述

date_format(date,format)—将日期和时间格式化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select name,capital
from world
where left(name,1)=left(capital,1) and name!=capital

7.6 substring_index

substring_index(str,delim,count)
str:要处理的字符串
delim:分隔符
count:计数

例子:str=www.wikibt.com

      substring_index(str,'.',1)

      结果是:www

      substring_index(str,'.',2)

      结果是:www.wikibt

      也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容

      相反,如果是负数,那么就是从右边开始数,第N个分隔符右边的所有内容,如:

      substring_index(str,'.',-2)

      结果为:wikibt.com

     有人会问,如果我要中间的的wikibt怎么办?

     很简单的,两个方向:

     从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:

   substring_index(substring_index(str,'.',-2),'.',1);

8. 窗口函数

over( [partition by 字段名] [order by 字段名 asc|desc])

where,having是对数据进行筛选,而窗口函数是对表格进行复制,开窗操作,从而进行排序。所以不可以再进行筛选
在这里插入图片描述
在这里插入图片描述
对yr进行分区,然后对party进行降序排序

select yr
,party
, votes
,rank()over(partition by yr order by votes desc) as posn
from ge
where constituency=S14000021
order by parth,yr

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select
name
,date_format(whn,'%Y-%m-%d') date
,confirmed 当天截至时间累计确诊人数
,lag(confirmed,1)over(partition by name order by whn) 昨天截止时间累计确诊人数
,(confirmed-lag(confirmed,1)over(partition by name order by whn)) 每天新增确诊人数
from covid
where name in ('France','Germany') and mouth(whn)=1
order by whn

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

select
name
,date_format(whn,'%Y-%m-%d') date
,(confirmed-lag(confirmed,1)over(partition by name order by whn)) New
from covid
where name='Italy'
and weekday(whn)=0
order by whn

9. 表链接

在这里插入图片描述
在这里插入图片描述
https://sqlzoo.net/wiki/Using_Null
在这里插入图片描述
在这里插入图片描述

select teacher.name, dept.name
from teacher
left join dept
on teacher.dept = dept.id

在这里插入图片描述
https://sqlzoo.net/wiki/More_JOIN_operations
在这里插入图片描述

SELECT name
FROM casting c
join actor a
on  a.id = c.actorid
where ord=1 
group by name
having count(movieid)>=30

在这里插入图片描述
在这里插入图片描述

select 
mdate
,team1
,sum(case when ga.team1=go.teamid then 1 else 0 end) score1
,ga.team2
,sum(case when ga.team2=go.teamid then 1 else 0 end) score2
from game ga
left join goal go
on ga.id = go.matchid
group by ga.mdate, ga.team1, ga.team2
order by ga.mdate,go.matchid,ga.team1,ga.team2

10. 子查询

在这里插入图片描述
在这里插入图片描述

select name
from world
where gdp is not null
and gdp>(
select max(gdp)
from world
where continent='Europe')

在这里插入图片描述

select name,continent
from world
where continent = (
select continent
from world
where name='Argentina' 
)
or continent = (
select continent
from world
where name='Austrelia' 
)
order by name

在这里插入图片描述
在这里插入图片描述
第一个子查询是为了将 将当选议员在当选区 按次数排序
然后再到这张表来对 得票数最高的 进行输出
因为是要对窗口函数进行筛选

select constituency,party
from(
select constituency,party,votes
,rank()over(partition by constituency order by votes desc) posn
from eg
where yr=2017
and constituency between 'S14000021' and 'S14000026'
) as rk
where rk.posn = 1

在这里插入图片描述
在这里插入图片描述

select name
from world
where continent='Europe'
and gdp/population >(
select gdp/population
from world
where name='United Kingdom')

求均小于等于25000000的大洲,可以把存在大于25000000的大洲排除diao
在这里插入图片描述
在这里插入图片描述

select continent,
name,
area
from(select continent
,name
,area
,rank()over(partition by continent order by area) as pson
from world) as pr
where pr.pson = 1

3.15 为什么order by可以引用窗口函数?
https://www.bilibili.com/video/BV1ZM4y1u7uF?p=4
在这里插入图片描述
在这里插入图片描述

11. insert into

select into from 要求目标表不存在,因为在插入时会自动创建。
insert into select from 要求目标表存在

insert into scorebak select * from socre where neza='neza'   --插入一行,要求表scorebak 必须存在
select *  into scorebak from score  where neza='neza'  --也是插入一行,要求表scorebak 不存在

12. SQL AUTO INCREMENT 字段

Auto-increment 会在新记录插入表中时生成一个唯一的数字。

13. SQL CREATE TABLE 语句

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);

https://www.runoob.com/sql/sql-create-table.html

14. SQL NOT NULL 约束

在这里插入图片描述

问题

1. count(*)和count(1)的区别

在这里插入图片描述

2. insert table 和create table as 区别

最大的区别就是两种属于不同类别的语句,

insert table 是DML语句(数据操作语言,SQL中处理数据等操作统称为数据操纵语言)完成后需要提交才能生效
而create table as是DDL语句(数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 ),执行完直接生效,数据不提供回滚,效率比较高。

其次,功能不同。前者只是插入数据,所以必须先建表。而后者是插入数据和建表同时完成。

insert  into  table1(columns1,columns2) select  columns1,columns2  from  table2;

从table2中查询的结果插入到table1中,前提是table1和table2已经存在;

create. as…select一般有以下三种方式:

create table table1 as select  * from table2  where 1=2;

创建一个表结构与table2一模一样的表,只复制结构不复制数据;

create  table table1  as  select *   from table2  ;

创建一个表结构与table2一模一样的表,复制结构同时也复制数据;

create  table table1(columns_a,columns_b) as select  columns1,columns2  from table2; 

创建一个表结构与table2一模一样的表,复制结构同时也复制数据,但是指定新表的列名,这种格式也用于复制table2部分字段;

后面两种格式,如果后面跟上合适的查询条件,可以只复制符合条件的数据到新的表中,例如:

create  table table1  as  select *   from table2  where columns1>=1;

可能的情况下,建议用第二种方式,这种方式不仅能一次完成建表和插入数据,而且效率高,特别是当复制的数据量比较大时,可以避免大量数据存在回滚空间中等待提交。

3. SQL union 和uinon all 的区别

4. count 表名1,,,表名n 为什么比count * 运行快?

介于性能优化方面 建议用第2种

5. or和union all的区别

or会去重,而union all 不会去重。
比方说这个题 SQL25 查找山东大学或者性别为男生的信息
若使用or 的话,若同时满足是山东大学和是男生的条件,则会先被第一个条件筛选出来,而第二个条件虽然也满足,但是已经被筛选出来了。
而union all的话,就是分别进行筛选(各个的筛选条件互不影响),然后再进行组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值