MySQL学习笔记
-
为什么要学习数据库
通常用于保存数据的容器:
数组 集合(内存,一段电就没了) 文件 (可以实现永久存储,但如果存在大量文件时就很不方便查询,也很不方便管理)…
这时候就需要管理数据的软件 --数据库管理系统
-
数据库相关概念
-
DB,DBMS,SQL
DB就是数据库,数据库是要反复使用,所以数据库是有组织的,它不像垃圾桶混乱无序
DBMS就是数据库管理系统,也就是平时人们常说的“数据库”,常见的数据库管理系统有MySQL,Oracle,DB2,SqlServer等
相关数据库管理系统的排名可到DB-ENGINES查询
2020.8.1最近的排名为
1.Oracle 2.MySQL 3.Microsoft SQL Server
SQL就是结构化查询语言,专门用来与数据库通信的语言
SQL的优点:
-
不是某个特定数据库供应商专有的语言,几乎所有DBMS都支持SQL
-
简单易学
-
虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作
-
-
-
数据库存储数据的特点
数据库的特点
-
将数据放到表中,表再放到库中
-
一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性
-
表具有一些特性,这些特性定义了数据在表如何存储,类似java中“类”的设计
-
表由列组成,我们也称为字段,所有表都是由一个或多个列组成的,每个类似java中的“属性”
-
表中的数据是按行存储的,每一行类似于java中的“对象”
-
-
初始化MySQL
-
MySQL产品的介绍
Mysql数据库隶属于Mysql AB公司,总部位于瑞典,后来被oracle收购
优点
成本低,开放源代码,一般可以免费试用
性能高, 执行很快
简单,很容易安装和使用
DBMS分为两大类
基于共享文件系统的DBMS(Access)
基于客户机-服务器的DBMS(Mysql,Oracle,SqlServer)
MySQL的版本
社区版(免费)
企业版(收费)
http://dev.mysql.com/downloads/mysql
-
MySQL安装和卸载
卸载:
由于本人用得是window所以只以window为例子
在控制面板>程序>程序和功能中删除所下载的mysql程序,这一步是删除不干净的,
还得在c盘中Programdata>mysql中删除mysql的数据,还得在mysql安装的文件中删除干净,如果还是不干净就从注册表中删除,注册表应该删除如下:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet00I\Services\Eventlog\Application\MySQL 目录
HKRY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQL 目录
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQL 目录
HKRY_LOCAL_MACHINE\SYSTEM\CurrentControl001\Services\MYSQL日录
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl002\Services\MYSQL目录
HKRY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MYSQL目录
C:\Documents and Settings\All User\Application Data\MySQL目录(隐藏的目录)最简单的方法就是用工具删除干净,如360软件
安装:
根据自己的系统来决定选择哪个
更加具体的过程,限于本人已经安装,没有安装的可以参考
如果安装过程出现失败可以先别卸载,可以在安装目录内>bin目录下MySQLlinstanceConfig.exe文件双击后重新配置下。
-
MySQL服务的启动和停止
启动:打开 控制面板\所有控制面板项\管理工具\服务
或者在DOS窗口 启动net start mysql(这个为mysql的名称就是安装mysql软件时) 停止 net stop mysql,上面的操作必须以管理员的身份进行操作
-
MySQL服务的登录和退出
mysql需要配置环境变量
登录:在DOS中输入 mysql -uroot -p(这个以自己的在安装时来定)
退出:在DOS中输入 quit
或者是用SQLyog软件
-
MySQL的常见命令和语法概念
常见命令如下:
查看数据库的版本
select version(); 或者是在DOS中在没有进入mysql中下 mysql --V
查询数据管理系统中有多少个数据库
show datebases;
使用指定数据库
use 数据库名;
查询指定数据库中有多少张表
show tables;
查询指定表的结构
desc 表名;
查看正在使用哪个数据库
select datebase();
在mysql是不区分大小的,但是通常情况下关键字是大写,表名,库名,列为小写
查询结束时加;
-
-
DQL语言的学习
-
基础查询
语法为:
查询字段
select 查询列表 from 表名;
特点:查询列表可以是:表中字段,常量值,表达式,函数
查询的结果是一个虚拟的表格
查询单个字段如:
select name from student
查询多个字段如:
select name old from student(就是在select后面定义要查询的多个字段,字段之间用空格隔开)
查询全部字段
select * from student
查询常量值 就是显示常量值
查询表达式如
select 1000*20;
查询函数如
select version();
起别名如
select 100*20 as result 可以为 select 100 * 20 result 如果别名中有空格可以加单引号也可以加双引号
去重:
select distinct 相关列名
+号的作用:
运算符(加运算,当一方为数值型试图会将其它类型转化为数值型然后进行加法运算,当一方为null时值为null)
concat用法:就是拼接
select concat(‘a’,‘b’,‘c’)
-
条件查询
语法
select 查询列表 from 表名 where 筛选条件;
分类
一. 按条件表达式筛选
条件运算符:>,<,=,!=,<>(这个是不等于),>=,<=,<=>(这个是安全等于)
按逻辑表达式:&&,!,||,and,or,not
模糊查询:like,between,and,in,is null,if null(?,0)
模糊查询例子:(%为通配符)
select * from student where lastname like ‘%a%’
like的特点:
%任意多个字符,包含0个字符,_单个字符,特殊字符表示可以用转义\,也可以自定义转义关键字为escape
例子:
select * from student where name like ‘%a %' escape ' ’;
其他注意点:
between and 特点包含两个临界值,它和<,>经常替代使用
or,如果or过多的话可以用in来代替,in相当于=,所以它不支持通配符,in有点像数学的枚举
安全等于<=>后面可以加null,也可以加常量
-
排序查询
语句:
select * from student where 筛选条件 order by 排序列表 asc(升序)|desc(降序),如果后面不写默认是升序
order by 后面可以加字段 多个字段 表达式 函数 别名
-
常见函数
函数概念:类似java中方法,将一组逻辑语句封装在方法中,对外暴露方法名
调用:select 函数名(实参列表)【from 表】
特点:叫什么,干什么
分类:单行函数(做处理),分组函数(做统计的,也叫统计函数)
常见函数:字符函数,数学函数,日期函数,其他函数,流程控制函数
字符函数(有点类似于java的String对象中的方法):
length():
用于获取指定字符串的长度(字节),例子:select length(‘中国’);
concat ():
拼接字符串,例子:select concat(‘中国’,‘必胜’);
upper(),lower():
大写字符串,小写字符串,例子:select upper(‘aaaaa’); select lower(‘AFDFDDD’);
substr(),substring():
截取子字符串,例子:select substr(‘adfsafa’,2);select substr(‘sfsafas’,1,3); 字符串指的是被截取的对象,第一数字为开始在哪一位截取,在mysql中索引是从1开始的,第二个数字表示截取几个
instr():
返回子字符串第一次出现的索引,如果找不到返回0,例子:select instr(‘skjaskjla’,‘ja’);
trim():
去除前后的空格,例子:select trim(’ 中国 ');
lpad():
左填充指定字符,例子:select lpad(‘道’,10,‘佛’); 第一个字符串为定点,数字为填充个数,最后一个字符串就是填充物
rpad():
右填充指定字符,例子同上类似
replace():
用指定子字符串替代字符串中指定的子字符串,例子:select replace(‘helloworld’,‘world’,‘grils’); 第一个为主字符串,第二个为被代替子字符串,第三个为代替子字符串
数学函数:有点类似于Math类
round():
四舍五入,例子:select round(2.25,1); 第一个数值为要四舍五入的对象,第二个数字为多少保留多少个小数,如果当不保留小数时第二个数字可以不要
ceil():
向上取整,例子,select ceil(1.222);
floor():
向下取整,与上面类似
truncate():
截断 ,例子: select truncate(1.222,3);第一位数值为被截断者,第二位为保留小数位数
mod();
取余,例子: select mod(5,2);5为被除数,被除数为正数余就是正数
日期函数:
now():
返回当前系统时间+日期,无参数,select now();
curdate():
返回系统日期,不含时间,无参数,同上
获取指定部分的年,月,日,时,分,秒,格式例子:select year(now());
str_to_date():将日期格式的字符床妆化为指定类型的日期格式:select str_to_date(‘9-12-1999’,’%m-%d-%y’)
date_format:将日期换成字符
date_format(‘2018/2/6’,’%Y年%m月%d日’)
其他函数:
select version();
select datebase();
select user();
流程控制函数:
if(a,b,c):
如果a成立就为b,不成立就为c,例子:select if(5>1,1,2);
case();有点类似于switch
语法为:select case 要判断的表达式
where 常量1 then 要现实的值或语句;
where 常量1 then 要现实的值或语句;
else 要现实的值或语句;
end
类似于if else if的case():
case()
where 语句 then 语句或字段;
where 语句 then 语句或字段;
where 语句 then 语句或字段;
else 语句 then 语句或字段;
-
分组函数
功能用于统计,被称为统计函数
sum求和,avg平均值,max最大值,min最小值,count统计个数
使用例子如下
select sum(表的列名),avg(表的列名)。。。。类推
-
分组查询
分组查询格式为
select 分组查询列表 from 表名 where 筛选条件 ground by 分组字段 having 后续操作;
特点:
分组前筛选条件为 where ,分组前的筛选条件涉及实在表,分组后筛选条件为having,是指分组函数运算后的,涉及分组函数的筛选条件就是
-
连接查询(涉及两表查询的方式)
连接查询分类:
内连接:等值连接 非等值连接 自连接
等值连接:例子如下
select name,boyname
from boys,beauty
where beauty.boyfriend_id=boys.id;
上面另一种写法为:遵守标准为sql99
select name,boyname
from boys
inner join beauty
on beauty.boyfriend_id=boys.id
(这种格式的写法基于SQL99标准,相关格式如下)
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【grounp by 分组】
【having 筛选条件】
【order by 排序条件】
连接类型:
内连接:inner
外连接:
左外:left 【outer】
右外:right 【outer】
全外:full【outer】
交叉连接:cross
非等值连接:不是直接根据相同列的含义来将表连接在一起,不是直接=的关系,比如一个员工的工资位于哪个阶段,所处的阶段是根据员工的工资去寻找它位于哪个两个标准工资之间,然后两个标准工资处于哪个阶段,得出员工的工资在哪个阶段,例子如下:
select salary,grade_level
from employee e
join job_grades g
on e.‘salary’ between g.‘lowest_sal’ and g.‘highest_sal’;
自连接:
特点就一张表扮演多个角色,查得都是自己
例子如下:
select e.last_name,m.last_name
from employees e
join employees m
on e.‘manager_id’=m.‘employee_id’;
外连接:左连接 右连接 全外连接
作用:用于查询一个表有,另一表没有的记录
例如查询哪个部门没有员工
select d.* ,e.employee_id
from departments d
left outer join employees e
on d.‘department_id’=e.‘department_id’
where e.‘employee_id’ is null;
交叉连接
就是笛卡尔连接,就是一表中m条记录与另一张表n条记录相连接,m*n
外连接的特点:
外连接的查询结果为主表中的所有记录:
如果从表中有和它匹配的,则显示匹配的值,没有则显示为null
外连接查询的结果=内连接+主要中有从表中没有的记录
判断主表的方式为连接方式
全外连接=内连接的结果+表1中有表2中没有+表2中有表1中没有(Mysql中不支持全外连接)
-
子查询
概念:出现其他语句中的select语句,称为子查询或内查询,外部查询语句为主查询
分类:
按子查询出现的位置
select后面:仅仅支持量子查询
from后面:支持表子查询
where或者having后面:量子查询,列子查询,行子查询
exits后面:表子查询
标量子查询(结果为一行一列)
表子查询(结果通常是多行多列)
列子查询 (结果通常为一列多行)
行子查询 (结果为一行多列)
一.where 或 having后面:(多行多列,一行一列,一行多列)
特点:子查询放在小括号内,子查询一般放在条件后面,标量子查询一般搭配单行操作符使用 >, < ,>=,=,<>,列子查询:一般搭配着多行操作符使用 in,any/some,all
例子:
select *
from employees
where salary > (select salary from employees where last_name =‘Abel’);
-
分页查询
应用场景:当要显示的数据,一页显示不全,需要多页提交sql请求
格式为
select 查询列表
from 表
【join type join 表2】
on 连接条件
where 筛选条件
group by 分组字段
having 筛选条件
order by 排序字段
limit 【offset】 size
offset为显示条目的起始索引(从0开始)
size要显示条目个数
-
union联合查询
将多条查询语句的查询结果合并成一个结果
特点:查询的列数相同,列名顺序相同
语法
查询语句1
union
查询语句2
-