Loading

Sql查询语法学习

数据库概述

一、数据库的好处

  • 可以持久化数据到本地
  • 结构化查询
    二、数据库常见概念
  • DB:数据库,存储数据的容器
  • DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
  • SQL:结构化查询语句,用于和数据库通讯的语言,不是某个数据库软件特有的,而是几乎所有主流数据库软件通用的语言
    三、数据库存储数据的特点
  • 数据存放到表中,然后表再放到库中
  • 一个库中可以有多张表,每张表具有唯一的表名来标识自己
  • 表中有一个或多个列,列又称为“字段”
  • 表中的每一行数据,相当于jave中的对象
  • 函数:类似于java的方法

单行函数

length
concat
substr
instr
trim
upper
lower
ipad
read
replace

一、字符函数

  1. length 获取参数数值的字节字数
  2. concat 拼接字符串
  3. upper、lower 转大写小写

某个函数的返回值可以充当另一个函数的参数

  1. substr、substring 截取字符串

SELECT CONCAT(UPPER(SUBSTR(LAST_NAME,1,1)),'_',LOWER(SUBSTR(LAST_NAME,2))) OUT_PUT FROM EMPLOYEES;

  1. instr 返回子串第一次出现的索引,如果找不到返回0
  2. trim 去掉前后空格

SELECT LENGTH(TRIM(' 王思扬 ')) AS OUT_PUT;

SELECT TRIM('A' FROM 'AAAA王思扬AAAAA');

  1. lpad 用指定的字符实现左填充指定长度

SELECT LPAD('殷素素',2,'*') AS out_put;

  1. rpad 用指定的字符实现右填充指定长度
  2. replace 替换

二、数学函数

  • round 四舍五入
  • ceil 向上取整,返回>=该参数的最小整数
  • floor 向下取整,返回<=该参数的最大整数
  • truncate 截断
  • mod 取余 公式: a -⌊ a/b⌋ * b

三、日期函数

  • now 返回当前系统日期+时间
  • curdate
  • curtime
  • YEAR MONTH 年月日时分秒
  • str_to_date 将字符通过指定的格式转换成日期
  • date_format 将日期转换成字符

四、其他函数

  • VERSION();
  • DATABASE();
  • USER();

五、流程控制函数

  • if函数; if else的效果

  • case函数

    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句2
    when 常量2 then 要显示的值2或语句2
    ···
    else 要显示的值n或语句n;
    end
    SELECT salary 原始工资, department_id,
    CASE department_id
    WHEN 30 THEN salary*1.1
    WHEN 40 THEN salary*1.2
    WHEN 50 THEN salary*1.3
    ELSE salary
    END AS 新工资
    FROM employees;
    
    case
    when 条件1 then 要显示的值1或者语句1
    when 条件2 then 要显示的值2或者语句2
    ···
    else 要显示的值n或语句n
    end
    SELECT salary,
    CASE
    WHEN salary>20000 THEN 'A'
    WHEN salary>15000 THEN 'B'
    WHEN salary>10000 THEN 'C'
    ELSE 'D'
    END
    

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

分类:

sum 求和 、avg 平均数、max 最大值、 min 最小值 、 count 计算个数

count函数的详细介绍

匹配多列中值不为null或者0的都+1 主要是跟表的性质有关,一般使用count(*)来做统计

特点:

	1.分组查询中的筛选条件分为两类

	                   数据源               位置               关键字                                     

	分组前筛选         原始表	 group by 子句的前面       where						

	分组后筛选 	分组后的结果集	 group by 子句的后面    	  having

	①分组函数做条件肯定是放在having子句中

	②能用分组前筛选的,就有限考虑分组前筛选

	2.group by 子句支持单个字段分组,多个字段分组

	3.也可以添加排序(放在最后)

分组查询

语法:
	select 分组函数,列 (要求出现在group by的后面)
	from 表
	【where 筛选条件】
	group by 分组列表
	【having 分组后的筛选】
	【order by 子句】
注意:
	查询列表必须特殊,要求是分组函数和group by后出现的字段

连接查询

含义:又称多表查询,当查询的字段来至多个表时,就会用到连接查询。

笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件


sql92语法

内连接

			1.等值
			select 查询列表
			from 表1 别名,表2 别名
			where 表1.key=表2.key
			【and 筛选条件】
			【group by 分组字段】
			【having 分组后的筛选】
			【order by 排序字段】
			特点:
				①一般为表起别名
				②多表的顺序可以调换
				③n表连接至少需要n-1个连接条件
				④等值连接的结果是多表的交集部分

			2.非等值
			select 查询列表
			from 表1 别名,表2 别名
			where 非等值连接条件
			【and 筛选条件】
			【group by 分组字段】
			【having 分组后的筛选】
			【order by 排序字段】

			3.自连接
			select 查询列表
			from 表 别名1,表 别名2
			where 等值连接条件
			【and 筛选条件】
			【group by 分组字段】
			【having 分组后的筛选】
			【order by 排序字段】
外连接
			4.左外
			
			5.右外

			6.全外

交叉连接

sql99语法

语法:
		select 查询列表
		from 表1 别名 【连接类型】
		join 表2 别名 on 连接条件
		【where 筛选条件】
		【group by 分组】
		【having 筛选条件】
		【order by 排序列表】
分类:
内连接:inner语法:

		select 查询列表
		from 表1 别名
		inner join 表2 别名       表2也可以在括号内加上子查询
		on 连接条件
		
		等值
			特点:
			①添加排序、分组、筛选
			②inner可以省略
			③筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
			④ 和sql92语法一样都是查询表的交集结果
		非等值
		自连接
	
外连接:
应用场景:用于查询一张表中有,另一个表没有的记录。
特点:
1、外连接的查询结果为主表中的所有记录
	如果从表中有和它匹配的,则显示匹配的值
	如果从表中没有和它匹配的,则显示null
	外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表
   右外连接,right join右边的是主表
3、左外和右外交换连个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2中没有但表1中没有的
		左外 left【outer】
		右外 right【outer】
		全外 full【outer】
交叉连接:cross 
笛卡尔乘积

子查询

含义:
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询

分类:
按子查询出现的位置

  • select后面
    • 仅仅支持标量子查询
  • from后面
    • 表子查询
  • where或having后面
    • 标量子查询
    • 列子查询==
    • 行子查询
  • exists
    • 表子查询

按结果集的行数列不同:

  • 标量子查询(结果集只有一行一列)
  • 列子查询(结果集只有一列多行)
  • 行子查询(结果集有一行多列)
  • 表子查询(结果集一般为多行多列)

一、where或having后面

标量子查询(单行子查询)

案例1:谁的工作比Abel高
①查询Abel的工资
SELECT salary
FROM employees
WHERE last_name = 'Abel'

②查询员工的信息,满足 salary>①结果
SELECT *
FROM employees
WHERE salary>(SELECT salary
							FROM employees
							WHERE last_name = 'Abel'
);

案例2:返回job_id与141员工相同,salary比143号员工多的员工 姓名,job_id 和工资
①查询141好员工job_id
SELECT  job_id
FROM   empoyees
WHERE  employee_id = 141

② 查询143号员工的salary
SELECT  salary
FROM   empoyees
WHERE  employee_id = 143

③查询员工的姓名,job_id 和工资 要求job_id=①并且salary>② 

SELECT laste_name,job_id,salary
FROM employees
WHERE job_id = (SELECT  job_id
								FROM   empoyees
								WHERE  employee_id = 141
) AND salary>(SELECT  salary
							FROM   empoyees
							WHERE  employee_id = 143

);

案例3:返回工资工资最少的员工的last_name,job_id和salary
①查询公司的最低工资
SELECT MIN(salary)
FROM employees

②查询last_name,job_id和salary 要求salary=①
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
							SELECT MIN(salary)
							FROM employees
);

案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
①查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50

②查询每个部门的最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id

③    在二的基础上筛选②,满足min(salary)>①
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
											SELECT MIN(salary)
											FROM employees
											WHERE department_id = 50
);

④子查询的执行优先于主查询执行,著查询的条件用到子查询的结果
列子查询寻,一般搭配着多行操作符使用

2. 列子查询(多行子查询)

**多行操作符:**
"IN:在范围内的值,只要有就true
ALL: 与子查询返回的所有值比较为true 则返回true
ANY/SOME:与子查询返回的任何值比较为true 则返回true"

案例1:返回location_id是1400或1700部门中的所有员工姓名
①查询location_id是1400或1700的部门编号
SELECT department_id                          DISTINCT去重
FROM departments
WHERE location_id IN(1400,1700)

②查询员工姓名,要求部门号是①列表中的某一个
SELECT last_name
FROM employess
WHERE department_id(
										SELECT department_id                     
										FROM departments
										WHERE location_id IN(1400,1700)
);
  1. 行字查询(多列多行)
    特点:
    ①子查询放在小括号内
    ②子查询一般放在条件右侧
    ③标量子查询,一般搭配着当行操作符使用 "> < <= >= = <>"

分页查询

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:

		select 查询列表            7
		from 表                   1
		【join type】 join 表2     2
		on 连接条件                3
		where 筛选条件             4
		group by 分组字段          5
		having 分组后的筛选         6
		order by 排序的字段        8
		limit offset,size         9
		
		offset要显示条目的起始索引(从0开始)
		size要显示的条目个数
			
			select * from employees limit 0,5;

DDL

数据库定义语言,对库和表的管理

  • 创建:create
    create database 库名;
  • 修改:alter
  • 删除:drop
    drop database 库名;

创建表

create table 表名(
		列名 列的类型 【(长度) 约束】,
		列名 列的类型 【(长度) 约束】,
		列名 列的类型 【(长度) 约束】,
		列名 列的类型 【(长度) 约束】,
		...
		列名 列的类型 【(长度) 约束】
)

修改表名
修改列的类型或约束
添加心列
删除列
修改表名

复习sql查询语句

SELECT
			last_name,
			department_id,
			salary*12*(1+IFNULL(commission_pct,0)) AS 年薪,      
FROM
			employees;

  1. 一般白勺的后面就是要查询的东西,白勺的前面是条件
  2. or或者等于取并集

DQL查询语言

基础查询语法

select 查询列表
from 表明;

特点:1.查询列表可以说字段、常量、表达式、函数,也可以多个
			2.查询结果是一张虚拟表
			3.字符型和日期型的常量值必须用单引号引起来,数值型不需要
			4.简单的数学运算  > < <= >= = <> 
distinct

select 函数名(实参列表);

			+
			select 数值+数值  直接运算
			select 字符+数值  先试图转换字符为数值,成功的话就运算,否则转换成0
			select null+值    都为null

concat函数:拼接函数
select concat(字符1,字符2,) 多个字段显示为一行

ifnull函数:判断某字段或表达式是否为null,如果为null返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;

isnull函数 为null返回1=是,不为null返回0=否

条件查询

select 查询列表              3
from 表明                    1
where 筛选条件               2

筛选条件分类
1、简单条件运算符
> < = <> != <=> >= <=

2、逻辑运算符
&& and
|| or
!  not

3、模糊查询
like:一般搭配通配符使用,可以判断字符型和数值型
select * from employees where department_id like '1__';
通配符: % 任意多个 _任意单个
between and
in
is null /is not null

排序查询

语法:
			select 查询列表                               3
			from 表                                      1
			【where 筛选条件】                            2
			order by 排序列表 【asc|desc】默认升序         4

特点:1. order by 后面支持表达式、单个字段、别名、函数、多个字段排序。
		  2. 多个字段排序的关系:先排第一个字段、然后再排
			3. order by 一般都放在查询语句的后面,limit字句除外

select last_name,salary
from employees
where salary not between 8000 and 17000  |    NOT(salary between 8000 and 17000)
order by salry DESC;
			

常见函数

函数:类似于java的方法,将一组逻辑语句封装在方法中,对外暴露方法名
			1. 隐藏了实现细节 2. 提升代码重要性

调用:select 函数名(实参列表) 【from 表】;

特点:叫什么,实现什么效果。

分类:
				1. 当行函数
				如 concat、length、ifnull等
				2. 分组函数,又称为统计函数、聚合函数。
				做统计使用
posted @ 2020-11-23 15:20  金木研cc  阅读(77)  评论(0编辑  收藏  举报