数据库基础(2)

单行函数

length():获取参数的字节值
concat():拼接字符串
upper():变大写
lower():变小写
substr():截取字符
instr():获取字符串第一次出现的索引
replace():替换
trim():去除前后空格或者指定字符

SELECT TRIM('+' FROM '++++李刚+++刘邦+++') AS out_put;

lpad():用指定的字符实现左填充指定长度
Rpad():右填充

SELECT LPAD('梅林',8,'+') AS out_put;

8是字符串总长度

流程控制

有两种情况
方式一:
case 后面加变量 匹配 then后面的东西

SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary1.1
WHEN 40 THEN salary
1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;

方式二:
case后面无表达式,when后加表达式

SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资等级
FROM employees;

组函数

介绍:作统计使用,又称聚合函数/统计函数/组函数
分类:sum,avg,max,min,count
特点:
1、
Where后面不能加 组函数,Having 后面可

分组查询

结构

select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】

注意!!
group by 后面的分组的字段 和 select 后面分组的字段要写成一样的。
分组的操作消耗的资源比较大,所以先过滤掉一些,再分组,这样的效率比较高。

*案例

#引入:查询每个部门的平均工资
SELECT AVG(salary) FROM employees;

#案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees 
GROUP BY job_id;

#案例2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

#添加筛选条件
#案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees
WHERE email LIKE '%a%' GROUP BY department_id;

#案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

#添加复杂的筛选条件
#案例1:查询哪个部门的员工个数>2
#1.查询每个部门的员工个数
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id;

#2.根据1的结果进行筛选,查询哪个部门的员工个数大于2
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id HAVING COUNT(*)>2;

#案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 
#1.查询每个工种有奖金的员工的最高工资 
SELECT MAX(salary),job_id FROM employees 
WHERE commission_pct IS NOT NULL GROUP BY job_id; 

#2.根据结果继续筛选,最高工资>12000 

SELECT MAX(salary), job_id FROM employees 
WHERE commission_pct IS NOT NULL GROUP BY job_id 
HAVING MAX(salary)>12000; 

#按表达式或函数分组

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5

#1.查询每个长度的员工个数 
SELECT COUNT(*),LENGTH(last_name) len_name 
FROM employees GROUP BY LENGTH(last_name); 

#2.添加筛选条件
SELECT COUNT(*) c,LENGTH(last_name) len_name 
FROM employees GROUP BY len_name HAVING c>5;

#按多个字段查询
#案例:查询每个部门每个工种的员工的平均工资

SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id;

#添加排序
#案例:查询每个部门每个工种的员工的平均工资,按平均工资的高低查询

SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;

连接查询

使用范围:数据来源于多个表
按功能分类:

-等值连接
-非等值连接
-自连接
-内连接
-外连接
  左外连接
  右外连接
  全外连接
-交叉连接

内连接:就是普通的连接
外连接:分左外连接,和右外连接
左外连接:搜索的结果左边,包含一些没有匹配的信息(如空值等)
右连接同理。
%代表任意个,一个零个或多个;
等值连接:

sql92,sql99连接的有区别,
但是只记住sql99标准就好了。

SQL99的语法

select 查询列表
from 表1 别名 【连接类型】

join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

内连接(★):inner
外连接
左外(★):left 【outer】
右外(★):right 【outer】
全外:full【outer】
交叉连接:cross

Inner 可以省略
Outer可以省略

子查询

多表连接
笛卡尔积的错误

自连接

非自连接

非等值连接

三张表连接

[图片上传失败...(image-ab5f74-1600854090108)]

笛卡机的错误

自连接

自己连接自己

基表,辅表

非等值连接

使用`` ,代表里面的内容是字段名,而非关键字。

外连接。

左半连接

内连接:就是普通的连接

外连接:分左外连接,和右外连接。

左外连接:搜索的结果左边,包含一些没有匹配的信息(如空值等)

%代表任意个,一个零个或多个;

Inner 可以省略

Outer可以省略

函数(方法)

字符函数

Lower,upper

SQL

初始下标为1,不是0

后面位置为5,

(index,length)

LPAD 左边填充,右对齐

RPAD 右边填充,左对齐

TRIM 去除两端的东西

[图片上传失败...(image-b0e7a7-1600854090108)]

Ifnull

Case 表达式

Case 1

When 2 then3

When 3 then 4

Else

other

End

Case

When 表达式1 then 2

When 表达式3 then4

别名加在end后面

值 case后面 加

表达式 case后面 不加东西

组函数

Avg 求平均值 没把 null 算在里面

Sum

Max

对任何类型的数值做运算

Min

Count

统计不为null 的数据

Count(*), 统计表中有多少条数据。

Count(1) 和Count(2)

Count (数值)比count(*)效率高

Select 后面出现组函数,

后面不能加字段,

若加 ,必须出现在group by后面

Group by

Where 约束

Having 用来过滤

Having和where

用having就一定要和group by连用,

用group by不一有having (它只是一个筛选条件用的)

[图片上传失败...(image-16f96b-1600854090108)]

Max是组函数的一种,

Where 不能和组函数和一起用,

Having 可以和组函数一起用。

Where一般放 group by前面

Having 放group 后面

分组的操作消耗的资源比较大,所以先过滤掉一些,再分组,这样的效率比较高。

[图片上传失败...(image-1f8e76-1600854090108)]

组函数

Where 和having

位置上:

Where在group by 前面

Having 在group by 后面

Where后面不能出现组函数

Having 能

过滤时间

Where 先过滤再分组

Having 先分组再过滤 ?

先过滤再分组

[图片上传失败...(image-ef3f23-1600854090107)]

子查询

在查询语句中再嵌套其他查询语句。

单行子查询:结果只有一条

多行子查询:结果有多条

单行子查询: > > =

多行子查询:

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