SQL基础(一)

SQL基础

sql,DB,DBMS分别是什么,以及他们的关系

DB:DataBase,数据库,实际在硬盘上以文件的形式存在

DBMS:DataBase Management System 数据库管理系统 常见的有MySql,Oracle...

SQL: 结构化查询语言,是一门标准通用的语言,标准的SQL适用于所有数据库产品

DBMS负责执行SQL语句,通过执行SQL语句来操作DB中的数据

table是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强

一个表包括(被称为数据)和(被称为字段),每一个字段包括字段名、数据类型(学号int、姓名Varchar)和相关的约束

SQL语句的分类

DQL数据查询语言:查询语句,如select

DML数据操作语言:insert,delete,update对表当中的数据进行增删改

DDL数据定义语言:create,drop,alter对表结构的增删改

TCL事物控制语言:commit提交事物,rollback回滚事物

DCL数据控制语言:grant授权,revoke撤销权限

 

MySQL常用命令

select database(); 查看当前用的是哪一个数据库

select version(); 查看MySQL版本

show database(); 查看和指定现有的数据库

show tables(); 查看表结构

desc 表名 :查看表结构

\c 结束一条语句

exit 退出MySQL

简单查询案例

select
    ename,sal 
from
    emp
where
    sal between 1000 and 3000;

判断是否为null和不为null

select
    ename,sal 
from
    emp
where
    comm is null;

select
    ename,sal 
from
    emp
where
    comm is not null;

⚠️  当运算符优先级不确定的时候加小括号

 

条件查询In

In相当于or

select ename,job from emp where job = 'saleman' or job = 'manager';
select ename,job from emp where job in('saleman','manager');

模糊查询like

必须掌握 % 和 _

查找名字中有O的

select ename from emp where enames like '%O%';

找出名字中第二个字母是A的

select ename from emp where enames like '_O%';

找出名字中有下划线的

select ename from emp where enames like '%\_%';

⚠️  不是'%_%',这样会返回所有的名字

找出名字中最后一个字母是T

select ename from emp where enames like '%T';

排序

select ename,sal from emp order by sal;

⚠️  这里默认升序,可以通过asc指定升序和desc指定降序

按照工资的降序排列,工资相同的时候按照名字的升序排列

select ename,sal from emp order by sal desc, ename asc;

分组函数

count计数,sum求和,avg平均,max最大,min最小

⚠️  另外还有个名字:多行处理函数

⚠️  分组函数不可直接使用在where子句中,因为分组函数是在group by执行完毕后使用的,而group by是在where执行完毕后执行的

⚠️  count(*) 和 count(某一字段)区别:前者统计总记录条数,后者统计字段中不为NULL的数据总数量

特点:多行输入,单行输出且自动忽略null

ifnull(可能为null的字段,被当作什么处理)

select ename,ifnull(comm,0) from emp ;

分组查询

group by:按照某个字段或者某些字段进行分组,通常和分组函数联合使用,并且任何一个分组函数都在 group by 语句执行结束后才会执行

having:having是对分组之后的数据进行再次过滤

找出每个工作岗位的最高薪资

select max(sal) from emp group by job

找出工资高于平均工资的人

select ename,sal from emp where sal > (select avg(sal) from emp);

多字段分组查询

⚠️  在使用group by时, select后面只能跟group by的字段和分组函数,MySQL虽然会通过但是结果没有意义,在Oracle中会报错

找出每个部门的最高薪资,并且薪资大于2900的

select max(sal),deptno from emp group by deptno having max(sal) > 2900;

但是这里不建议用having,因为用where效率更高 

select max(sal),deptno from emp where sal > 2900 group by deptno;

一个完整的DQL顺序

⚠️  From -> Where -> Group By -> Having -> Select -> Order By

 

Distinct去重

⚠️ distinct只能出现在所有字段最前面

如统计岗位的数量

select count(distinct job) from emp;

连接查询的分类

内连接:等值连接、非等值连接、自连接

外连接:左连接、右连接

全连接

 

等值连接示例

select 
    e.ename,d.dname
from 
    emp e
join
    dept d
on
    e.deptno = d.deptno

非等值连接示例

select 
    e.ename, e.sal, s.grade
from 
    emp e
join
    salgrade s
on
    e.sal between s.losal and s.hisal

自连接示例

select 
    e.ename as '员工名',d.ename as '领导名'
from 
    emp e
join
    emp d
on
    a.mgr = b.empo;

实际开发中,外连接使用较多

 

Where嵌套子查询

select * from emp where sal > (select avg(sal) from emp;

From后面嵌套子查询

找出每个部门的平均工资对应的等级

select 
    t.*, s.grade
from
    (select deptno,avg(sal) as avgsal from emp group by deptno) t
join 
    salgrade s
on 
    t.avgsal between s.losal and s.hisal

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值