MySQL学习笔记
旭玖的学习笔记,后续随缘更新!
day01笔记
1、四个问题
什么是数据库、数据库管理系统、sql,三者之间的关系?
1.数据库:
database 简称DB
2.数据库管理系统:
database’man’agement 简称DBMS
常见的数据库管理系统:
MySQL、Oracle、MS Sqlserver、DB2、sybase等
3.SQl:
结构化查询语言,是一套标准,可以在多个数据库管理系统中使用。通过编写SQL语句,然后DBMS执行SQL语句,最终完成数据库中的增删改查操作
4.三者之间的关系:
DBMS ——执行——> SQL ——操作——> DB
2、笔记
1.数据表
在任何一张数据表中,都存在行和列
行(row):数据/记录
列(column):字段
3、mysql常用命令
- 退出mysql:
exit
quit
ctrl+c
- 查看mysql中的数据库
show databases;
- 查看mysql中数据库内的数据表
show tables;
- 查看表中的所有数据
select * from 表名
- 使用数据库
use
- 创建数据库
create database 数据库名
- 查看表结构
desc 表名
- 查看当前使用的数据库
select database();
- 终止命令输入
\c
- 导入数据库(还原数据库)
source 路径及文件名
注意:路径内不能有中文!!!
11.输入数据
insert into 表名 values
4、SQL语句的分类
1.数据查询语言 DQL
带有select关键字的都是查询语句
select
2.数据操作语言 DML
对表内数据进行增删改的都是DML
insert:增
delete:删
update:改
3.数据定义语言 DDL
对表的结构进行操作,与DML不同,不对表的数据进行操作
create:新建
drop:删除
alter:修改
4.事务控制语言 TCL
commit:事务提交
rollback:事务回滚
5.数据控制语言 DCL
grant:授权
revoke:撤销权限
5、查询
1.简单查询
1.1 查询一个字段
select 字段名 from 表名;
注意:select 和 from 都是关键字
字段名和表名都是标识符
1.2 查询多个字段
使用’,'逗号隔开
select 字段名1,字段名2 from 表名;
1.3 查询所有字段
第一种方式:将所有字段名写出
select 字段名1,字段名2,字段名3,字段名... from 表名;
第二种方式:使用"*"号
select * from 表名;
缺点:
1、效率低
2、可读性差
不建议在实际开发中使用!
1.4 列(字段)起别名
第一种方式:使用关键字 as
select 字段名 as 别名 from 表名;
第二种方式:使用空格 " "
select 字段名 别名 from 表名;
注意:
若别名内含有空格或中文时,可使用’单引号’将别名括起来
1.5 列(字段)参与运算
可使用数学运算
‘+’ ‘-’ ‘*’ ‘/’
select 字段名*10 from 表名;
2.条件查询
2.1 语法格式
select 字段名 from 表名 where 条件;
2.2 条件
等于 =
select 字段1 from 表名 where 字段1 = 10;
select 字段2 from 表名 where 字段2 = 'sql';
不等于 <> 或 !=
select 字段1 from 表名 where 字段1 <> 10;
select 字段1 from 表名 where 字段1 != 10;
小于 <
select 字段1 from 表名 where 字段1 < 10;
大于 >
select 字段1 from 表名 where 字段1 > 10;
小于等于 <=
大于等于 >=
两个值之间 between … and … 等同于>= and <=
注意:
and:并且
- 使用between…and…时必须左小右大
2. between…and…是闭区间,包括左右两边的值
查询为null(空)的数据 is null (is not null :不为空)
注意:
null不能使用等号衡量
and 并且
select 字段名1,字段名2,字段名3 from 表名 where 字段名1 = 10 and 字段名2 > 20;
or 或者
select 字段1,字段2 from 表名 where 字段1 = 10 or 字段2 = 20;
注意:
1.and 与 or 同时出现,and优先级较高,如果想要优先使用or,需加(括号)
2.以后使用中,在不确定优先级的情况下可以添加小括号
in 包含
select 字段1 from 表名 where 字段1 in (800,100);
注意:
1.in不是一个区间,是一个具体的值
2.in相当于多个or
not in 不包含
select 字段1 from 表名 where 字段1 not in (800,500,300);
3.模糊查询
like 模糊查询
支持%或下划线匹配
%:匹配任意多个字符
下划线:匹配任意一个字符
select 字段1 from 表名 where like '%x%'
注意:
1.数据中有下划线的可以添加转义字符 \ (反斜杠)来查找该数据
4.排序 order by
1.默认排序 order by
select 字段1 from 表名 order by 字段1;
按照字段1默认排序(升序)
2.指定降序 order by desc
select * from 表名 order by 字段1 desc;
3.指定升序 order by asc
select * from 表名 order by 字段2 asc;
4.多字段排序
select * from 表名 order by 字段1 asc,字段2 asc;
注意:
哪个字段在前哪个字段就起主导作用
5.循环执行顺序
- from
- where
- select
- order by(排序总是在最后执行)
6、 数据处理函数
1.数据处理函数/单行处理函数
又称为:单行处理函数
特点:一个输入对应一个输出
相对的是:多行处理函数
特点:多个输入对应1个输出
2.常见的单行处理函数
- lower 转换小写
select lower(字段1) from 表名;
- upper 转化大写
select upper(字段1) from 表名;
- substr 取字符串
select substr(字段1,1,2) from 表名;
注意:
1. substr(被截取的字段,起始下标,截取的长度) 2. 起始下标从1开始,不能为0
- concat 字符串拼接
select concat(字段1,字段2) from 表名;
- length 取长度
select length(字段1) from 表名;
- trim 去空格
select * from 表名 where 字段1 = trim(' 526 ');
可以去除前后空格
7.round 四舍五入
select round(字段1,0) from 表名;
注意:
字段1处可填写字面量或字面值
round(字段1,保留的小数位/整数位)
2: 保留2位小数
0: 保留到个位
-1: 保留到十位
-2: 保留到百位
8.rand 生成随机数
select rand() from 表名;
可与round组合使用
select round(rand()*100,0) from 表名;
9.ifnull 可以将NULL值转化成具体值
select ifnull(字段1,0) from 表名;
注意:
- ifnull(字段1,0),0为NULL的替代值
10.类判断语句
case when then when then else end
case when then when then else end
select 字段1,字段2(case 字段1 when '150' then 字段2*1.5 when '540' 字段2*2.0 else 字段1 end) as new字段1 from 表名;
类似于选择判断语句
7、分组函数
1.分组函数/聚合函数/多行处理函数
特点:输入多行,输出一行
2.五个分组函数
注意:
- 分组函数使用时必须先对数据进行分组,然后才能使用
- 如果不对数据分组,整张表默认为一组
- 分组函数自动忽略NULL,我们不需要提前对NULL进行处理
- 分组函数不能直接写在在where中
- 所有分组函数都可以组合起来一起使用
- count 计数
select count(字段1) from 表名;
注意:
- count(具体字段):表示统计该字段下不为NULL的元素的总数
- count(*):统计表当中的总行数,有NULL也不影响
- sum 求和
select sum(字段1) from 表名;
- avg 平均值
select avg(字段1) from 表名;
- max 最大值
select max(字段1) from 表名;
- min 最小值
select min(字段1) from 表名;
8、分组查询
1.分组查询 group by
select 字段2,sum(字段1) from 表名 group by 字段2;
注意:
- 在select语句中,如果存在group by语句的话,select后面只能添加参加分组的字段及分组函数
- where后不能写分组函数
2.分组联合
select 字段1,字段2,max(字段3) from 表名 group by 字段1,字段2;
3.分组后再过滤 having
select 字段1,max(字段2) from 表名 group by 字段1 having max(字段2) > 200;
注意:
- where 和 having,优先使用where,where实在完成不了时可使用having
9、总结
1.SQL编写顺序
select #查询 from #数据来源 where #条件筛选 group by #分组 having #过滤/筛选 order by #排序
2.SQL执行顺序
from where group by having select order by
注意:
- 以上关键字只能按照这个顺序执行,不能颠倒
10、实际操作
1.创建数据
数据轮廓
1. 3个department 'yy','xs','kf' 运营,销售,客服
2. 5个job:'zy','zz','jl','kz','bz' 职员,组长,经理,科长,部长
create database lianxi;
create table aa(id int(10),name char(10),age int(3),department char(20),job char(10),wages int(10));
alter table aa add gender char (10);#增加字段 性别
alter table aa modify column id int(3) not null auto_increment primary key;#id设置自增
insert into aa value (1,'XuJiu',19,'yy','bz',30000,'man');
insert into aa value (2,'LiHua',25,'xs','zy',2000,'man');
insert into aa value (3,'WangFen',29,'xs','jl',10000,'man');
insert into aa value (4,'TonZifen',25,'yy','jl',10000,'man');
insert into aa value (5,'MaZihan',18,'kf','zy',4000,'woman');
insert into aa value (6,'HeYahui',21,'yy','jl',9000,'woman');
insert into aa value (7,'ZhouYuxuan',22,'kf','zz',6000,'woman');
insert into aa value (8,'SunYun',20,'kf','zy',3000,'woman');
insert into aa value (9,'YangHuihui',31,'yy','kz',20000,'woman');
insert into aa value (10,'LiKai',27,'xs','bz',30000,'man');
insert into aa value (11,'HuangKun',18,'kf','zz',5000,'man');
insert into aa value (12,'WangXiaxi',25,'yy','jl',15000,'man');
insert into aa value (13,'DaiZhui',27,'xs','jl',15000,'woman');
insert into aa value (14,'ZhaoWei',25,'kf','jl',15000,'man');
insert into aa value (15,'LiZiqi',25,'kf','bz',20000,'woman');
+----+------------+------+------------+------+-------+--------+
| id | name | age | department | job | wages | gender |
+----+------------+------+------------+------+-------+--------+
| 1 | XuJiu | 19 | yy | bz | 30000 | man |
| 2 | LiHua | 25 | xs | zy | 2000 | man |
| 3 | WangFen | 29 | xs | jl | 10000 | man |
| 4 | TonZifen | 25 | yy | jl | 10000 | man |
| 5 | MaZihan | 18 | kf | zy | 4000 | woman |
| 6 | HeYahui | 21 | yy | jl | 9000 | woman |
| 7 | ZhouYuxuan | 22 | kf | zz | 6000 | woman |
| 8 | SunYun | 20 | kf | zy | 3000 | woman |
| 9 | YangHuihui | 31 | yy | kz | 20000 | woman |
| 10 | LiKai | 27 | xs | bz | 30000 | man |
| 11 | HuangKun | 18 | kf | zz | 5000 | man |
| 12 | WangXiaxi | 25 | yy | jl | 15000 | man |
| 13 | DaiZhui | 27 | xs | jl | 15000 | woman |
| 14 | ZhaoWei | 25 | kf | jl | 15000 | man |
| 15 | LiZiqi | 25 | kf | bz | 20000 | woman |
+----+------------+------+------------+------+-------+--------+
2.数据操作
select id,name,job,wages,gender from aa where department = 'yy';
+----+------------+------+-------+--------+
| id | name | job | wages | gender |
+----+------------+------+-------+--------+
| 1 | XuJiu | bz | 30000 | man |
| 4 | TonZifen | jl | 10000 | man |
| 6 | HeYahui | jl | 9000 | woman |
| 9 | YangHuihui | kz | 20000 | woman |
| 12 | WangXiaxi | jl | 15000 | man |
+----+------------+------+-------+--------+
select name,job,wages,gender from aa where department='yy' order by wages;
+------------+------+-------+--------+
| name | job | wages | gender |
+------------+------+-------+--------+
| HeYahui | jl | 9000 | woman |
| TonZifen | jl | 10000 | man |
| WangXiaxi | jl | 15000 | man |
| YangHuihui | kz | 20000 | woman |
| XuJiu | bz | 30000 | man |
+------------+------+-------+--------+
select name,job,wages,gender from aa where department='yy' order by wages desc;
+------------+------+-------+--------+
| name | job | wages | gender |
+------------+------+-------+--------+
| XuJiu | bz | 30000 | man |
| YangHuihui | kz | 20000 | woman |
| WangXiaxi | jl | 15000 | man |
| TonZifen | jl | 10000 | man |
| HeYahui | jl | 9000 | woman |
+------------+------+-------+--------+
select count('jl')as '经理总数' from aa;
+--------------+
| 经理总数 |
+--------------+
| 15 |
+--------------+
select name,gender,wages from aa where job='jl' group by name,gender,wages;
+-----------+--------+-------+
| name | gender | wages |
+-----------+--------+-------+
| WangFen | man | 10000 |
| TonZifen | man | 10000 |
| HeYahui | woman | 9000 |
| WangXiaxi | man | 15000 |
| DaiZhui | woman | 15000 |
| ZhaoWei | man | 15000 |
+-----------+--------+-------+
select job,max(wages) from aa group by job;
+------+------------+
| job | max(wages) |
+------+------------+
| bz | 30000 |
| zy | 4000 |
| jl | 15000 |
| zz | 6000 |
| kz | 20000 |
+------+------------+
select job,min(wages) from aa group by job;
+------+------------+
| job | min(wages) |
+------+------------+
| bz | 20000 |
| zy | 2000 |
| jl | 9000 |
| zz | 5000 |
| kz | 20000 |
+------+------------+
select department,max(wages) from aa group by department;
+------------+------------+
| department | max(wages) |
+------------+------------+
| yy | 30000 |
| xs | 30000 |
| kf | 20000 |
+------------+------------+
select department,job,max(wages) from aa group by department,job;#有问题
select department as '部门',job as '职位', max(wages) as '最高工资' from aa group by department,job order by max(wages);#有问题
select department,max(wages) from aa where wages>10000 group by department;
+------------+------------+
| department | max(wages) |
+------------+------------+
| yy | 30000 |
| xs | 30000 |
| kf | 20000 |
+------------+------------+
select department,max(wages) from aa group by department having max(wages) > 20000;
+------------+------------+
| department | max(wages) |
+------------+------------+
| yy | 30000 |
| xs | 30000 |
+------------+------------+