最新MySQL入门篇

一、SQL简介

​ SQL:结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

​ 通常包含三个部分:

  • DML

    Data Manipulation Language 数据操作语言

    用于检索或更新数据库:insert delete update select 增删改查

  • DDL

    Data Definition Language 数据定义语言

    用于定义数据的结构:create drop alter truncate

  • DCL

    Data Control Language 数据控制语言

    用于定义数据库用户的权限:grant revoke commit rollback

二、MySQL简介

1.介绍

​ MySQL:作为SQL的一个产品,是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,增加了速度并提高了灵活性。

​ 特点:支持多种语言、开源,中小型网站一般都使用MySQL数据库

2.安装MySQL

2.1版本

​ 分平台:Windows、Linux、Mac

​ 分版本:5.x 6.x 7.x 8.x

2.2安装
  • 下载安装包

首先在mysql官网下载mysql,根据系统型号选择对应的包下载,这里选择的版本号为5.7.25

下载完之后,查看压缩包内是一个标准的mysql文件,如图
最新MySQL入门篇_第1张图片

  • 配置环境变量

配置系统环境变量,桌面→我的电脑→右键"属性"→高级系统设置→环境变量→系统变量→新建
最新MySQL入门篇_第2张图片
在path目录下配置
在这里插入图片描述

  • 手动配置文件

下载的mysql文件中没有默认的配置文件,需要手动添加,一般命名为my.ini,文件内容为:

[Client]
port = 3306
 
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=D:\software\mysql-5.7.25-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\software\mysql-5.7.25-winx64\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
 
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
  • 准备安装mysql

管理员身份启动cmd ,命令如下: mysqld -install

  • 启动服务

命令: net start mysql

  • 本地服务查看

启动mysql服务后,打开本地服务,看到服务已经启动
最新MySQL入门篇_第3张图片

  • 设置账号

新版本初次安装好不需要密码可以直接进入,但是为了安全和方便还是需要密码的,需要设置,设置步骤参考如下:

1、cmd进入MySQL:mysql -u root -p;然后回车

2、set password=password(‘root’);//以设置root为例,如下图
最新MySQL入门篇_第4张图片

三、基本操作

1.连接MySQL

​ 语法:

mysql -u 用户名 -p 密码 -h 数据库服务器地址 -D 数据库名

​ 注:安装MySQL以后,默认有一个管理员root

2.查看数据库和表

show databases;-- 查看当前所有数据库
use 数据库名;	-- 切换数据库
show tables;   -- 查看当前数据库中所有的表
select database();-- 显示当前操作的数据库
select user();	  -- 显示当前登录的用户

information_schema、mysql、performance_schema这三个数据库为系统自带,不可动(其中mysql库是系统库,包含MySQL的相关系统信息,也不能修改)

3.导入初始数据

3.1导入数据

​ 以.sql结尾的文件是数据库脚本文件

​ 先连接登录MySQL,然后执行如下命令:

source D:\software\mysql\MySQL入门篇\init01.sql
3.2表结构
desc 表名;-- 查看表的结构
select * from 表名;-- 查看表中的所有数据

ter教师表

列名 类型 含义
terno int 整数 教师编号
ename varchar 字符串 教师姓名
job varchar 字符串 工作、职位
mgr int 整数 领导(主任)的编号
hirdate date 日期 入职时间
sal double 小数 薪水、工资
comm int 整数 奖金
trgno int 整数 教研组编号

注:varchar :英文含义为可变长字符串

trg教研组表

列名 类型 含义
trgno int 整数 教研组编号
dname varchar 字符串 教研组名称
location varchar 字符串 教研组位置

salarygd工资等级表

列名 类型 含义
grade int 整数 等级编号
losalary int 整数 工资下限
hisalary int 整数 工资上限

reward奖金表

列名 类型 含义
ename varchar 字符串 教师姓名
job varchar 字符串 工作、职位
sal double 小数 薪水、工资
comm int 整数 奖金

四、查询操作

1.简介

1.1语法
select 列名1 别名1,列名2 别名2... from 表名;

示例

select ename from ter;-- 查看某一列
select ename,job,hiredate from ter;-- 查看某几列
select * from ter;-- 查看所有列
select ename 姓名,job 职位,hiredate 入职时间 from ter;-- 查看某几列,加别名
select terno,ename,sal "your salary" from ter;-- 别名中包含空格时,需要使用双引号引起来
1.2用法
  • 字符串连接concat()

    select concat('编号为',terno,'的教师,姓名为',ename,',职位为',job) from ter;
    
  • 四则运算+ - * %

    例:查询教师姓名及年薪

    select ename 姓名,sal*12 年薪 from ter;
    select ename 姓名,(sal+comm)*12 年薪 from ter;-- 有问题的
    select ename 姓名,(sal+ifnull(comm,0))*12 年薪 from ter;-- 使用ifnull()
    
    

    在MySQL中,NULL与任何值进行运算,结果都为NULL

  • 使用distinct去除重复列

    例:查询所有的职位

    select job from ter;
    select distinct job from ter;-- 去除重复列
    select distinct ename,job from ter;-- 在去除重复列时只有当所有列都相同时才能去除
    

2.限定查询

语法:

select 列名1 别名1,列名2 别名2... 
from 表名 
where 条件;
2.1比较运算符
> < >= <= = !=<>

例:查询工资大于1500的教师信息

select * from ter where sal>1500;

例:查询教师编号不是10281的教师信息

select * from ter where terno!=10281;

例:查询姓名是wanggang的教师编号、姓名、工资、入职时间

select terno,ename,sal,hiredate from ter where ename='wanggang';

注:字符串需使用引号引起来,同时MySQL中不区分大小写(Oracle区分大小写)

2.2 null或not null

例:查询每月可以获得的奖金的教师信息

select * from ter where comm is null;
select * from ter where comm is not null;

注:判断是否为null时使用的是is,不能使用比较运算符=

2.3 and

例:查询基本工资大于1000,并且可以获取奖金的教师姓名、工资、奖金

select ename,sal,comm from ter where sal>1000 and comm is not null;
2.4 or

例:查询教授语文工作,或工资大于等于2000的教师信息

select * from ter where job='yuwen' or sal>=2000;
2.5 not

例:查询教授非语文工作,并且工资不小于1500的教师编号、姓名、职位、工资、入职时间

select terno,ename,job,sal,hiredate from ter where job!='yuwen' and sal>=1500;
select terno,ename,job,sal,hiredate from ter where not(job='yuwen' and sal<1500);-- 有问题
select terno,ename,job,sal,hiredate from ter where (not job='yuwen') and (not sal<1500);-- 两个都not
2.6 between and

例:查询基本工资大于1500,但小于3000的教师信息

select * from ter where sal>1500 and sal<3000;-- 普通写法
select * from ter where sal between 1500 and 3000;-- between用法

注:between and包含临界值,between 小值 and 大值,顺序不能错

例:查询1998年入职的教师编号、姓名、入职时间、所在教研组编号

select terno,ename,hiredate,trgno from ter where hiredate between '1998-1-1' and '1998-12-31';
2.7 in 或not in

例:查询编号为10281、10282、10283的教师信息

select * from ter where terno=10281 or terno=10282 or terno=10283;-- 普通写法
select * from ter where terno in (10281,10282,10283);-- in写法

例:查询姓名为wanggang、lidehua、liaoming的教师编号、姓名、入职时间

select terno,ename,hiredate from ter where ename in('wanggang','lidehua','liaoming');
select terno,ename,hiredate from ter where ename not in('wanggang','lidehua','liaoming');-- not in 用法
2.8 like

用来进行模糊查询,需要结合通配符一起使用

常用通配符:

  • % 可以匹配任意长度字符
  • _ 只能匹配单个字符

例:查询教师姓名以Z开头的教师信息

select * from ter where ename like 'Z%';

例:查询教师姓名中包含L的教师信息

select * from ter where ename like '%L%';

例:查询教授语文工作,并且姓名长度为2个字符的教师信息

select * from ter where job='yuwen' and ename like '__';-- 2个下划线用法

例:查询1998年入职的教师编号、姓名、入职时间、所在教研组编号

select terno,ename,hiredate,trgno from ter where hiredate like '1998%';-- like用法

3.排序

3.1语法

语法:

select 列名1 别名1,列名2 别名2... 
from 表名 
where 条件
order by 排序列1 asc|desc,排序列2 asc|desc....;

默认按升序

3.2示例

例:查询所有教师信息,按工资由低到高排序

select * from ter order by sal asc;-- 排序默认为升序

例:查询教研组30的教师信息,按工资由高到低排序,如果工资相同,则按入职时间由早到晚排序

select * from ter where trgno=30 order by sal desc,hiredate asc;

例:查询教师编号、姓名、年薪,按年薪由高到低排序

select terno,ename,(sal+ifnull(comm,0))*12 income from ter order by income desc;-- income别名

五、多表查询

1.简介

​ 同时从多张表中查询数据,一般来说多张表之间会存在某种关系

2.基本用法

2.1语法
select 列名1 别名1,列名2 别名2... 
from 表名1 别名1,表名2 别名2.... 
where 条件
order by 排序列1 asc|desc,排序列2 asc|desc....;

例:将ter表和trg表进行多表查询(笛卡尔积)

select * from ter,trg;

通过将两张表的关联字段进行比较,去掉笛卡尔积,多表查询时一般都会存在某种关系

select * from ter,trg where ter.trgno=trg.trgno;
2.2示例

例:查询教师编号、教师姓名、工资、所在教研组名称及位置(等值连接)

select terno,ename,sal,dname,loc
from ter e,trg d
where e.trgno=d.trgno;

例:查询教师姓名、工资、入职时间、所在教研组编号、教研组名称

select e.ename,e.sal,e.hiredate,e.trgno,d.dname-- 两个列相同时,需指定表名
from ter e,trg d
where e.trgno=d.trgno;

注:如果多张表中出现同名的列,当查询时需要指定前缀,否则出现ambiguous模糊不清

例:查询教师姓名、教师工资、领导姓名、领导工资(自身连接)

select e.ename 教师姓名,e.sal 教师工资,m.ename 领导姓名,m.sal 领导工资
from ter e,ter m
where e.mgr=m.terno;

例:查询教师姓名、教师工资、教研组名称、领导姓名、领导工资

select e.ename 教师姓名,e.sal 教师工资,d.dname 教研组名称,m.ename 领导姓名,m.sal 领导工资
from ter e,trg d,ter m
where e.trgno=d.trgno and e.mgr=m.terno;

例:查询教师姓名、教师工资、教研组名称、工资所在等级(非等值连接)

select e.ename 教师姓名,e.sal 教师工资,d.dname 教研组名称,s.grade 工资等级
from ter e,trg d,salarygd s
where e.trgno=d.trgno and e.sal between s.losalary and s.hisalary order by 工资等级 desc;

例:查询教师姓名、教师工资、教研组名称、教师工资等级、领导姓名、领导工资、领导工资等级

select e.ename 教师姓名,e.sal 教师工资,d.dname 教研组名称,s.grade 教师工资等级,m.ename 领导姓名,m.sal 领导工资,sm.grade 领导工资等级
from ter e,trg d,salarygd s,ter m,salarygd sm
where e.trgno=d.trgno and e.sal between s.losalary and s.hisalary and m.sal between sm.losalary and sm.hisalary and e.mgr=m.terno;

3.内、外连接

3.1内连接

使用inner join…on

语法:

select 列名1 别名1,列名2 别名2... 
from 表名1 别名1 inner join 表名2 别名2 on 多表间的关联关系
where 条件
order by 排序列1 asc|desc,排序列2 asc|desc....;

例:查询教师编号、教师姓名、工资、教研组名称

select e.terno,e.ename,e.sal,d.dname
from ter e inner join trg d on e.trgno=d.trgno;

例:查询工资大于2500的教师姓名、工资、教研组名称、领导姓名

select e.ename,e.sal,d.dname,m.ename
from ter e inner join trg d on e.trgno=d.trgno inner join ter m on e.mgr=m.terno
where e.sal>2500;
select e.ename,e.sal,d.dname,m.ename
from ter e,trg d,ter m
where e.trgno=d.trgno and e.mgr=m.terno and e.sal>2500;
3.2外连接

分类:

  • 左外连接 left outer join …on,也称为左连接left join …on

    以左边的表作为主表,无论如何都会显示主表中的所有数据

    查询出的数据行为主表和副表并集

  • 右外连接right outer join …on,也称为右连接right join…on

    以右边的表作为主表,无论如何都会显示主表中的所有数据

    查询出的数据行为主表和副表并集

语法:

select 列名1 别名1,列名2 别名2... 
from 表名1 别名1 left join 表名2 别名2 on 多表间的关联关系
where 条件
order by 排序列1 asc|desc,排序列2 asc|desc....;

例:查询教师姓名、工资、领导姓名、领导工资

select e.ename,e.sal,m.ename,m.sal
from ter e,ter m
where e.mgr=m.terno;-- 有问题的

使用内连接

select e.ename,e.sal,m.ename,m.sal
from ter e inner join ter m on e.mgr=m.terno;-- 有问题的

使用外连接-左连接

例:查询教师姓名、工资、领导姓名、领导工资(有的教师没有领导)

select e.ename,e.sal,m.ename,m.sal
from ter e left join ter m on e.mgr=m.terno;

使用外连接-右连接

select e.ename,e.sal,m.ename,m.sal
from ter m right join ter e on e.mgr=m.terno;

例:查询教研组编号、教研组名称、教研组位置、教研组中教师姓名、工资

select d.trgno,d.dname,d.loc,e.ename,e.sal
from trg d left join ter e on d.trgno=e.trgno
order by d.trgno;

六、更新操作

1.insert

语法:

-- 语法1
insert into 表名 (列名2,列名2....) values (1,值2....);
-- 语法2:一次性插入多条数据
insert into 表名 (列名1,列名2...) values(1,值2...),(3,值4...),(5,值6....);
-- 语法3(注意)
insert into 表名 set 列名1=1,列名2=2,....;

示例:

insert into trg values (70,'数学组','北京');--如果是一次插入表中所有的列,此时可以省略列名(顺序和个数都要一致)

2.delete

语法:

delete from 表名 where 条件;

示例:

delete from trg where trgno=80;
delete from trg where dname='物理组';
-- 删除英语组所有工资高于5000的教师
delete from ter where sal>5000 and trgno=(select trgno from trg where dname='英语组');

注:delete from ter会删除整个表

3.update

语法:

update 表名 set 列名1=1,列名2=2...where 条件

示例:

update trg set dname='MARKET' where dname='语文组';
update ter set job='director',sal=8888,comm=666 where ename='wanggang';

七、事务处理

1.简介

ACID 是衡量事务的四个特性:

  • 原子性(Atomicity):事务是不可分割的工作单位,其中的操作要么都做,要么都不做
  • 一致性(Consistency):事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态
  • 隔离性(Isolation):事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰
  • 持久性(Durability):事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

2.事务操作

MySQL默认是自动提交事务的,将每一条语句都当作一个独立的事务执行,可

以通过autocommit关闭自动提交事务

查看autocommit模式:show variables like 'autocommit'

关闭自动提交:set autocommit=offset autocommit=0

手动提交事务:commit

手动回滚事务:rollback

你可能感兴趣的:(最新,SQL,Mysql,入门,数据库)