该文主要讲解,记录,操作sql查询(适用于期末突击sql语句查询部分+sql语句查漏补缺)
学习来源:老杜带你学mysql
该up主的其他学习视频也很棒,讲的也很有意思,对数据库有兴趣的也可以刷刷该视频
里面也有对事务,隔离的定义
mysql的安装与配置---(可以照着老杜的第二节课加下面链接搞,我用的mac端电脑,一直next就完事了,然后系统偏好设置搜mysql,打开数据库,之后终端登陆就好)
https://www.cnblogs.com/baobaotql/p/14207746.html
注意⚠️:
本文中的sql语句语法均在本机上尝试过,均无问题,但是直接复制运行会报错,只能解释为文本编码不符,所以还是自己照着敲一遍把
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mysql不分大小写
学习SQL就是学习通用的SQl语句,SQL语句分为:
DQL(数据查询语言):带select的
DML(数据操作语言):insert delete updata 对表中的数据进行增删改
DDL(数据定义语言):creat,drop,alter 对表结构进行增删改
TCL(事务控制语言):commit 提交事务,rollback回滚事务(可以暂时理解为c艹里面的try)
DCL(数据控制语言):grant授权,revoke撤销权限等
了解即可,不用背的
(最近一直在写python,老是忘写;,别学我)
(不解释操作了,这都看不懂英文的话,难不成英语比我还差,这我就没办法了)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
对库的操作:
show databases;
create database 库名;
use 库名;
drop database 库名;
创建自己的库+使用库
进入库后对表的操作:
这老师用sql脚本导入的数据,我人麻了,source +脚本文件路径(执行sql脚本(后缀为.sql的文件))
desc 表名(查看表结构)
create table 表名(
数据名 类型 [完整性约束],
primary key ());
例子表如下
三个例子表结构,那个渣男是脚本录入的数据,我只能苦逼的手敲了,幸运的是还有你们陪着我,以后相关语法都会用这些表用来做相关查询
创建表语句
create table 表名
( 字段1,数据类型
字段2,数据类型
字段3,数据类型
primary key 字段1
);
数据约束 目的:为了保证表中数据的合法性,有效性,完整性
1.使用INSERT实现数据的插入
2.UPDATE实现数据的更新
3.使用DELETE实现数据的删除
1. 插入完整数据(顺序插入)
语法一:INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);
语法二:INSERT INTO 表名 VALUES (值1,值2,值3…值n);
2. 指定字段插入数据
语法:INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3. 插入多条记录
语法:INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);
2、更新数据UPDATE
语法: UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password(‘123’)
where user=’root’ and host=’localhost’;
3、删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user
WHERE password=’’;
(上面的东西都是主要都是为了建立一个数据库例子,方便接下来的学习,单纯为考试而言的话,只要会增删改表中数据即可)
然后我们跟着上面的数据截图愉快的插入数据了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
查询语句的格式
select 字段名, 5 挑选某几列中的符合条件的数据
from 表名 1 从哪几个表中查询
where 判断条件 2 查询条件
group by .... 3 按什么条件分组
having..... 4 再从分好的小组中按照条件查询
order by..... 6 查好的数据可以按秩排序
数字表示执行顺序,这也就是学group by的时候说不能在后面加where,因为没用
1,5是必须的,每条sql查询语句最后的;也是必须的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
单表查询:
简单查询
*表示所有
eg:查询一个表中信息
select *
from emp;
eg:查询所有员工名字和编号
select ename,empno
from emp;
eg:查询所有员工姓名和年薪
select ename,sal*12
from emp;
#sal*12 如果嫌这个不好看的话 可以用as起别名,
select ename ,sal *12 as '年薪'
from emp;
as 可以省略
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
条件查询
eg:查询月薪为5k的员工姓名
select ename
from emp
where sal=5000;
eg:查询king的月薪
select ename,sal
from emp
where ename = 'king';
between 是闭区间[,]
内部条件也可是字符串
eg:select *
from emp
where ename between 'a' and 'b';
字典序比较,这样能查出所有名字是a开头的人的信息
多个条件时,最好用用括号,自己设置优先级
in 可以理解为多个or
eg :找出工作为 'manager'和'clear'的
select * from emp where job ='manager' or job='clear';
select * from emp where job in ('manager','clear');
like 模糊查询 %表示任意哥字符,_表示一个字符
eg:找出名字中带o的员工信息
select *
from emp
where ename like '%o%';(不会有人转义字符都不会吧)
其他的条件自己试吧!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
排序order by
asc表示升序 desc表示降序 默认升序,多个字段作为判断条件时优先第一字段然后第一字段相同的比较第二字段,以此类推
eg:select ename ,sal
from emp
order by sal desc,ename asc;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
聚合函数
min 最小
max 最大
avg 均值
count 记数 该列中不为null的元素有多少个
sum 求和
就平常的用法,到group by的时候会再讲一遍
就一个点提下就好
count
eg:找出emp表中有多少不同的工作岗位
去重就好 distinct关键字
select count(distinct job)
from emp;
找出工资大于平均工资的员工信息
select * from emp where sal>avg(sal) //错误
这样写是不行的,where后不能跟聚集函数(该问题后续可用子查询写)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ifnull 关键词
eg:得出每个员工的年薪
select ename,(sal+comm)*12 year_sal from emp; // 错误
这样是失去一些数据,因为凡是null参与的数据返回的都是null
select ename,(sal+ifnull(comm,0))*12 year_sal from emp;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*重点
group by:按照某个字段或者某些字段进行分组(如果没有group by的话默认一张表)
having:having 是对分组之后的数据进行再次过滤
eg:找出每个工位岗位的最高薪资
select max(sal)
from emp
group by job;(聚集函数一般和group by联用)
eg:找出每个部门不同岗位最高薪资
select job,max(sal),deptno,ename
from emp
group by deptno,job;///错误
还有一个点,只能查询聚集函数和分组依据的列,把ename去掉就可以运行了
eg:找出每个部门不同岗位最高薪资且大于2500
select job,max(sal),deptno
from emp
group by deptno,job
having max(sal)>2500;
再次提醒,记住本文最开始的地方,几条语句的执行顺序
group by不是一定不能和where联用,比如上面这个eg就可以,只是要记得执行顺序
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*重点
连接查询
(这块请务必理解清楚,是我认为sql语句中最重要的,也是最难的部分)
首先介绍下笛卡尔积
比如A表m条数据,B表n条数据,AB两表的笛卡尔积有m*n条数据
语句为 select * from A,B;
连接查询的本质上就是建立两表的笛卡尔积,然后筛选过滤,当然不同的连接方式会预处理一部分数据,匹配次数是不变的
连接查询分为内连接,外连接,全连接(最后这个基本不用)
内连接:
1.等值连接
eg:找出员工以及所属部门名称
select ename,dname
from emp A,dept B
where A.deptno=B.deptno;(该处还用了下别名)
这是SQL92的语法,也是课本上教的
SQL99(目前常用的):
select ename,dname
from emp A (inner) join dept B
on A.deptno=B.deptno;
(之前过滤的where语法不需要使用,可以在该表连接后使用where过滤,将表连接和过滤条件分离,使得结构更清晰)
2.非等值连接
其实就是之前条件的=变为between(不是!=啊,别想太多)
eg:找出每个员工的工资等级(并按秩排序)
select ename,sal,grade
from emp A join salgrade B
on A.sal between B.losal and B.hisal
order by grade;
3.自连接
就是一张表看为两张表(起个别名)自己连自己完事
eg:找出每个员工的上级领导
select a.ename ,b.ename
from emp a join emp b
on a.mgr=b.empno;
查询会出13行数据,但是我们emp表有14行数据啊
那是因为king没有领导,如果我们想显示king怎么办呢
学外连接啊!!!
外连接:
内连接:两张表是平等的,只能显示两张表能匹配的数据
外连接:一张主表一张副表,查询主表数据附带副表数据,若副表没有对应数据则显示null
eg:找出每个员工的上级领导(要求没有领导显示null
左连接(左外连接) left join 前面的是主表
select a.ename ,b.ename
from emp a left (outer)join emp b
on a.mgr=b.empno;
右连接(右外连接)right join 后面的是主表
select a.ename ,b.ename
from emp b right (outer)join emp a
on a.mgr=b.empno;
全连接 就是两个都是主表的外连接
eg:来个三表连接查询
找出每一个员工的部门名称以及工资等级
select ename,dname,grade
from emp
left join dept
on emp.deptno=dept.deptno
left join salgrade s
on emp.sal between s.losal and s.hisal;
之后的多表也类似啦
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select可以出现在以下的位置
select (select)
from (select)
where (select)
eg:找出薪资高于平均薪资的员工信息
select *
from emp
where sal >
(select avg(sal)
from emp
);
eg:找出每个部门平均薪资的薪资等级
子查询当一个临时表A,然后其他照旧
select A.deptno,grade
from (select deptno,avg(sal) av #这里一定要有deptno才能链接查询
from emp
group by deptno) A
join salgrade s
on A.av between s.losal and s.hisal;
eg:找出每个部门平均的薪水等级
select deptno,avg(grade)
from
(select grade,deptno
from emp e
left join
salgrade s
on e.sal between s.losal and s.hisal)
group by deptno;
也可以再嵌个套吧deptno换成dname
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
union (可以将查询结果集相加)
eg:比如找出工作岗位是salesman 和 manager 的员工
第一种:select ename,job from emp where job ='salesman' or job = 'manager'
第二种:select ename,job from emp where job in ('salesman','manager')
第三种:select ename,job from emp where job ='salesman'
union
select ename,job from emp where job = 'manager';
unoin还能将两张不相干表中数据链接一起显示
但是要求列数相等
select ename from emp union select dname from dept;
不过感觉该结果没啥意义,至少我没找到该语法使用场景
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*重点 (不会考的,因为课本没有,但以后会用,如果从事用到数据库的相关行业)
limit(用于分页查询)
mysql特有的关键词
用于取结果集中的部分数据
语法机制
limit starIndex,length
eg:找出工资前五位员工信息
select ename,sal
from emp
order by sal desc
limit 0,5;(执行顺序在最后)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sql增删改查就这样告一段落了