朝花夕拾之MYSQL-01

学习配套视频:老杜带你学_mysql入门基础(mysql基础视频+数据库实战)https://www.bilibili.com/video/BV1Vy4y1z7EX?spm_id_from=333.337.search-card.all.click&vd_source=bf4eb9e00649104ee4ec443e363be4b6

1 数据库概述

  1. mysql登录不上去

(84条消息) 解决ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)_柚子橘子的博客-CSDN博客

  1. 数据库含义
  • 数据库:按照一定格式存储数据的一些文件的组合。
  • 数据库管理系统:专门用来管理数据库中数据的,管理体现在增删改查。
  • SQL:结构化查询语言,程序员在数据库管理系统负责执行SQL完成数据的增删改查
  1. MYSQL的安装
  • 端口号通常和IP地址在一块,IP地址用来定位计算机的,端口号port是用来定位计算机上某个服务的/某个应用的!
  • mysql数据库启动的时候,这个服务占有的默认端口号是3306 !!这个大家都知道,不能不知道!
  1. MYSQL的服务
  • 计算机–>右键–>管理–>服务和应用程序–>服务–>找mysql服务
  • 看下是不是“正在运行”状态 然后是“自动”
  • 对应wimdow上cmd的命令是:
net stop 服务名称;
net start 服务名称;

2 常用命令

  1. 登录/退出MYSQL
登录:mysql -uroot -pxxxxxx
退出:exit
  1. 数据库操作
查看数据库:show databases;
创建数据库:create database bjpowernode;
选择使用数据库:use test;
查看使用哪一个数据库:select database();     记得带括号
  1. 表的操作
show tables;
  1. 导入数据
source 加目录
source D:\course\03-MySQL\document\bjpowernode.sql
  1. 其他
  • 必须有分号,;表示结束
  • \c表示终止一条命令的输入

3 SQL语句的分类

  1. DQL:数据查询语言
  • select
  1. DML:数据操作语言
  • insert 增
  • delete 删
  • update 改
  1. DDL:数据定义语言
  • create
  • drop
  • alter
  1. TCL:事务控制语言
  • 事务提交:commit
  • 事务回滚:rollback
  1. DCL:数据控制语言
  • 授权grant
  • 撤销权限revoke

4 DQL语句

4.1 查看表内容与结构

  1. 查看表中的数据
select * from 表名;
select * from emp;
  1. 查看表的结构
desc 表名;
desc dept;

4.2 简单查询

  1. 查询一个字段
select 字段名 from 表名;
select dname from dept;
  1. 查询多个字段
select 字段名,字段名 from 表名;
select deptno,dname from dept;
  1. 查询所有字段
select * from 表名;
select * from dept;
  1. 给查询字段的列取别名
select deptno,dname as deptname from dept;
select deptno,dname deptname from dept;
  1. 起别名有空格用双引号
select 字段 “dept name” from 表名;
select 字段 “dept name” from dept;
  1. 简单计算
select 字段*12 from 表名;
select name,sal*12 yearsal from emp;

4.3 条件查询

一个套路:where 字段 符号 值/文字

  1. 等于=
select 字段 from 表名 where 字段 =/文字;
select empno,ename from emp where sal = 800;
  1. 不等于<>=/!=
select 字段 from 表名 where 字段 <>=/文字;
select empno,ename from emp where sal <>= 800;
  1. 小于等于<=
select 字段 from 表名 where 字段 <=/文字;
select empno,ename from emp where sal <= 3000;
  1. 大于等于>=
select 字段 from 表名 where 字段 >=/文字;
select empno,ename from emp where sal >= 3000;
  1. 介于between … and …
select 字段 from 表名 where 字段 >=and 字段 <=;
select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
select 字段 from 表名 where 字段 betweenand 值;
select empno,ename,sal from emp where sal between 2450 and 3000
  1. 为空 is null ,不为空is not null
select 字段 from 表名 where 字段 is nullselect empno,ename,sal from emp where comm is null;
select 字段 from 表名 where 字段 is nullselect empno,ename,sal from emp where comm is not null;
  1. 包含in,不包含not in
select 字段 from 表名 where 字段 in (/文字)->select empno,ename,job 
->from emp 
->where job in ('manager','salesman');
select 字段 from 表名 where 字段 in (/文字)->select empno,ename,job 
->from emp 
->where job not in ('manager','salesman');

4.4 逻辑查询

  1. 并且and
select 字段 from 表名 where 条件 and 条件;
select empno,ename from emp where job = 'MANAGER' and sal > 2500;
  1. 或者or
select 字段 from 表名 where 条件 or 条件;
-> select empno,ename 
-> from emp
-> where job = 'manager'or job = 'salesman';
  1. 多个逻辑and和or并存,用括号
  • and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”
    以后在开发中,如果不确定优先级,就加小括号就行了。
select 字段 from 表名 where 条件 and (条件 or 条件)-> select empno,ename
-> from emp
-> where sal > 2500 and (deptno = 10 or deptno = 20);
  1. case…when…then…when…then…else…end
case 字段 when 条件 then 程序 when 条件 then 程序 else 程序 end	
	
	-> select
    ->  	ename,
    ->  	job,
    ->  	sal as oldsal,
    ->  	(case job when 'manager' then sal*1.1 when 'salesman' then sal*1.5 else sal end) as newsal
    -> from 
    -> 		emp;

4.5 模糊查询

  1. %:匹配任意多个字符
select 字段 from 表名 where like '%值/文字%';
select ename from emp where ename like '%o%';	找出名字中含有O的?
select 字段 from 表名 where like '%值/文字';
select ename from emp where ename like '%T';	找出名字以T结尾的?
select 字段 from 表名 where like '%值/文字';
select ename from emp where ename like 'K%';	找出名字以K开始的?
  1. _:任意一个字符
select 字段 from 表名 where like '_值/文字%';
select ename from emp where ename like '_A%';	找出第二个字每是A的?
select 字段 from 表名 where like '__值/文字%';
select ename from emp where ename like '__R%';	找出第二个字每是R的?

3, %与/的查询使用转义字符\

select 字段 from 表名 where like '%\_值/文字%';
 select name from t_student where name like '%\_%';

4.6 排序查询

  1. 升序asc
select 字段 from 表名 order by 排序字段 asc;
select ename,sal from emp order by sal asc;		asc可加可不加,默认升序
  1. 降序desc
select 字段 from 表名 order by 排序字段 desc;
select ename,sal from emp order by sal desc;
  1. 多个字段排序
select 字段 from 表名 order by 排序字段 asc, 排序字段desc;
select ename,sal from emp order by sal asc,ename desc;

> select ename,sal from emp
-> where sal between 1250 and 3000
-> order by sal desc;

4.7 数据处理函数(单行函数处理)查询

  1. lower 转换小写
select low(字段) from 表名 ;
select lower(ename) from emp;
  1. upper 转换大写
select upper(字段) from 表名 ;
select upper(name) from t_student;
  1. substr截取
select substr(字段,起始下标,截取的长度) from 表名 ;
select substr(ename,1,1 from emp;
select ename from emp where substr(ename,1,1) = 'A';
  1. concat 拼接
select concat(字段,字段) from 表名 ;
select concat(empno,ename) from emp;
  1. length取长度
select length(字段) from 表名 ;
select length(ename) from emp;
  1. trim去空格
select trim(字段) from 表名 ;
select trim(ename) from emp;
select * from emp where ename =trim( ' king');
select * from emp where trim(ename) ='king';
  1. 日期转换 str_to_date,str_to_date
STR_TO_DATE(str,format);将字符串转换成日期
DATE_FORMAT(date,format);格式化日期

str_to_date:(86条消息) MySQL的STR_TO_DATE()函数将指定格式的字符串转为Date_秃秃爱健身的博客-CSDN博客_mysql字符串转日期函数

date_format:(86条消息) MySQL的DATE_FORMAT()函数将Date转为字符串_秃秃爱健身的博客-CSDN博客_mysqldate转字符串

  1. round四舍五入
select round(数字,保留小数个数) from 表名;
select round(123.554,-2) as result from emp;
  1. rand生成随机数
select rand()*100 from 表名;
select round(rand()*100,2) from emp;
  1. ifnull 将 null 转换成一个具体值
select ifnull(null的字段,保留值) from 表名;
select ename,(sal+ifnull(comm,0))*12 monthsal from emp;
  1. distinct去重查询
select distinct 字段 from 表名;
select distinct job from emp;
select distinct job,deptno from emp; 表示两个字段联合起来去重。
select count(distinct job) from emp;

4.8 分组函数查询(多行处理函数)

  1. count 计数
  • count()和count(具体字段)有什么区别:count(具体字段)表示统计该字段下所有不为NULL的元素的总数,count()统计表当中的总行数
select count(字段) from 表名 ;
select count(sal) from emp;
  1. sum 求和
select sum(字段) from 表名 ;
select sum(sal) from emp;
  1. avg 平均值
select avg(字段) from 表名 ;
select avg(sal) from emp;
  1. max 最大值
select max(字段) from 表名 ;
select max(sal) from emp;
  1. min 最小值
select min(字段) from 表名 ;
select min(sal) from emp;

4.9 分组查询

  1. 执行顺序
		select
			...
		from
			...
		where
			...
		group by
			...
		order by
			...
			
			
执行顺序:	
			1. from
			2. where
			3. group by
			4. select
			5. order by
  1. 要点
  • 问:为什么分组函数不能直接使用在where后面?
    select ename,sal from emp where sal > min(sal);//报错。
  • 答:因为分组函数在使用的时候必须先分组之后才能使用。
    where执行的时候,还没有分组。所以where后面不能出现分组函数。
  1. 案例
按照工作岗位分组,然后对工资求和。
select job,sum(sal) from emp group by job;
 
找出每个部门的最高薪资
select deptno,max(sal) from emp group by deptno;
 
每个部门,不同工作岗位”的最高薪资
select deptno,job,max(sal) from emp group by deptno,job;
  1. having在分组上进行过滤
select 字段,分组函数(字段) from 表名 group by 字段 having 条件;
mysql> select
    -> deptno,
    -> job,
    -> max(sal)
    -> from
    -> emp
    -> group by deptno,job
    -> having max(sal) > 3000;
  1. 综合例子来一个
	找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,
	要求按照平均薪资降序排。
mysql> select
    -> 		job,
    -> 		avg(sal) as avgsal
    -> from
    ->		 emp
    -> where
    -> 		job != 'manager'
    -> group by 
    ->		job
    -> having 
    ->		avg(sal) > 1500
    ->limit 1;    

4.10 连接查询

  1. 类型
	根据表连接的方式分类:
		内连接:
			等值连接
			非等值连接
			自连接

		外连接:
			左外连接(左连接)
			右外连接(右连接)

		全连接(不讲)
  1. 内连接之等值连接
		select 
			...
		from
			a
		join
			b
		on
			a和b的连接条件
		where  
			a.筛选条件=b.筛选条件
查询每个员工所在部门名称,显示员工名和部门名?
mysql> select e.ename,d.dname
    -> from emp e
    -> join dept d
    -> on e.deptno = d.deptno;
  1. 内连接之非等值连接
		select 
			...
		from
			a
		join
			b
		on
			a和b的连接条件
		where  
			a条件不等于(可能是介于)b条件
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
mysql> select e.ename,e.sal,s.grade
    -> from emp e
    -> join salgrade s
    -> on e.sal between s.losal and s.hisal;
  1. 内查询之自连接
		一张表看成两张表
		select 
			...
		from
			a
		join
			b
		on
			a和b的连接条件
		where  
			条件
查询员工的上级领导,要求显示员工名和对应的领导名?
mysql> select a.ename,b.ename
    -> from emp a
    -> join emp b
    -> on a.mgr = b.empno;
  1. 外连接的左/右连接
		select 
			...
		from
			a
		left join
			b
		on
			a和b的连接条件
		where  
			a.筛选条件=b.筛选条件
查询每个员工所在部门名称,显示员工名和部门名?
mysql> select e.ename,d.dname
    -> from emp e
    -> left/right join dept d
    -> on e.deptno = d.deptno;
  1. 多张表的连接
		select 
			...
		from
			a
		join
			b
		on
			a和b的连接条件
		join
			c
		on
			a和c的连接条件
		right join
			d
		on
			a和d的连接条件
	案例:找出每个员工的部门名称以及工资等级,
	要求显示员工名、部门名、薪资、薪资等级?
mysql> select e.ename,e.sal,d.dname,s.grade
    -> from emp e
    -> left join dept d
    -> on e.deptno = d.deptno
    -> left join salgrade s
    -> on e.sal between s.losal and s.hisal;
	案例:找出每个员工的部门名称以及工资等级,还有上级领导,
	要求显示员工名、领导名、部门名、薪资、薪资等级?
mysql> select e.ename,e.sal,d.dname,s.grade
    -> from emp e
    -> left join dept d
    -> on e.deptno = d.deptno
    -> left join salgrade s
    -> on e.sal between s.losal and s.hisal;
    -> left join emp l
    -> on e.mgr = l.empno;    

4.11 子查询

  1. where中的子查询
  • 语法
	select 
		字段
	from
		表名 
	where
		(select 语句)
  • 案例
找出比最低工资高的员工姓名和工资?
错误用法:
	select 
		ename,sal
	from
		emp 
	where
		sal > min(sal);

	ERROR 1111 (HY000): Invalid use of group function
	where子句中不能直接使用分组函数
正确用法:
select ename,sal 
from emp 
where sal > (select min(sal) from emp);
  1. from中的子查询
  • 语法
	select 
		字段
	from
		(select 语句)
	where
		条件
  • 案例
找出每个岗位的平均工资的薪资等级。
mysql> select t.*,s.grade
    -> from
    ->          ( select job,avg(sal) avgsal from emp group by job ) t   (记得给avg(sal)起别名)
    -> left join salgrade s
    -> on t.avgsal between s.losal and s.hisal;
  1. select后面出现的子查询
  • 语法
	select 
		字段,(select 语句)
	from
		表名
	where
		条件
  • 案例
找出每个员工的部门名称,要求显示员工名,部门名?
	select 
		e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname 
	from 
		emp e;
  1. union 合并查询
  • 语法:和union all的区别是union去交集,去重过
select 语句
union
select 语句
  • 案例
mysql> select ename,job from emp where job = 'manager'
    -> union
    -> select ename,job from emp where job = 'salesman';
  1. limit 用法
  • 语法
limit startIndex, length		startIndex是起始下标,length是长度。
  • 案例
按照薪资降序,取出排名在前5名的员工?
select ename,sal from emp order by sal desc limit 0,5

取出工资排名在[3-5]名的员工?
 select ename,sal from emp order by sal desc limit 2,3;
  • 额外功能:分页
每页显示3条记录
	第1页:limit 0,3		[0 1 2]2页:limit 3,3		[3 4 5]3页:limit 6,3		[6 7 8]4页:limit 9,3		[9 10 11]
	
		第pageNo页:limit (pageNo - 1) * pageSize  , pageSize

4.12 DQL语言执行顺序

	select 
		...
	from
		...
	where
		...
	group by
		...
	having
		...
	order by
		...
	limit
		...
	
	执行顺序?
		1.from
		2.where
		3.group by
		4.having
		5.select
		6.order by
		7.limit..

自己的小tip:

1. and/or前后要写全
2. andor同时出现,用括号区分优先级
3. is null/is not null
4. in/not in
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值