MySQL
1.概述
1.1 什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?
- 数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
- 数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。
- 常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等…
- SQL:结构化查询语言。程序员需要学习SQL语句,程序员通过编写SQL语句,然后DBMS负责执行SQL语句,最终来完成数据库中数据的增删改查操作。SQL是一套标准,程序员主要学习的就是SQL语句,这个SQL在mysql中可以使用,同时在Oracle中也可以使用,在DB2中也可以使用。
- 三者之间的关系?
DBMS–执行–> SQL --操作–> DB
1.2 在windows操作系统中如何使用命令启动关闭MySQL(MySQL80)服务?
net stop MySQL
net start MySQL
1.3 MySQL 的本地登录
//密码显示的方式登录
C:\Users\ASUS>mysql -uroot -p123456
//密码隐藏的方式
C:\Users\ASUS>mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.26 MySQL Community Server - GPL
Copyright (c) 2000, 2021, 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.
1.4 MySQL的常用命令
-
查询mysql版本:mysql -version
-
退出mysql:exit
mysql>exit
-
查看数据库:show databases; (注意英文分号结尾)
mysql>show databases;
-
选择使用某个数据库:use ###;
mysql>use ###;
-
创建数据库:create database ###;
mysql>create database ###;
-
导入数据:source ###.sql
mysql>source ###.sql
-
删除数据库:drop database ###;
mysql> drop database ###;
-
查询数据库版本:select database();
mysql> select database();
-
查询数据库版本:select version();
mysql> select version();
-
终止一条语句:\c
1.5 数据库中最基本的元素 表(table)
表(table)是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课程信息,都可以放到表中。另外 表都有特定的名称,而且不能重复。表中具有几个概念:列、行、主键。 列叫做字段(Column),行叫做表中的记录,每一 个字段都有:字段名称/字段数据类型/字段约束/字段长度
1.6 SQL 的分类
- 数据查询语言(DQL-Data Query Language)
- 代表关键字:select
- 数据操纵语言(DML-Data Manipulation Language)
- 代表关键字:**insert(增),delete(删),update(改)**主要是对表中的数据进行操作
- 数据定义语言(DDL-Data Definition Language)
- 代表关键字:**create (新建),drop(删除),alter(修改)**主要是对表中的结构进行操作
- 事务控制语言(TCL-Transactional Control Language)
- 代表关键字:commit(事务提交) ,rollback(事务回滚);
- 数据控制语言(DCL-Data Control Language)
- 代表关键字:grant(授权),revoke(撤销权限)
2.简单查询
select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)
#1.查看数据库
show databases;
#2.查询数据库版本
select database();
#3.选择使用某个数据库
use bjpowernode;
#4.查看表中数据(注意:对表进行操作首先要选择要操作的数据库)
select * from dept;select * from emp;select * from salgrade;
#5.查看表的结构
desc dept;
#6.查询一个字段
select dname from dept;
#7.查询多个字段
select dname,deptno from dept;
#8.给查询的列起别名 as关键字,也可以省略(只是给查询的显示列名改变,不会改变数据库中表的字段名)
select dname as name from dept;
select dname name from dept;
#9.特殊名称用"" '' ``隔开
#在所有的数据库中,字符串统一使用单引号,Oracle中不能使用双引号
select dname "hello world" from dept;
select dname 'hello world' from dept;
select dname `hello world` from dept;
select ename,sal from emp;
#查询员工的年薪,即月工资*12
#(10字段可以使用数学表达式)
select ename,sal*12 from emp;
select ename,sal*12 as `年薪` from emp;
select ename,sal/30 as `日薪` from emp;
3.条件查询
3.1 概述
什么是条件查询?:不是将表中所有数据都查出来。是查询出来符合条件的。
语法格式:
select 字段1,字段2,字段3....from 表名where 条件;
3.2 条件查询的条件
- 等于 : =
#查询收入为800的员工相关信息
select empno,ename,sal from emp where SAL = 800;
#查询姓名为SMITH的员工编号和工资
#查询字符串可以使用单引号和双引号,建议使用单引号
select empno,sal from emp where ename = 'SMITH';
select empno,sal from emp where ename = "SMITH";
#报错
select empno,sal from emp where ename = `SMITH`;
- 不等于 : <>或!=
#查询收入为800的员工相关信息
select empno,ename,sal from emp where SAL = 800;
#查询姓名为SMITH的员工编号和工资
#查询字符串可以使用单引号和双引号,建议使用单引号
select empno,sal from emp where ename = 'SMITH';
select empno,sal from emp where ename = "SMITH";
#报错
select empno,sal from emp where ename = `SMITH`;
-
小于:<
-
大于:>
-
小于等于:<=
-
大于等于:>=
#查询收入小于2000的相关员工信息
select empno,ename,sal from emp where SAL < 2000;
#查询收入小于等于3000的相关员工信息
select empno,ename,sal from emp where SAL <= 3000;
#查询收入大于2000的相关员工信息
select empno,ename,sal from emp where SAL > 2000;
#查询收入大于等于3000的相关员工信息
select empno,ename,sal from emp where SAL >= 3000;
-
**between … and …**等同于 >= and <=
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
#查询收入大于等于2450,小于等于3000的相关员工信息
#1.between ... and ...
select
empno,ename,sal
from
emp
where
SAL between 2450 and 3000;
#2.>= and <=
select
empno,ename,sal
from
emp
where
SAL >= 2450 and SAL <= 3000;
-
is null 为 null(is not null 不为空)
在数据库当中null不能使用等号进行衡量。需要使用is null。因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
#查询哪些员工的津贴为null
select
empno,ename,sal,comm
from
emp
where
comm is null;
#不能使用=
select
empno,ename,sal,comm
from
emp
where
comm = null;
#查询哪些员工的津贴不为null
select
empno,ename,sal,comm
from
emp
where
comm is not null;
- 并且:and
#查询工作岗位是MANAGER并且工资大于2500的员工信息
select
empno,ename,job,sal
from
emp
where
job = 'MANAGER' and sal > 2500;
- 或者:or
#查询工作岗位是MANGER或者是SALEMAN的员工信息
select
empno,ename,jobfrom emp
where
#注意:不能写成job = 'MANAGER' or 'SALESMAN'
job = 'MANAGER' or job = 'SALESMAN';
-
and 和 or同时出现的优先级问题
and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号”。以后在开发中,如果不确定优先级,就加小括号就行了。
#查询工资大于2500,并且部门编号为10或20部门的员工
select
empno,ename,job,deptno
from
emp
where
SAL > 2500 and (deptno = 10 or deptno = 20);
-
包含:in 不包含:not in
相当于多个or
#查询部门编号为10,20,30的员工
select
empno,ename,job,deptno
from
emp
where
deptno in (10,20,30);
#查询部门编号不为10,20的员工
select
empno,ename,job,deptno
from
emp
where
deptno not in (10,20);
-
not
not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in -
模糊查询:like
- 称为模糊查询,支持%或下划线匹配
- %匹配任意多个字符
- 下划线:任意一个字符。
- (%是一个特殊的符号,_ 也是一个特殊符号)
#查询员工姓名中含有字母O的信息
select
empno,ename,job,deptno
from
emp
where
ename like '%o%';
#查询员工姓名中首字母为J的信息
select
empno,ename,job,deptno
from
emp
where
ename like 'J%';
#查询员工姓名中尾字母为S的信息
select
empno,ename,job,deptno
from
emp
where
ename like '%S';
#查询员工姓名中第二个字母为A的信息
select
empno,ename,job,deptno
from
emp
where
ename like '_A%';
4.排序操作(ORDER BY语句)
- 默认为升序:asc,降序:desc
- 两个或多个字段进行排序时,优先级为从左到右
- 根据字段的位置也可以排序
select ename,sal from emp order by 2; // 2表示第二列。第二列是sal- 关键字顺序不能变:
select
…
from
…
where
…
order by
…- 语句的执行顺序必须掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)
use bjpowernode;
#按照工资升序(从低往高),找出相关员工信息
select
ename,sal
from
emp
#默认升序asc
order by
sal;
#按照工资降序,找出相关员工信息
select
ename,sal
from
emp
order by
sal desc;
#按照工资升序排列,如果工资一样,按照姓名的降序排列
select
ename,sal
from
emp
order by
sal asc, ename desc;
#找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
select
ename,sal
from
emp
where
sal between 1250 and 3000
order by
sal desc;
5.数据处理函数
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
-
lower():转换小写
-
upper():转换为大写
-
substr():取子串
第一个参数为字段名,第二个为截取子串的开始(注意:SQL中数组以1开始),第三个参数为截取子串的结束位置,默认为末位
-
contat():字符串拼接
-
length():取长度
-
trim():去空格
-
str_to_date() 将字符串转换成日期
-
date_format() 格式化日期
-
**now()😗*现在的时间
-
format() 设置千分位
-
round():四舍五入
-
rand():生成随机数,数值大小为0~1
-
ifnull():可以将 null 转换成一个具体值
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL,为了避免这个现象,需要使用ifnull函数
ifnull函数用法:ifnull(数据, 被当做哪个值)
如果“数据”为NULL的时候,把这个数据结构当做哪个值。
测试:
use bjpowernode;
#1.lower():转换小写
#将员工姓名转换为小写
select lower(ename) as '小写姓名' from emp;
#2.upper():转换为大写
select upper(ename) as '大写姓名' from emp;
#3.substr():取子串
#substr():第一个参数为字段名,第二个为截取子串的开始(注意:SQL中数组以1开始),第三个参数为截取子串的结束位置,默认为末位
#去掉姓名首字母
select substr(ename,1) as '去掉姓名首字母' from emp;
#获取姓名的前两个字母
select substr(ename,1,2) as 'ename' from emp;
#4.contat():字符串拼接
#拼接员工编号和员工姓名
select concat(empno,'+',ename) from emp;
#5.length():取长度
select length(ename) as '姓名的长度' from emp;
#6.trim():去空格
#相当于查询员工姓名为KING的员工信息
select * from emp where ename = trim(' KING');
#7.str_to_date() 将字符串转换成日期
SELECT STR_TO_DATE('29,11,2000','%d,%m,%y') as '日期';
#8.date_format() 格式化日期
#9.now():现在的时间
select DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p') as '现在的时间';
#9.format() 设置千分位
#结果为:14,500.202
SELECT FORMAT(14500.2018, 3);
#10.round():四舍五入
#保留整数位
select round(1236.567, 0) as result;
#保留小数位
select round(1236.567, 1) as result;
#保留到十位(即个位为0)
select round(1236.567, -1) as result;
#11.rand():生成随机数,数值大小为0~1
# 100以内的随机整数
select round(rand()*100,0);
#12.ifnull():可以将 null 转换成一个具体值
#在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL,为了避免这个现象,需要使用ifnull函数
select ename, sal + comm as salcomm from emp;
#计算员工的年薪:年薪 = (月薪 + 月补助) * 12
select ename, (sal + comm) * 12 as '年薪' from emp;
#ifnull函数用法:ifnull(数据, 被当做哪个值)
#如果“数据”为NULL的时候,把这个数据结构当做哪个值。
select ename, (sal + ifnull(comm, 0)) * 12 as '年薪' from emp;
6.分组函数(多行处理函数)
多行处理函数的特点:输入多行,最终输出一行。
- 注意:
- 分组函数在使用的时候必须先进行分组,然后才能用。
- 如果你没有对数据进行分组,整张表默认为一组。
- 分组函数使用的时候自动忽略null(注意是忽略,而不是把null当做0处理)
- 分组函数不能够直接使用在where子句中
- 所有的分组函数可以组合起来一起用。
五个基本的分组函数
- count 计数
select * from emp;
#count():计数
#使用count()函数的时候要注意,如果参数为具体字段,它会忽略值为null的行,不会进行统计
select count(comm) from emp;
#当count()函数中的参数为*时,就可以认为他是统计表的行数
select count(*) from emp;
-
sum 求和
#sum():求和 select sum(sal) as '员工的工资总和' from emp;
-
avg 平均值
#avg():平均数 select round(avg(sal),0) as '员工的工资平均数' from emp;
-
max 最大值
#max():最大值 select round(max(sal),0) as '员工的工资最大值' from emp;
-
min 最小值
#min():最小值 select round(min(sal),0) as '员工的工资最小值' from emp;
分组函数还可以同时使用:
#分组函数可以一起使用
select
sum(sal) as '员工的工资总和',
round(avg(sal),0) as '员工的工资平均数',
round(max(sal),0) as '员工的工资最大值',
round(min(sal),0) as '员工的工资最小值',
count(*) as '员工的总数'
from
emp;