SQL

SQL用来和数据库打交道,完成和数据库的通信,SQL是一套标准

 

数据库(DataBase):

通常是一个或一组文件,保存了一些符合特定规格的数据

 

表(table):

命名规则:小写,单词之间用"_"分割开来

是一种结构化的文件,可以用来存储特定类型的数据

表中的概念:列,行,主键

列叫做字段(Column),行叫做表中的记录,每一个字段都有:

字段名称/字段数据类型/字段约束/字段长度

 

学生信息表:

学号(主键)姓名性别年龄
00001张三20
00002李四20

主键是不能重复的

 

在mysql中语句是不区分大小写的

数据查询语言(DQL-Data Query Language)

代表关键字:select

数据操作语言(DML-Data Manipulation Language)

代表关键字:insert,delete,update

数据定义语言(DDL-Data Definition Language)

代表关键字:create,drop,alter

事务控制语言(TCL-Transaction Control Language)

代表关键字:commit,rollback

数据控制语言(DCL-Data Control Language)

代表关键字:grant,revoke

 

创建数据库

create database 数据库名称

use 数据库名称

在数据库中建立表,因此创建表的时候必须要先选择数据库

可以查询当前使用的数据库

查询数据库版本也可以使用

终止一条语句,输入ctrl + c

退出mysql

可以使用\q,QUIT或EXIT

 

显示表

 

基本流程:

1.安装mysql

2.启动mysql

3.登录mysql

4.创建数据库

5.使用数据库

6.创建测试表,添加测试数据

7.关于表的结构

emp员工表

dept部门表

SALGRADE薪水等级表

员工表和部门表的关系是多对一的关系,因为多个员工会对应一个部门

一个部门会对应多个员工;然后现在我们要找到员工表和部门表之间对应的关系

dept 主键 deptno(唯一标识)

emp 主键 empno 外键(通过主键id建立多表关系的字段,一般就是另外一张表的主键id)deptno

列出当前可用数据库:

写SQL语句:

1.DQL语句(select)

单表查询

//查询员工表emp所有的数据 ,*通配符,代表所有的数据 from 属于

 

查询结果:

 

2.DML语句(增删改 insert(添加) delete(删除) update(修改))

//a:在emp员工表中添加一条员工数据 一般在添加数据的时候,主键在有自动递增的情况下是不用添加的,因为主键我们在设计表的时候给了它自动递增的约束

//into关键字可加可不加

//删除员工表中姓名为"Tom"的数据

//条件关键字where(在一条sql中只能出现一次)

//修改员工表中SMITH的薪水为850;

3.带条件查询

//查询一个字段

//查询多个字段

//计算员工的年薪(月薪*12)

//查询出薪资大于2000的员工

Sql语句条件运算符(where后面的)

运算符说明
=等于
<>或!=不等于
<小于
<=小于等于
>大于
>=大于等于
between … and ….两个值之间,等同于 >= and <=
is null为null(is not null 不为空)
and并且
or或者
in包含,相当于多个or(not in不在这个范围中)
notnot可以取非,主要用在is 或in中
likelike称为模糊查询,支持%或下划线匹配 %匹配任意个字符 下划线,一个下划线只匹配一个字符,"_"代表占位符

//部门编号不等于20的员工

//查找薪资大于500小于1000的员工

//查询出COMM字段不为空的数据

//查询出薪资小于1000或者薪资大于2000的员工

//in(包含的数据),查询出员工编号是7369、7839、7788的员工 in()

//不包含:not in not in()

4.排序数据

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序,如果存在where子句那么order by必须放到where语句的后面

//按照薪水由小到大排序 order by 排序关键字 (默认是升序)

注意:order by后面的排序依据字段不加引号

//查询出薪资大于1000的员工,然后按照薪水降序排列

//按照job 和 sal 倒序 (满足前面的条件,再满足后面的条件,排序具有优先级)

5.分组函数/聚合函数/多行处理函数

函数作用
count取得记录数
sum求和
avg取平均
max取最大的数
min取最小的数

//统计emp这张表中有多少个员工 count(*) 求一张表中的总记录条数

//取得薪水和津贴的合计,ifnull函数表示将空值用后面的数字替换

//求出员工薪资大于2000的薪资总和

//求出薪资小于2000的薪资平均值

//求出薪资的最大值,最小值

//组合聚合函数

6.分组查询

group by 关键字

//取得每个工作岗位的工资和,要求显示岗位名称和工资总和,按照薪水的倒序进行排序

//按照工作岗位和部门编码分组,取得的工资合计

如果有group by 语句,那么在select语句后面只能跟分组函数+参与分组的字段

 

having关键字(分组之后的数据再过滤)

如果想对分组数据再进行过滤需要使用having子句

取得每个岗位的平均工资大于2000

select语句总结

一个完整的select语句格式如下

以上语句的执行顺序

  1. 首先执行where语句过滤原始数据
  2. 执行group by进行分组
  3. 执行having对分组数据进行操作
  4. 执行select选出数据
  5. 执行order by排序

原则:能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。

 

多表查询:

在项目中,业务是很复杂的,那表与表之间的关系也很复杂,而且以后在公司中我们接触到的表会有几百张或者几千张,在进行多表查询的时候,我们要捋清楚表与表之间的关系

多表查询的时候一定要带条件进行查询,不然会出现笛卡尔积现象!

多表查询语法:

sql92:

emp 主表 找到从表的外键deptno

dept 从表

//查询每个员工所对应的部门

//显示出薪资大于2000的员工,并显示出每个员工对应的部门(连接查询)

sql99:

内连接

//显示出薪资大于2000的员工,并显示出每个员工对应的部门 inner join 等值连接 (效率高 inner可以不写)

外连接

左外连接 left join

右外连接 right join

在外连接中,主表的数据要求全部显示出来,即使在从表中没用数据与之匹配,那该数据也必须显示出来,从从表中不能匹配的数据用null来代替

//显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来

//查询出所有的员工的薪资以及员工的薪水等级显示每个员工所对应的部门

通过子查询的方式查表

//查询出薪水大于平均薪水的员工的薪水

//查询每个工作岗位对应的薪资总和并且降序排序

//查询每个员工所对应的领导姓名

7.子查询

子查询就是嵌套的select语句,可以理解为子查询是一张表

 

在where语句中使用子查询,也就是在where语句中加入select语句

 

//查询每个部门平均薪水所对应的薪水等级

 

分页:

limit关键字(在sql语句最后面)

起始索引位置:从哪个位置开始查(小标索引是从0开始)

分页单位:查询多少条数据

起始索引位置跟当前页的关系(平均分页):

=1

//根据分页来查询5-10条的数据

 

//查询出每个员工的所属部门,薪水,薪水等级,取到薪资最低的三个员工