这是我参与「第四届青训营 」笔记创作活动的第3天
MySQL服务
net start 服务名称 (启动)
net stop 服务名称 (关闭)
本地登录mysql : mysql -uroot -p密码 (显示密码)
本地登录mysql : mysql -uroot -p (回车) 再输入密码 (隐藏密码)
退出登录:exit
C:\WINDOWS\system32>mysql -uroot -p********
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.28 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql常用命令
查看mysql中有哪些数据库
查看mysql中有哪些数据库: show databases;
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+默认系统带了4个数据库
选择使用哪个数据库
选择使用哪个数据库 : use 数据库名称
mysql> use sys Database changed表示正在使用一个名字叫做sys的数据库
查看数据库中有哪些表
查看数据库中有哪些表:show tables;
再进入(use)某个表之后
mysql> show tables; Empty set (0.02 sec)mysql> use mysql Database changed mysql> show tables; +------------------------------------------------------+ | Tables_in_mysql | +------------------------------------------------------+ | columns_priv | | component | | db | | default_roles | | engine_cost | | func | | general_log | | global_grants | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | password_history | | plugin | | procs_priv | | proxies_priv | | replication_asynchronous_connection_failover | | replication_asynchronous_connection_failover_managed | | replication_group_configuration_version | | replication_group_member_actions | | role_edges | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +------------------------------------------------------+ 37 rows in set (0.00 sec)
查看表中的数据
查看表中的数据:select * from 表名;
查看表的结构
只看表中的结构不看数据:desc 表名;
desc t_movie; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | no | char(10) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | num | int | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
创建数据库
创建数据库 :create database 名字; (注意分号)
mysql> create database running_potato; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | asdasd | | information_schema | | mysql | | performance_schema | | running_potato | | sys | +--------------------+ 6 rows in set (0.00 sec)
其他
查看MySQL的版本号 :select version();
查看当前使用的是哪个数据库 : select database();
终止命令的输入:\c
退出MySL:exit
MySQL不见分号不执行
表的理解
数据库中最基本的单元是表 :table
行(row) :数据/记录
列(column) :字段
每个字段都有:字段名,数据类型,约束等属性
SQL 语句分类
DQL: 数据查询语言 select...
DML:数据操作语言 主要操作表中的数据,insert delete update
DDL:数据定义语言 主要操作表的结构,而非数据 。 凡是待遇create drop alter的都是DDL
TCL:事务控制语言 ,提交 ,回滚
DCT:数据控制语言,授权,撤销权限
导入演示数据
将 .sql 文件导入数据库
source 路径
(路径中不能存在中文路径)
再通过 select * from 表名; 查看表的信息
SQL语句
注意:
- 对于SQL语句来说,都是通用的
- 所有的SQL语句以 “ ; ”结尾
- 另外SQL语句不区分大小写,都行
- 数据库中的字符串都是采用单引号括起来,双引号不标准
简单查询
查询一个字段
select 字段名 from 表名查询多个字段
使用都逗号隔开
select 字段名,字段名,字段名 from 表名查询所有字段:
- 把每个字段都写上 (可读性强,效率高)
- 使用 * (缺点效率低,可读性差,实际开发中不建议)
select * from 表名
查询时给列起别名
select dname as deptname from 表名; select 原名 as 别名 from 表名;使用 as关键字起别名
注意:只是将现实的查询结果列名显示为deptname ,原表名还是 原名, select语句永远不会进行修改操作。(只负责查询)
as关键字可以省略,但不能加逗号
select dname deptname from 表名; select 原名 别名 from 表名;
条件查询
命令
将表中符合条件的数据查询出来
select ...(字段) from ...(表名) where 条件; 实例:select empon,ename from emp where sal = 800查询条件
= 等于 <> 或 != 不等于 <= >= between ...(小数) and ...(大数字)(闭区间,包含两端的值) 两值之间,等同于 >= and <= and or and优先级比 or高 可以使用()改变优先级 is null 数据库中 null 不能永=衡量,null在数据库中代表什么也没有,不是一个值 is not null in 示例 select empon,ename,job from emp where job in('MANAGER','SALESMAN' ) 相当于 select empon,ename,job from emp where job ='MANAGER' and job = 'SALESMAN' not in not 可以取非 主要用在 is和in中 like 称为模糊查询,支持%或下划线匹配 ,%匹配任意字符,_ 一个下划线只匹配一个任意字符 实例:找名字里面有O的 select ename from emp where ename like '%O%' 实例:找名字以K开始的 select ename from emp where ename like 'K%' 实例:找名字字母第二个是A的 select ename from emp where ename like '_A%' 注意:转义字符 \
Day2
SQL语句
排序
默认
select ename,sal from emp order by sal; select ...(字段) from ...(表名) order by ...(排序根据); !!默认为升序降序
select select ...(字段) from ...(表名) order by ...(排序根据) desc; 在末尾加上desc就是降序升序(默认)
select select ...(字段) from ...(表名) order by ...(排序根据) asc; 在末尾加上asc
多字段排序
select ename,sal from emp order by sal asc,ename asc;优先根据第一个条件排序,第一个相同时,再按后续的条件进行排序
排序和条件查询综合时,排序总在最后写
单行处理函数(数据处理函数)
单行处理函数的特点:一个输入对应一个输出
多行处理函数的特点:多个输入对应一个输出
单行处理函数对应的是多行处理函数(分组函数)
常见的单行处理函数
lower 转换小写
select lower(ename) from emp; select lower(字段名) from 表名;
upper 转换大写
select upper(ename) from emp; select upper(字段名) from 表名;
substr 取子串(substr( 被截取的字符串,起始下标,截取的长度 ) )
select substr(ename,1,1) from emp; !注意!下表启示从1开始不是从0开始! 示例:找出员工名字首字母是A的员工的信息 select ename from emp while substr(ename,1,1) = 'A'
- length 取长度
select length(ename) from emp;
- trim 去空格
- str_to_date 将字符串转换为日期
- date_format 格式化日期
- format 设置千分位
- round 四舍五入
select round(1235.67,0) as result from emp; round(数据,保留几位小数) 第二个参数可以写负数,-1:保留到10位。0保留到个位,1保留1位小数
- rand() 生成随机数
- ifnull 可以将null转换成一个具体值
!注意!只要有null参与运算,结果一定是null 为了避免这种情况,采用ifnull 用法:ifnull(数据,被当作哪个值)
Day3
分组函数(多行处理函数)
特点:输入多行,输出一行。
5个: count 计数 sum 求和 avg 平均值 max 最大值 min 最小值
注意:分组函数在使用德时候必须先分组,然后才能用。如果没有对数据分组,则整张表默认为1组
select avg(sal) from emp; select min(sal) from emp; select 函数(字段名) from 表名;第一点!!!使用时注意:分组函数自动忽略NULL 不需要提前处理。
第二点!!!分组函数中 count(*) 和 count(具体字段) 有什么区别?
count(具体字段):表示该字段下所有不为null的元素的总数 count(*) :表示整个表行数,统计所有行数第三点!!!分组函数不能直接使用在 where 子句中。
找出比最低工资高的原员工信息
不能再where中 where sal > min(sal) //详见分组查询(group by)
第四点!!!所有的分组函数可以组合起来一起用
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
分组查询(非常重要)
什么是分组查询:在实际应用中可能有这样的需求,需要先进行分组,然后堆i每一组的数据进行操作
select ... from ... group by ... 计算每个部门的平均工资 找出每个岗位的最高薪资关键字执行顺序:
select ... from ... where ... group by ... order by ...以上执行顺序不能颠倒,需要记忆
以上关键字的执行顺序:
1.from 2.where 3.group by 4.select 5.order by
所以在where中不能使用分组函数
案例:找出每个工作岗位的工资和
实现思路:按照工作岗位分组,然后工资求和
select job,sum(sal) from emp group by job重点结论: 在一条 select 语句中,如果有group by 语句的话,select 后米娜只能跟,参加分组的字段,以及分组函数,其他的都不能跟
多字段分组:找出每个部门,不同岗位的最高薪资
技巧:两个字段联合成1个字段看
select depton,job,max(sal) from emp group by depth,job使用having 子句可以对分完组之后的数据就行过滤
having不能代替where单独使用,必须和group by联合使用
where是先筛选再分组,having是先分组再筛选
示例:查询每个部门的最高薪资,要求显示最高薪资大于3000的
第一步: 查询每个部门的最高薪资
select depton,max(sal) from emp group by depton;第二步:显示最高薪资大于3000的
select depton,max(sal) from emp group by depton; having max(sal)>3000
单表查询总结
select ... from ... where ... group by ... having ... order by ...以上关键字只能按照这个顺序来。
执行顺序
1.from 2.where 3.group by 4.having 5.select 6.order by
从某张表中查询数据, 先经过where条件筛选有价值的数据 再经过 group by 对有价值的数据分组 之后这些分组可以通过having继续筛选 select查询出来 最后排序输出
distinct关键字
把查询结果去除重复记录 注意:不会改变原数据,只是查询结果去除
select distinct job from emp//distinct只能出现在所以字段的最前方、
distinct出现在job,deptno两个字段之前,表示两个字段联合起来去除重复
select distinct job,deptno from emp;
连接查询(非常重要)
什么是连接查询
从一张表中单独查询,称为单表查询。
emp表和dept表联合起来取数据,从emp中取员工名字,从dept中取部门名字。
这种跨表查询,多张表联合起来查询数据,称为连接查询
根据表的连接方式:
内连接: 等值连接 非等值连接 自链接
外连接: 左外连接(左连接) 右外连接(右连接)
全连接(不讲)
笛卡尔积现象
两张表连接没有任何条件限制:
select ename,dname from emp,dept;
是两张表的笛卡尔积
避免笛卡尔积现象
连接时加条件,满足这个条件的记录被筛选出来
select emp.ename,dept.dname from emp,dept where emp.deptno = dept.deptno; //给表起别名, select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno;最终查询的结果条数正确,但匹配过程中的匹配次数没有减少。还经过了笛卡尔积,只是筛选出来了
表的连接次数越多效率越低,尽量减少表的连接次数
内连接之等值连接:
案例:查询每个员工所在的部门名称,显示员工名和部门名 emp e和dept d表进行连接,条件是 : e.deptno = d.deptno
SQL92语法: select e.ename,d.dname; from emp e,dept d where e.deptno = d.deptno; SQL92 结构不清晰,表的连接条件和筛选的条件都放到了where的后面SQL99语法: select e.ename,d.dname; from emp e join dept d on e.deptno = d.deptno where ...; SQL99 结构清晰,表连接的条件是独立的,连接之后,如果还需要进一步筛选,再往后添加where,join是连接,on是条件 select ... from a join b on a和b连接的条件 (这个条件是等量关系,所以被称为等值连接) where 筛选条件;
内连接之非等值连接
案例:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
内连接之自连接
案例:查询员工的上级领导,要求显示员工名和对应的领导名
技巧:将一张表看成两张表 (给一张表起两个别名,分别用)
select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr = b.empno;
内连接的特点: 完全能匹配上这个条件的数据查询出来
外连接特点: 外连接能把 (right left)join 对应的表 看成主表,把主表的全部数据全都查出来,捎带着关联查询左边的表。
在外连接中,两张表出现了主次关系
外连接
select e.ename,e.sal,s.grade from emp e right join salgrade s on e.sal between s.losal and s.hisal;带有left的是左外连接,又叫做左连接
带有right的是右外连接,又叫做右连接
外连接的查询结果条数一定是 >= 内连接的查询结果条数
三张表连接(多表连接)
语法:
select ... from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件 .....也可以在其中使用外连接
子查询
概念
slelect语句中嵌套select语句,被嵌套的 select 语句称为子查询
出现位置
select
..(select).
from
..(select).
where
..(select).
where中的子查询
实例: 查询工资高于最低工资的员工名和工资
select ename,sal from emp where sal > (select min(sal) from emp);
from 中的子查询
注意:from后面的子查询,可以将子查询的查询结果当作一张临时表。(技巧)
案例: 找出每个岗位的平均工资的工资等级
select
t.*,s.grade
from
(select job,avg(sal) as avgsal from emp group by job) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal
select 中出现的子查询(了解即可)
Day4
union 合并查询结果集
案例
查询工作岗位是 manage 和 salesman 的员工(3种写法)
1.
select ename,job from emp where job = "manager" or job = "salesman";
2.
select ename,job from emp where job in ("manager","salesman");
3.(效率高,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。union可以减少匹配的次数,还能完成要求)
select ename,job from emp where job = "manager"
union
select ename,job from emp where job = "salesman"
使用union结果集合并时,必须保证结果的列数相同
limit
概念:
limit时将查询结果集的一部分取出来,通常使用在分页查询当中。
使用:
完整用法:limit startIndex,length;
缺省用法: limit 5;从0开始取5个值
按照薪资降序,取出排列在前五名的员工?
select
ename,sal
from
emp
order by
sal desc
limit 5; //取前五