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:作为SQL的一个产品,是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,增加了速度并提高了灵活性。
特点:支持多种语言、开源,中小型网站一般都使用MySQL数据库
分平台:Windows、Linux、Mac
分版本:5.x 6.x 7.x 8.x
首先在mysql官网下载mysql,根据系统型号选择对应的包下载,这里选择的版本号为5.7.25
配置系统环境变量,桌面→我的电脑→右键"属性"→高级系统设置→环境变量→系统变量→新建
在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
管理员身份启动cmd ,命令如下: mysqld -install
命令: net start mysql
新版本初次安装好不需要密码可以直接进入,但是为了安全和方便还是需要密码的,需要设置,设置步骤参考如下:
1、cmd进入MySQL:mysql -u root -p;然后回车
2、set password=password(‘root’);//以设置root为例,如下图
语法:
mysql -u 用户名 -p 密码 -h 数据库服务器地址 -D 数据库名
注:安装MySQL以后,默认有一个管理员root
show databases;-- 查看当前所有数据库
use 数据库名; -- 切换数据库
show tables; -- 查看当前数据库中所有的表
select database();-- 显示当前操作的数据库
select user(); -- 显示当前登录的用户
information_schema、mysql、performance_schema这三个数据库为系统自带,不可动(其中mysql库是系统库,包含MySQL的相关系统信息,也不能修改)
以.sql结尾的文件是数据库脚本文件
先连接登录MySQL,然后执行如下命令:
source D:\software\mysql\MySQL入门篇\init01.sql
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 整数 | 奖金 |
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;-- 别名中包含空格时,需要使用双引号引起来
字符串连接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;-- 在去除重复列时只有当所有列都相同时才能去除
语法:
select 列名1 别名1,列名2 别名2...
from 表名
where 条件;
> < >= <= = !=或<>
例:查询工资大于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区分大小写)
例:查询每月可以获得的奖金的教师信息
select * from ter where comm is null;
select * from ter where comm is not null;
注:判断是否为null时使用的是is,不能使用比较运算符=
例:查询基本工资大于1000,并且可以获取奖金的教师姓名、工资、奖金
select ename,sal,comm from ter where sal>1000 and comm is not null;
例:查询教授语文工作,或工资大于等于2000的教师信息
select * from ter where job='yuwen' or sal>=2000;
例:查询教授非语文工作,并且工资不小于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
例:查询基本工资大于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';
例:查询编号为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 用法
用来进行模糊查询,需要结合通配符一起使用
常用通配符:
例:查询教师姓名以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用法
语法:
select 列名1 别名1,列名2 别名2...
from 表名
where 条件
order by 排序列1 asc|desc,排序列2 asc|desc....;
默认按升序
例:查询所有教师信息,按工资由低到高排序
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别名
同时从多张表中查询数据,一般来说多张表之间会存在某种关系
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;
例:查询教师编号、教师姓名、工资、所在教研组名称及位置(等值连接)
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;
使用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;
分类:
左外连接 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 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,'数学组','北京');--如果是一次插入表中所有的列,此时可以省略列名(顺序和个数都要一致)
语法:
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
会删除整个表
语法:
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';
ACID 是衡量事务的四个特性:
MySQL默认是自动提交事务的,将每一条语句都当作一个独立的事务执行,可
以通过autocommit关闭自动提交事务
查看autocommit模式:show variables like 'autocommit'
关闭自动提交:set autocommit=off
或set autocommit=0
手动提交事务:commit
手动回滚事务:rollback