MySQL(基础篇)
Posted 不做码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(基础篇)相关的知识,希望对你有一定的参考价值。
mysql(基础篇)
通过本文的学习,你将会学会MySQL的一些基本知识。
一、MySQL概述
MySQL是一种开源的关系型数据库管理系统(RDBMS)。
1.1分类
MySQL分为以下的几种类型:
-
DML(Data Manipulation Language): 数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性
INSERT:添加数据到数据库中。
UPDATE:修改数据库中的数据。
DELETE:删除数据库中的数据。
SELECT:选择(查询)数据。(SQL语言的基础,重要)
-
DDL(Data Definition Language): 数据定义语句,用于库和表的创建、修改、删除。
CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
-
DCL(Data Control Language): 数据控制语句,用于定义用户的访问权限和安全级别。
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
GRANT:授予访问权限
REVOKE:撤销访问权限
LOCK:对数据库的特定部分进行锁定
1.2图解MySQL程序结构
1.3启动和停止MySQL服务
通过命令行:
启动:net start mysql 服务名
停止:net stop mysql 服务名
1.4MySQL服务端的登录退出
通过命令行:
登录:mysql –h 主机名 –u用户名 –p密码
退出:exit
1.5MySQL语法规范
-
不区分大小写 -
每句话用 ;
或\g
结尾 -
各子句一般分行写 -
关键字不能缩写也不能分行 -
用缩进提高语句的可读性
二、查询
查询是SQL语言的基础!!!
2.1基础查询
-
语法
select 查询列表 from 表名;
-
特点
-
查询列表可以是表中的 字段、 常量值、 表达式、 函数 -
查询的结果是一个虚拟的表格 -
案例
# 1.查询表中的字段
select last_name from employees;
# 2.查询所有的字段
select * from employees;
# 3.如果要查询的字段有重名的情况,使用别名可以区分开来
# 起别名(使用AS)
select last_name as 姓,first_name as 名 from employees;
# (不带AS)
select last_name 姓,first_name 名 from employees;
# 4.去重(使用distinct)
select distinct department_id from employees;
# 5.+号的作用(+号在mysql 中只要一个作用:运算符)
select 100 + 90; #两个操作数都是数值型,则做加法运算
select '123' + 90; #其中一个为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运算
select 'wzl' + 90; #如果转换不成功,则将字符型数值转换为0
select null + 90; #只要其中一方为null,则结果肯定是null
# 6.字符串连接(concat) 显示全名
select concat(last_name,first_name) from employees;
2.2条件查询
-
语法
select 查询列表 from 表名 where 筛选条件;
-
分类
-
按条件表达式筛选
条件运算符:
>
<
=
<
>
!=
>=
<=
-
按逻辑表达式筛选:用于连接条件表达式
逻辑运算符:
&&
||
!
and
or
not
-
模糊查询
-
like一般和通配符搭配使用 -
%任意多个字符包含0个字符 -
_任意单个字符 -
提高语句的简洁度 -
包含临界值 且两个临界值不要调换顺序 -
判断某字段的值是否属于in列表的某一项 -
in列表中的值类型必须一致或者兼容 -
= 或<>不能用来判断null值 -
is null 或者is Not null可以判断null值 -
案例
## 1.按条件表达式筛选
## 查询员工工资>12000的员工信息
select * from employees where salary > 12000;
## 查询部门编号不等于90号的员工名和部门编号
select last_name 员工名,department_id 部门编号
from employees
where department_id != 90;
## 2.按逻辑表达式筛选
## 查询工资在10000到20000之间的员工名、工资以及奖金
select last_name 员工名,salary 工资,commission_pct 奖金
from employees
where salary >=10000 and salary <= 20000;
## 3.like
## 查询员工名中包含字符z的员工信息
select * from employees where last_name like '%z%';
## 查询员工名中第二个字符为z的信息
select * from employees where last_name like '_z%';
## 4.between and
## 查询员工编号在100到120之间的员工信息
select * from employees where employee_id >= 100 and employee_id <= 120;
select * from employees where employee_id BETWEEN 100 and 120;
## 5.in
## 查询员工的工种编号为001、002、003中的员工信息
select * from employees
where job_id = '001' or job_id = '002' or job_id = '003';
select *
where job_id in('003','001','002');
## 6.is null
## 查询编号为null的员工信息
select * from employees where employee_id is null
like
between and
in
is null
2.3排序查询
-
语法
select 查询列表 from 表 where 筛选条件 order by 排序列表 asc|desc
-
特点
-
asc
是升序,desc
是降序 默认升序 -
order by
子句中可以支持单个字段,多个字段,表达式,函数,别名 -
order by
子句一般放在最后,limit
子句除外 -
案例
## 查询员工信息,要求工资从高到低
select * from employees order by salary desc;
2.4常见函数
-
函数就是将一组逻辑语句封装,对外暴露了方法名称,为了实现特定的功能,类似于java中的方法
-
特点
-
隐藏了实现细节 -
提高了重用性 -
语法
select 函数名(实参列表) from 表;
-
分类
-
单行函数
concat
、length
、ifnull
等 -
分组函数(统计函数,聚合函数、组函数)
sum
求和、avg
平均值、max
最大值、min
最小值、count
数量等 -
特点
-
sum
,avg
一般用于处理数值型,max
,min
,count
可以处理任意类型 -
分组函数都忽略null值 -
可以和 distinct
搭配去重运算 -
count
函数一般使用count(*)做计算行数 -
分组函数一同查询的字段要求是 group by
后的字段 -
案例
# 1.字符函数
# length(str) 获取参数值的字节个数(字母1个字节,汉字3个字节)
select length('wzl');
# cancat(str1,str2,...) 拼接字符串
select concat(last_name,'_',first_name) from employees;
# lower(str) 小写,upper(str) 大写
select upper('wzl');
# substr、substring(注意索引从1开始) 截取字符串
select substr('wzllby',4); /*截取从指定索引处后面的字符*/
select substr('wzllby',2,3); /*截取从指定索引处指定字符长度的字符*/
# insrt(str,substr) 返回子串第一次出现的索引,如果找不到返回0
select instr('wzllby','wzl');
# trim 去掉字符前后的空格
select trim('a' from 'aaaaawzlaaaalbyaaaaaaaa');/*去掉字符串前后的某个字符*/
# lpad(str,len,padstr) 用指定的字符实现左填充指定的长度
# rpad(str,len,padstr) 用指定的字符实现右填充指定的长度
select lpad('wzl',10,'*');
select rpad('wzl',10,'*')
# replace 替换
select replace('wzllbywzllby','wzl','lby');
# 2.数组函数
# round 四舍五入
select round(2.61); /*四舍五入*/
select round(2.61,1); /*四舍五入,保留1位小数*/
# ceil 向上取整,返回>=该参数的最小整数
# floor 向下取整,返回<=该参数的最大整数
select ceil(4.558);
select floor(4.558);
# truncate 截断
select truncate(4.558,2);
# mod 取余
select mod(10,3);
# 3.日期函数
# now() 返回当前系统日期+时间
# curdate() 返回当前系统日期,不包含时间
# curtime() 返回当前系统时间,不包含日期
# 获取指定的年、月、日、小时、分钟、秒
select year(now()); /*年*/
select month(now()); /*月*/
select monthname(now()); /*英文月名*/
# str_to_date() 将字符通过指定的格式转换为日期
select str_to_date('1998-05-08','%Y-%m-%d');
# date_format() 将日期转换为字符
select date_format(now(),'%Y年%m月%d日');
# datediff() 计算两个时间相差的天数
select datediff(now(),'1997-4-5');
# 4.其他函数
# 版本version()
# 数据库 database()
# 用户user()
# 5.分组函数
select sum(salary) from employees;
select avg(salary) from employees;
select max(salary) from employees;
select min(salary) from employees;
select count(salary) from employees;
2.5流程控制函数
-
语法
# if-else 的效果 if函数
select if(逻辑运算,true值,false值)# switch case的效果 case函数使用一
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
...
else 要显示的值n或语句n;
end# 多重if的效果 case函数的使用二
case
when 条件1 then 要显示的值1或语句1
...
else 要显示的值n或语句n
end -
案例
# 1.if函数
select if(20 > 5,20,5);
# 2.case的第一种使用方式
# 要求部门号=001,显示工资 * 2 部门号=002,显示工资 * 1.5,部门号=003,显示工资 * 3,其他部门,显示原工资
select salary,department_id,
case department_id
when 001 then salary*2
when 002 then salary*1.5
when 003 then salary*3
else salary
end 新工资
from employees;
# 3.case的第二种使用方式
# 如果工资>10000,显示A;如果工资>6000,显示B;如果工资>4000,显示C;否则,显示D
select salary,
case
when salary>10000 then 'A'
when salary>6000 then 'B'
when salary>4000 then 'C'
else 'D'
end 等级
from employees;
2.6分组查询
-
语法
select 分组函数,列(要求出现在group by的后面)
from 表
group by 分组的列表 -
特点
-
分组前筛选:使用 where
在group by
之前 -
分组后筛选:使用 having
在group by
之后 -
案例
# 1.查询每个工种的最高工资
select job_id,max(salary) from employees group by(job_id);
# 2.查询部门的员工个数>2的部门id
select count(*),department_id
from employees
group by department_id 、
having count(*) >2;
2.7连接查询(多表查询)
-
含义
当查询的字段来自于多个表时,就会用到连接查询。
-
笛卡尔乘积
表1有m行,表2有n行,结果=m*n行
避免方式:添加有效的连接条件
-
分类
内连接(inner):等值连接、非等值连接、自连接
外连接:左外连接(left outer)、右外连接(right outer)、全外连接(full outer)
交叉连接(cross )
-
语法
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件 -
内连接特点
-
添加排序、分组、筛选 -
inner可以省略 -
筛选条件放在where后,连接条件放在on后,提高分离性,便于阅读 -
外连接特点
-
外连接查询结果= 内连接结果+ 主表中有而从表没有的记录 -
左外连接, left join
左边的是主表;右外连接,right join
右边的是主表 -
左外和右外交换两个表的顺序,可以实现同样的效果 -
全外连接= 内连接的结果+ 表1中有但表2没有的+ 表2中有但表1没有的
2.8分页查询
-
语法
select 查询列表
from 表
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit offset,size;
/*offset要显示条目的起始索引(起始索引从0开始)size 要显示的条目个数*/ -
特点
-
limit语句放在查询语句的最后
-
公式:要显示的页数 page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size,size; -
案例
# 查询前五条员工信息
select * from employees limit 0,5;
# 查询第6条——第10条员工信息
select * from employees limit 5,5;
2.9联合查询
-
联合
将多条查询语句的结果合并成一个结果
-
语法
查询语句1
union
查询语句2
union
... -
应用场景
查询的结果来自于多个表,且多个表没有直接连接关系,但查询的信息一致时
-
特点
-
多条查询语句的查询 列数一致! -
多条查询语句的查询的 每一列的类型和顺序一致 -
union
关键字默认去重,如果使用union all
可以包含 重复项 -
案例
# 查询部门编号=001或工种编号为001的员工信息
select * from employees where department_id = '001'
union
select * from employees where job_id = '001';
三、增删改
3.1插入语句(insert)
-
语法
# 方法一
insert into 表名(列名,...) values(值1,...);
# 方法二
insert into 表名
set 列名=值,列名=值,... -
特点
-
插入的值的类型要与列的类型一致或兼容 -
不可以为null的列必须插入值 -
列的顺序可以调换 -
列数和值的个数必须一致 -
可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
3.2修改语句(update)
-
语法
update 表名
set 列=新值,列=新值,...
where 筛选条件;
3.3删除语句(delete)
-
语法
# 方法一
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
# 方法二
truncate table 表名; -
比较
-
delete 可以加where 条件,truncate不能加 -
truncate删除,效率高一丢丢 -
假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始;而truncate删除后,再插入数据,自增长列的值从1开始. -
truncate删除没有返回值,delete删除有返回值 -
truncate删除不能回滚,delete删除可以回滚
以上是关于MySQL(基础篇)的主要内容,如果未能解决你的问题,请参考以下文章