下载vmware
- 需要专业版操作系统 MSDN下载系统
创建虚拟机
上网搜索试过好几个方法后不行
mysql介绍
1.介绍
1.1什么是数据库
数据库:database 按照数据结构来组织存储管理数据的仓库
数据库管理系统: 用来管理数据库的软件系统 常见的关系型数据库管理系统有MYSQL,Oracle、SQLserver、DB2、SysBase、access等
1.2什么是Mysql
Mysql是一个开源的关系型数据管理系统 瑞典的Mysql ab公司开发 后来被Oracle甲骨文公司收购 目前属于甲骨文公司
特点:体积小速度快成本低开源中小型网站都在使用
版本 企业版enter 社区办commu
2.安装
2.1版本
下载:MSDN
平台:LINUX WINDOWS MAC
版本 5.x 6.x 7.x 8.x
mysql一般安装在服务器上作为数据库服务器的系统软件存在
2.2 安装的位置
一路下一步默认C:PF mysql mysql版本号
bin文件夹是可执行文件
data数据库文件想到方式安装位隐藏目录,配置方式在首次安装服务自动产生,在安装目录下
my.ini 核心配置文件 my-default.ini 井号是没用
2.3 服务
安装mysql 会在操作系统添加一个mysql5x(版本号)的服务运行 services.msc
cmd netstat-an tcp3360是否打开
SQL数据查询核心
SQL数据查询核心
单表查询
数据源只有一个
select 查询的字段列表 别名
from 数据源
where 条件
group by 分组字段
having 分组条件
多表查询 数据源多于一个
连接查询(①自然连接 ②内连接 ③外连接(左连接left join、右连接rightjoin、全连接full join1---笛卡尔集))
实体:客观存在的并且可以相互区别的事物
原理与概念
选择:从原表(关系)中选择符合条件的行(元组 记录)
投影:从原表(关系)中选择符合符合条件的列(属性 字段)
连接:去掉重复属性的等值(连接条件)相连
自连接(员工、领导)
主子查询
二、基本操作
1.连接mysq
语法 mysql -u 用户名 -p密码 -h 数据库服务器地址 -d 数据库名
mysql -u root(用户名) -p 密码root
安装mysql后默认一个管理员root
cmd:cd bin文件夹目录
select version(); 指令要以分号结尾
查看数据库和表
shwo databases(); 查看当前所有数据库 指令要以分号结尾
select version(); 查看mysql版本
select user(); 查看当前登录的用户
exit; 退出 输入后显示bye 再exit关掉
高级 系统环境变量 目录添加bin
drop database 库名; 删除数据库 infromation schema 和perfor……是自带库 不能删
if exists 可选参数
create databese 库名; 新建库[库选项]
show create database 库名; 查看库创建时的信息
存放在 programdata mysql mysql版本号 data 库名
use 数据库名; 切换数据库
show tables; 查看当前数据库所有表
row行
crud 用户管理
source init.sql
到
导入数据 以sql结尾的文件是数据库脚本文件 先登录mysql执行
source 路径:\init.sql
表结构和表记录
desc class ←查看表的结构 字段名field 数据类89/*型type 允许空值 NULL--表示(空值):不确定的值
键key 默认值default
select * from class;空格 --注释 查看表结构
雇员表
列名(字段名) 类型 定义
empno int整数 雇员编号
ename varchar(10)字符串 雇员姓名
job varchar(9) 工作职位
mgr int整数 上司/直属领导
hiredate date(日期型) 入职时间
sal double小数类型 薪水工资
comm int整数 奖金
deptno 部门编号 部门编号
dept部门表
列名(字段名) 类型 定义
deptno int 部门编号
dname varchar(14) 部门名称
loc varchar(13) 部门位置
salgrade工资等级表
列名(字段名) 类型 定义
grade int 等级
losal int 最低工资
hisal int 最高工资
奖金表
列名(字段名) 类型 定义
三、sql
SQL structured query language 结构化查询语言,用来对数据库进行查询,更新和管理的一种语言
包含三个部分
DML
Data manipulation language 数据操纵语言
用于检索或更新数据库:insert、delete、update、select 增删改查。
DDL
data definationlanguage 数据定义语言
用于定义数据的结构:create、alter、drop 创建修改删除
DCL
data control language 数据控制语言
用于定义数据库用户的权限 grant授权 revoke取消授权
四、表和库的管理
1.数据类型
整数类型:smallint短整型int普通整型 bigint长整型
小数:float、double
日期类型:date、time、datetime、timestamp
字符串varchar、char
其他:clob 存储文本的大数据 blob存储二进制大数据(图片声音)
2.创建表
语法:
creatle table 表名
(
字段名1 数据类型 特征,
字段名2 数据类型 特征,
……
字段名n 数据类型 特征
)charset=utf8;
实例:
··前置操作
create database Testl; --新建test数据库
use Test; --切换至test数据库下
--本次操作
create table user
(
id int,
username varchar(10),
password varchar(50)
);
实例2:
create table t_student;
(
id int primary key auto_increment, --将id设置为主键,自动增长默认从1开始
name varchar(10) not null, 设置姓名字段不虚为空置
age int,
sex varchar(10) not null default 'female', --设置性别不允许位空置 切默认值为female
addredd varchar(100),
height double,
birthday date
)char-utf8;
补充:
查看表记录 :select * from 表名;
查看表结构 desc 表名;
插入表记录
insert into t_student(name,age,sex,birthday,height) values('liudehua',18,'male','1999-10-19',173.8);
insert into t_student(name,age,sex) values('gaoqiqiang',20,'male');
3.修改表
添加字段
语法
alter table 表名 add 列名 数据类型
实例
alter table t_student add weight double;
修改猎的类型
语法
alter table 表明 modify 列名 数据类型
实例
alter table t_student modify name varchar(250);
修改列名
语法
alter table 表名 change 原列名 新列名 数据类型
实例
alter table t_student change sex gender varchar(10);.
删除猎
语法
alter table 表明 drop 列名uuuu与uuuuu
实例
alter table t_student drop weight;
修改表明
语法
alter table 原表明 rename 新表明
或
alter table 原表明 to 新表明
实例
alter table t_student rename student;
alter table student to t_student;
项目四
三级模式 外模式
内模式:抽象
用户模式
导入初始数据
启动mysql
show databases
drop databases if exists test
create database if not exists test charset utf8
source 文件路径
五、查询操作
1.简介
1.1 语法
select 列名1 别名1,列名2 别名2,……,列名n 别名n from 表名;
实例
查询雇员表emp中雇员姓名
select ename 姓名 from emp;
查询雇员的姓名、职位、入职时间i7y7y
select ename,job,hiredate from emp;
查询雇员表中所有雇员信息
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;
select
from emp; -- 表示所有字段
结果显示为"7369smith,you salary$800"
select empno,smith,sal "yoursalary"
补充
投影:从关系中选择符合条件的列 关系就是二维表表就是关系
用pi表示 选择用sigma
查看表结构 desc
1.2 yongfa
字符串连接concat()
编号为7369雇员姓名smith 只为clerk
concat(
"编号为",empno,“的雇员,姓名为”,ename,",职位为",job) from emp;
四则运算加减乘除
例查询雇员的姓名和年薪
select ename 雇员姓名,sal*12 年薪 from emp;
select ename 雇员姓名,(sal+comm)*12 年薪 from emp; --有问题
select name 雇员姓名,(sal+ifnull(comm,0))*12 年薪 from emp;
在mysq null与任何数计算结果都未null
去掉重复列distincut
例在emp查询所有只为信息
select distinct job from emp;
select ename,job from emp; --使用distinct去掉重复列时只有当所有列都相同时才能去除
2.限定查询
选择:从关系中选择符合条件的行
语法
select 列名1 as 别名1,列名2 as 别名2,……,列名n as 别名n
from 表明
where 条件;
2.1 比较运算符
大于小于大于等于小于等于等于不等于
例:
查询工资大于1500雇员信息
select * from emp where sal>1500;
查询不是7369编号的雇员信息
select * from emp where empno!=7369;
查询姓名是smith的编号姓名工资入职时间
select empno,ename,sal,hiredate from emp where ename=“smith”
注:字符串要使用双撇号括起来,同时mysq不区分大小写
2.2 null或not null空值查询
例:查询没有奖金的雇员信息
select *
from emp
where comm is not null;
2.3 and
定义 并且
查询基本工资大于1000 并且可以获取奖金的员工 雇员姓名工资和奖金
select ename 姓名,sal as 工资,comm as 奖金
from emp
where sal>1000 and sal is not null;
2.4 or
含义:或者
例:查询从事销售工作 或工资大于等于2000的雇员信息
select *
from emp
where job='salesman' or sal>=2000;
2.5 not
含义 非、取反
例: 从事非销售工作并且工资小于1500的雇员的编号姓名职位工资和入职时间
select ename
from emp
where job not (job='salesman') and not (sal>=1500);
2.6 between…and…
含义:在xx与xx之间
例:查询基本工资大于1500但小于3000的雇员信息
select * from emp where sal between 1500 and 2999;
提示:between and包含临界值
例:查询1981入职的雇员编号 姓名 入职时间 所在部门编号
select empno,ename,hiredate,deptno from emp where
hiredate >='1981-1-1' and hiredate <='1981-12-31';
或
hiredate between '1981-1-1' and '1981-12-31';
注:日期必须用定界符(单撇号,双撇号)括起来"
2.7 in或not in
含义:属于 不属于
栗:查询雇员编号为7369、7499、7788的雇员信息
select *
from emp where empno in (7369,7499,7788);
查询姓名为 smith allen king的雇员的编号姓名入职时间
select empno,ename,hiredate
from emp
where ename in ('smith','allen','king');
2.8 like
模糊查询 用来实现模糊查询,需要结合通配符一起使用
常用通配符
%:可以匹配任意长度的字符
_(下划线):可以匹配任意,只能单个字符
例:查询雇员姓名以S开头的雇员信息
select * from emp where ename like 's%';
查询雇员姓名中包含m的雇员信息
select * from emp where ename like '%m%';
例:查询从事销售工作的并且姓名长度为4个字符的雇员信息
sele * from emp where ename like '____'
查询1981入职的雇员姓名入职时间素数部门的编号
select ename,hiredate,deptno from emp
where hiredate like '1981%';
3.排序
3.1 语法
select 列名1 别名1; 列名2 别名2,……
from 表明
where 条件
order by 排序字段1 asc或desc,排序字段2 asc或desc;
asc表示升序 desc表示降序
3.2 实例
例:查询所有雇员信息,按工资由低到高顺序进行排列
select * from emp order by sal;
例:查询部门编号为10的雇员信息按工资从低到高排序,工资相同则按入职时间排序
select * from emp where deptno=10 order by sal desc,hiredate asc;
粒:查询 雇员编号、姓名、年薪并按年薪从高到低排序
select empno as 雇员编号,ename as 姓名,(sal+ifnull(comm,0))*12 as 年薪
from emp order by 年薪;
六、多表查询
1.简介
同时从多张表中查询数据,一般来说多张表之间都会存在某种关系。(一对一、一对多、多对多)
将去掉重复属性的数值相连
2.基本用法
2.1 语法
select 列名1 as 别名1,列名2 as 别名2,……
from 表明1 别名1,标明2 别名2,……
where 条件
order by 排序字段1 asc|desc,排序字段2 asc|desc,……;
例:将emp表和dept表进行多表查询(笛卡尔集)
select * from emp,dept;
通过将两张表的关联字段进行比较,去掉笛卡尔积,多表查询时一般都会存在某种关系(公共字段值等)
select * from emp,dept,where emp.deptno=dept.deptno;
2.2实例
例:查询雇员编号雇员姓名工资所在部门名称和位置
select empno,ename,sal,dname,loc
from emp e,dept d
where emp.deptno=dept.deptno;/e.deptno=d.deptno]]
例:查询 雇员姓名入职时间工资
select ename,sal,hiredate,dept.deptno,dname
from emp,dept
where emp.deptno=deptno;
select e.ename,e.sal,e.hiredate,d.deptno,d.dname
from emp e,dept d
where emp.deptno=deptno;
例 查询雇员姓名雇员工资 领导姓名领导工资(自连接查询)
select e.ename 雇员姓名,e.sal 雇员工资,m.ename 领导姓名,m.sal 领到工资
from emp e,emp m
where e.mgr=m.empno;
查询雇员姓名 雇员工资 部门名称 领导姓名 领到工资
select e.ename,e.sal,d.dname,m.ename,m.sal
from emp e,dept d,emp m
where e.mgr=m.empno and e.deptno=d.deptno;
例:雇员姓雇员工资 部门名称 工资所在等级(非等值链接查询)
select ename,dname,grade
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between lowsal and highsal| sal>=lowsal and sal<=highsal;
例:查询雇员姓名,雇员工资,部门名称,雇员工资等级、领导工资等级
select ename,sal,d.dname,grade
from emp e,dept d,emp m,grade
where
3.SQL99标准
3.1简介
SQL99标准也称为SQL1999标准,是1999年指定的,分为内连接、外连接两种
3.2 内连接
使用inner join … on
语法
select 列名1 as 别名1,列名2 as 别名2 ……
from 表明1 别名1 inner join 标明2 别名2 on 多表之间的连接条件 连接条件=公共字段值相等
where 查询条件
order by 排序字段
例:查询雇员编号雇员姓名工资、部门名称
方法1 sql99标准
select e.ename,e.empno,e.sal,d.deptno
from emp e inner join dept d on e.deptno=d.deptno;
方法2 自然连接
select e.empno,e.ename,e.sal d.dname
from emp e,dept d
where e.deptno=d.deptno;
例:多表 查询工资大于1500的雇员的姓名工资部门名称和领导姓名
select e.ename,e.sal,d.dname,m.ename
from emp e inner join dept d on e.deptno=d.deptno inner join emp m on e.mgr=m.empno
where e.sal>1500;
inner left right(外连接)
3.3 外连接
分类
左外连接 left outer join ... on 也称为左连接
以左连的表为主表,无论如何都会显示主表中的所有数据
右外连接 right outer join ... on 也称为右连接
以右连的表为主表,无论如何都会显示d主表中的所有数据
语法
select 列名1 别名1,列名2 别名2……
from 表名1 别名1 left|right|inner join 表名2 别名2 on 多表之间的连接条件
where 查询条件
order by 排序字段 asc|desc ,排序字段2 asc|desc
例 查询雇员姓名 工资 领导姓名 领到工资
select e.ename 雇员姓名,e.sal 雇员工资,m.ename 领导姓名,m.sal 领到工资
from emp e left join emp m on e.mgr=m.empno;
右边某条查询与左边不一样时,显示为空值
select e.ename 雇员姓名,e.sal 雇员工资,m.ename 领导姓名,m.sal 领到工资
from emp e right join emp m on e.mgr=m.empno;
查询部门编号名称位置 部门内雇员名称 工资
select d.deptno 部门编号,d.dname 部门名称,d.loc 部门位置,e.ename 姓名,e.sal 工资
from
dept d left join emp e on d.deptno=e.deptno;
七、聚合函数和分组查询
1.聚合函数
聚合函数也称为统计函数
常用函数有
count()统计个数
max()最大
min()最小
sum()求和
avg()平均数=
round四舍五入函数
例查询部门为30员工总人数
select count(empno) 总人数
from emp
where deptno=30;
查询雇员表工资最高
select max(sal) form emp;
查询部门编号30的员工最高最低平均工资
select max(sal),min(sal),avg(sal) from emp
2.分组查询
2.1 语法格式
select 列名1 别名1,列名2 别名2,
from 表明1 别名1 join 表明2 别名2,……on 多表之间的连接条件 join 表明3 别名3 on 连接条件
where 查询条件
group by 分组字段
having 分组条件
order by 排序字段1 asc|desc,排序字段2 asc|desc……;
使用分组查询的条件有2个:
1.查询中出现了每个、各个、按年度、按季度等字眼,或此类意思,每个“谁”就group by“谁”
2.查询结果又最大最小平均计数求和这五种聚合函数字段
分组查询时,分组统计问题
2.2实例
查询每个部门平均工资
select deptno 部门编号,round(avg(sal),2) 平均工资
from emp
group by deptno;
联系 查询部门名称和每个部门平均工资
select d.dname 部门名称,round(avg(e.sal),2) 平均工资
from dept d,emp e
where d.deptno=deptno
group by e.deptno;
或
select d.dname 部门名称,round(avg(e.sal),2) 平均工资
from dept d left join emp e on d.deptno=e.deptno
group by d.deptno;
注:
在mysql分组查询时可以查询出分组字段以外的其他字段而oralce是不行的
建议查询中指定分组字段3
例:查询部门名称和每个不么员工数量
select d.dname 部门名称,count(enpno)
from dept d left join emp on d.deptno=e.deptno
group by d.dname
例:查询平均工资大于2000的部门编号和平均工资
select d.deptno,round(avg(e.sal),2)
from emp e,dept d
group by e.deptno
having round(avg(e.sal),2)>2000
例:查询出非销售人员的职位名称,以及从事统一工作的雇员的月工资总和,并且满足工资综合大于5000,查询的结果按月工资总和的升序进行排列
select job 职位,sum(sal) as 工资总和
from emp
where job!='salsman'
group by job
having order by 工资总和;
例:查询部门平均工资的最大值:
select max(avg(sal))
from emp
group by deptno;
错误 mysql不支持聚合函数的嵌套
注:再mysql中聚合函数不能嵌套使用,而oracle是可以的
select max(temp.平均工资)
from(select avg(sal) as 平均工资 from emp group by deptno) temp;
八、子查询
1.简介
一个查询中嵌套另一个查询称为子查询
子查询必须放在小括号中
子查询可以出现在任意位置,如select from where having等
2.语法格式
select (子查询)
from (子查询) 别名
where (子查询)
group by 分组字段
having (子查询)
2.2 例
查询工资比no.7566多的雇员信息
使用多表查询的做法
select el.*,e2.empno,e2.sal
from emp e1,emp e2
where e2.empno=7566 and el.sal>e2.sal;
子查询
select * from emp where sal >
(select sal from emp where empno=7566);
例:查询工资比部门30员工的工资高的雇员信息。
select * from emp where sal>
(select sal from emp where deptno=30) 错误的
将子查询与比较运算法一起使用时,必须保证子查询返回的结果不能多余一个
例:查询雇员编号、姓名、部门名称
连接查询
select empno,ename,dname from emp e,dept d where e.deptno=d.deptno;
子查询
select empno,ename,(select dname from dept where deptno=e.deptno)
from emp e;
总结
一般来说多表连接查询可以使用子查询替换,但是有的子查询不能使用多表连接来替换。
子查询的特点:灵活、方便,一般作为增删改查操作的条件,适合用于操作一个表的数据
多表连接查询更适合用于查看表中数据
3.子查询分类
可以分为三大类
1.单列子查询:表示返回单行单列,使用频率较高
2.多行子查询:返回多行单列,
3.多列子查询:返回单行多列或多行多
3.1 单列子查询
例:查询工资比7564高,同时与7900从事相同工作的雇员信息
select *
from emp
where sal>(select sal from emp where empno=7564)
or job=(select job from emp where empno=7900);
例 查询工资最低雇员姓名工作工资
select ename,job,salselect min(sal) from emp;
--查询工资是800的员工姓名职位与工资
select ename,job,sal
from emp
where sal=(select min(sal) from emp);
练习 查询工资高于平均工资的雇员信息
select *
from emp
where sal>(select avg(sal) from emp);
查询每个部门的编号和最低工资,要求最低工资大于等于部门为30的最低工资
select deptno,min(sal)
from emp
group by deptno
having min(sal)>=(select min(sal) from emp where deptno=30);
查询部门名称、部门的员工数、部门的平均工资,部门的最低收入和雇员的姓名
--拆分
select deptno,count(empno),avg(sal),min(sal)
from emp
group by deptno;
select (select dname from dept where deptno=e.deptno) as dname,
count(empno),avg(sal),min(sal),(select ename from emp where sal=min(e.sal)) as ename
from emp e
group by deptno;
select d.dname,t.count,t.avg,e.ename
from (select deptno,count(empno) as count,avg(sal) as avg,min(sal) as min
from emp group by deptno) t,dept d,emp e
where d.deptno=t.deptno and e.sal=t.min;
查询平均工资最低的工作和平均工资
--先拆分
select min(t.avg)
from select avg(sal) as avg from emp group by job) t;
select job,avg(sal)
from emp
group by job
having avg(sal)=(select min(t.avg)
from (select avg(sal) as avg from emp group by job) t);
3.2 多行子查询
对于多行子查询 可以使用如下三种操作符bytuuy
·in
例:查询所在部门编号大于等于20的雇员信息
select * from emp where deptno>=20
select * from emp where deptno in(select deptno from emp where deptno>=20);
例:查询工资与部门20任意员工相同的雇员信息
select * from emp where sal in (select sal from emp where deptno=20);
·any more
三种用法
>any:只要比子查询中最小的值大就可以
=any:与任意一个相同,此时与in操作符功能是相同的
select * from emp where sal >any (select sal from emp where deptno=20);
·all
>all 比子查询结果中最大的值要打
select * from emp where sal
3.3 多列子查询
多列子查询一般出现在from子句中,作为查询结果的集合
例:在所从事销售工作的雇员中找出工资大于1500的员工
select * from (select * from emp where job='salesman') t
where t.sal>1500;
与select * from emp where sal>1500 and job='salesman';相同44484444448
九 分页查询
1.limit关键字
用来限制查询返回的记录数
语法:
select 列名1 别名1,列名2 别名2,……
from 标明1 别名1 join 表明2 别名2 on 多表连接条件
where 分组前的条件
group by 分组字段
having 分组后的条件
order by 排序字段1 asc|desc ,排序字段2 asc|desc 默认升序
limit [参数1,]参数2
可以接收一个或两个数字:
参数1用来指定起始行的索引,索引默认从0开始,即第一行的索引的标记为0
参数2用来指定返回的记录数量
例:查询工资最高前三雇员信息
select * from emp order by sal desc limit 0,3;如果省略参数1,则默认参数1的值为0,即从第0条开始数三条记录
查询工资大于1000的第4-8个用户
select * from emp where sal>1000 limit 3,5;(从3开始向后数五个用户)
2.分页
例:每页显示四条(pagesize,每页有多少条记录)显示第三页的内容(pageindex页码)
select * from emp limit (pageindex-1)*pagesize,pagesize 语法←
select * from emp limit(3-1)*4,4 计算页码,每页有多少条记录,不能直接执行。
注意:
在mysql中limit后面的参数不能包含任何运算,实际开发中都是在编程语言中进行计算,然后将结果发送给数据库来执行。
sql执行顺序
1.from 2.join
3.on 4.where 5.group by(开始使用select中的别名,后面的语句中都可以使用)
6.avg,sum…(复合函数)7.having 8.select
9.distinct 10.order by 11.limit
十、常用函数
1.字符串函数
concat(s1,s2……)功能:把多个字符串连接在一起
select concat ('aa,'bb','cc') as result from dual --dual是系统的意思一般测试时使用,无实际意义。
select concat('编号为',empno'的员工,姓名为',ename) from emp;
常量 字段变量 常量 字段变量
注:dual表是mysql提供的一个虚拟表,主要是为了满足select from的语法习惯,一般测试时使用,无实际意义。
lower(s)功能:将字符串s中的字符转化为小写字母
select lower('Hello World')from dual;
upper(s)功:将字符串s中的字符转换为大写字母,
select upper('hello World') from dual;
length(s)功能:表示获取字符串S的长度或是测试S中字符串的长度
select length('hello world') from dual;
reverse(s)功能:将字符串s中的内容反转
select reverse('hello world') from dual;
trim(s) :去除字符串两边的空格
ltrim 去掉左边的空格
rtrim去掉右边的空额
replace(s,s1,s2) :将字符串s中的s1替换为s2
select replace('hello world','o'.'eee') from dual;
lpad(s,len,s1) ::在字符串s的左边使用s1进行填充,知道长度为len为止
rpad(s,len,s1):右边
repeat(s,n):将字符串s重复n次后返回。
substr(s,i,len):表示从字符串的第i个位置开始取len个字符
2. 数值函数
ceil(n)返回大于n的最小整数
floor(n)返回小于n的最大整数
round(n,y)对n进行四舍五入,保留y位小数
turncate(n,y) 对n保留y位小数,不进行四舍五入 阶段函数
rand()返回0-1之间的随机数 该函数没有参数
abs(x)球x的绝对值
mod 球余数
ceil ceilin 两个函数相同功能,返回不小于参数的最小整数,即向上取值
3.日期和时间函数
new()返回当前日期时间 select now() from dual;
curdate() 返回当前日期 select curdate() from dual;
curtime() 返回当前时间
year(日期)返回指定日期的年 select year('2025-4-22') from dual;
month(日期)返回指定日期的月
day(日期)返回指定日期的日
timestampdiff(间隔类型,日期,时间1,日期时间2)返回两个日期时间之间相隔的时间戳,单位由间隔类型来指定的interval间隔类型:year month day hour minute second
select tiemstampdiff(day,'2000-10-23','2025-4-22')
date_formate(date,pattern) 格式化日期 select data_format(now(),'%Y%m%D %h:%min:%s' from) dual
格式化参数
%Y表示四位数字的年
%m表示两位数字的约
%d表示两位数字的日
%h表示两位数字的小时。24小时制
%min表示两位数字的分钟
%s表示两位数字的喵
4. 流程控制函数
if(条件,表达式1,表达式2) 如果条件为真,则返回表达式1;否则返回表达式2
select if(5>2,'yes','no') from dual
ifnull(v1,v2)如果v1部位null则返回v1,否则返回v2
ifnull(null,'0') from dual
case when f1 then v1 when f2 then v2...else v end 如果f1位真 则返回v1如果v2位真则返回v2 否则返回V
select case when 5>2 then 'yes' end from dual;
select case when 5>2 then 'yes' else 'no' end from dual;
5.系统信息函数
database() 返回当前操作的数据库
user()返回当前登录用户 select user()
version() 返回mysql服务器的版本
十一、数据操纵
1.insert
语法:
格式1:insert into 表名(列名1,列名2,...)values(值1,值2...);
格式2:insert into 表名(列名1,列名2,...) values(值1,值2,...),(值1,值2...)...;
实例:,l
insert into dept(deptno,dname,loc)...
-> value(50,'市场部','南京');
insert into dept values(60,'开发部','上海')
如果给表中全部列增加字段,则可以省略列名,顺序也可以乱
insert into dept(deptno,dname,loc) values(1,'aaa','bbb'),(2,'aaa','bbb');
2.delete
语法:
delect from 表名 where 条件;
实例
删除dept中部门编号为10的部门信息
delete from dept where deptno=10;
练习 删除市场部中所有工资高于5000的员工信息
select deptno from dept where dname='sales';
delect from emp
where deptno=(select deptno from dept where dname='sales')
and sal>5000
注:delect from emp 将表中所有数据都删除
3.update
语法
update 表名 set 列名1=值1,列名2=值2……where 条件;
实例
将dept表中部门名称为market的字段值修该为市场部
update dept set dname='市场部' where dname='market';09
update emp set job='manager',sal=8888,comm=666 where ename='smith';
十二、约束
1.简介
constraint约束是对表中数据的一种限制,以保证数据的 完整性和有效性。
2.约束的分类
有五种
- 主键约束 primary key
用来唯一事实表的每一条记录(数据),以此保证数据的实体完整性,该字段的值不能为空且不能重复。如学生表中的学生号,雇员表中的雇员号等。
- 唯一约束unique
不允许出现重复值
- 检查约束check
也叫用户自定义的约束,判断表中的数据是否符合指定的条件 如年龄在18~30之间性别只能取男或女
- 非空约束not null
设置某个字段不能为null值(null不是空字符串,不是空格,不是0)
- 外键约束foreign key
用来约束两个表之间的关联关系
3 添加约束
1.在创建表时添加约束
例
--约束没有名称
create table student --创建学生表
(
id int primarye key, --主键约束
name varchar(20) not null, --非空约束
age int check(agc>=18 and age<=30), --检查约束
sex varchar(8) not null check (sex='male' or sex='female'),--非空约束
idcard varchar(18) unique,- ---唯一约束
class_id int, --班级编号,外键
foreign key (class_id reference class(c_id)) --外键约束,引用父表的主键
);
create table class
(
c_id int primary key, --班级id 主键
c_name varchar(20) not null, --班级名称 非空约束
c_info varchar(100) --班级的说明
);
2.在创建表后添加约束;
EXTRA
ipconfig 查看自己的ip地址 ping同桌计算机的ip地址
十三、用户和权限管理
1.mysql用户登录的过程和管理mysql用户
mysql用户存储在mysql数据库中的user表中,该表在mysql服务启动时自动加载到内存,控制用户的登录
查看当前连接的mysql用户↓
select user(); --查看当前连接数据库的用户 use mysql; --切换到mysql数据库 select user,host from user; --查看mysql用户 -- 创建一个mysql用户账户 create user dingzhen@'localhost' -- 为新建的本地用户修改密码 alter user dingzhen@'localhost' identified by 'mima'; -- 为新建的用户授予权限 grant all privileges on *.* to dingzhen@'localhost' with grant option;
create user dingzhen;--创建用户 select user,host from user;
主机可以使用通配符,规则和标准的sql语法中定义的完全相同
%表示任意长度的字符 _表示一位任意字符
设置hector@'localhost'的密码为'abc..123'
2. mysql 远程访问数据库的设置
设置root用户来远程登录
mysql -u root -p
use mysql;
select host,user from user where user='root';
create user 'root'@'10.5.89.%' identified by 'root'; 创建用户 by前后是密码uuuuuuuuuuuuuuuuuuuuu
grant all privileges on
. to 'root'@'10.5.89.%' with grant option;
3.创建用户并授予权限
grant 权限列表 on 数据库名.表名 投用户名@来源地址 identified by '密码';
实例
grant select on test.emp to
tom@localhost identified by '123';
grant select on test.* to
tom@localhost identified by 'abc..123';
grant select update on test.* to 'tom'@'localhost' identified by '114514';
grant delete on test.* to 'tom'@'localhost' identified by 'abc..123++0'
4.查看用户权限
show grants for '用户名'@'来源地址' --查看指定用户的权限
show grants; 查看自己的权限
5. 撤销权限
语法
revoke 权限列表 on 数据库名.表名 from 用户名@来源地址
实例
revoke all privileges on
. from 'hector'@'10.10.10.10';
6.删除用户
语法
use mysql;
delete from user where user='用户名'
flush privileges;
sql乱码
2.预备知识
字符 character eg:abcd 1234
字符集合:charset 一组字符
字符序:字符的排序规则 一个字符集可以有多个排序规则即多个字符序
以_ci结尾 大小写不敏感,不区分大小写
以_cs结尾,大小写敏感,区分大小写。
3. 常见的字符集
- ASCII字符集 控制字符不能打印和可打印的字符
- 扩展ascii字符集合(8bit)希腊字母 latin1 latin2--8位二进制 包括ascii字符集中的全部字符
- GB 2312 BIG5 GBK 16位二进制 ----2byte二进制
- unicode字符集 全球语言 16位二进制
unicode编码 一个字符2个字节
utf8 一个英文字符占一个字节 一个中文字符占三个字节
utf8mb3 utf8mb4 MB=morebit,MBx=支持x个字节
对于某个字符的utf8编码 如果只有一个字节则其最高位二进制位为0;如果是多字节 其第一个字符从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均已10开头,utf8最高可以用到6个字节。t
刘 1110 0101 1000 1000 1001 1010 E58896
- GB2312 简体中文
- BIG5 繁体中文
- GBK 包括简体和繁体中文
语法
show character set; --查看mysql支持的字符集 show variables like 'character_set_%'; --查看当前mysql使用的字符集;
- character_set_client 客户端字符集
- character_set_connection 连接字符集
- character_set_database 数据库字符集
- character_set_results 返回结果的字符集
- character_set_server 服务器字符集
- character_set_system 系统字符集
创建数据库时,如果没有指定数据库的字符集,则会使用服务器的字符集
创建表时,如果没有指定表的字符集,则会使用数据库的字符集
创建表中字段时,如果没有指定字段的字符集,则会使用表的字符集。
5.管理mysql客户端和服务器端的字符集
6.设置mysql字符集
6.1 查看服务器和客户端字符集
6.2 修改mysql默认字符集
- 临时修改
set names 字符集名称; --临时修改 -- 提示:这个方法可以临时修改三个字符集↓ -- character_set_client -- character_set_connection -- character_set_results set character_set_database=utf8; 使用此方法分别修改也可以
- 永久修改 修改配置文件
windows my.ini
linux my.cnf
修改配置文件后必须重启mysql服务
7.指定数据库以及表和字段的字符集
7.1 创建数据库时指定数据库的默认字符集
create database db default charset latin1;
7.2 创建表时指定表的默认字符集
create table student(sid int,sname char(30)) dfault charset utf8;
7.3 创建列(字段)时指定列的字符集
create table student1(sid int,sname char(30),address char(20) character setlatin1) default charset utf8;
8. 修改数据库表和列的字符集
8.1 修改数据库的字符集
alter database db character set 'utf8';
10.字符集兼容性
utf8兼容latin1 gbk兼容utf8 更该数据库字段字符集 latin1可以正常转换为utf8 utf8转换为latin1汉字变为??
mysql数据库存储引擎
1.mysql支持的数据库存储引擎
- InnoDB 支持事务 支持主键 必学
- MylSAM 不支持事务 不支持主键 查询速度快 实例:适用于新闻网站
- MEMORY 不支持事务 读写速度快 主要用于网站会话缓存
- meger 不支持事务,,
修改配置文件
修改表的默认存储引擎
alter table student engine=mylsam;
查看服务器和客户端你的默认字符集
show variables like 'character_set_%';
修改mysql默认字符集
- 临时修改
set names 字符集名称 ;--临时修改 --此方法可以临时修改 client connection results三个字符集 set charachet_set_database=utf8;-- 使用此方法分别修改也可以
- 永久修改 修改配置文件
windows my.ini linux my.cnf 修改之后必须重启mysql服务青梅,
十四 事务处理
1.简介
transaction
事务处理是用来保证数据操作的完整性
一个业务室由若干个一次性操作来组成的,这些操作要么都成功,要么都失败,如银行转账。
事务特性ACID
- 原子性(Atomicity):不可再分
- 一致性(consistency):要保证数据湖前后的一致性
- 隔离性(Isolation):两个事务的操作互不干扰
- 持久性(Duraility):一旦事务提交不可回滚
2.事务操作
mysql默认是自动提交事务的,将每一条语句都当做一个独立的事务执行,可以通过autocommit关闭自动提交事务
查看autocommit模式:
show variables like 'autocommit'
关闭自动 提交
set autocommit=off 或 set autocommit=0
手动提交事务 commit
手动回滚事务 rollback
用户数据是存放在数据库里的,以表的形式存放用户数据
索引
用来提高查询速度
是针对一个表一表列为基础建立的数据库对象,保存着排序中的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序
可以极大提高数据检索速度
通过长剑唯一索引可以保证数据记录唯一性
在使用orderby和groupby字句进行检索数据时可以显著减少分组和排序的时间
使用索引可以在数据检索过程中使用优化隐藏器
优点:加快查询速度
缺点:提高了查询速度,降低了表的更新速度
索引分类
1.普通索引 关键字KEY 和INDEX
2.唯一索引:关键字UNIQUE
3.主键索引:primary key
4.全文索引:FULLTEXT 特定情况下才会使用,只有myISAM支持
5.单列索引:某一个字段进行普通索引,也可以是唯一索引还可以是全文索引
6.多列索:如将姓名和性别合起来做了一个索引。也叫1组合索引
ADD INDEX 自定义索引名(classno,classname) 增加多列索引
增加普通索引
CREATE INDEX 自定义索引名
on 表名(字段名)
视图
试图是虚拟的表,是从数据库中一个或多个表中导出来的表,试图还可以从已经存在的视图的基础上定义。雨包含数据的表不一样,质保函使用时动态检索数据的查询
视图还可以再创造视图
视图的作用:简单 安全 逻辑数据的独立性
create view 试图名 AS select from 表名 where 条件;(同查询) 然后 select * from 视图名 举例 create view vw_stu AS SELECT * from tstudent WHERE Class='java开发' 新建试图表 select * from vw_stu //生成的视图可以当做表来使用,但是生成的vwstu是个虚拟表
select * from biaomin_views
通过视图更新数据
通过视图插入更新删除表中的数据。因为视图是一个虚拟表,表中没有数据,通过视图更新时都会转入基本表进行更新的,如果对试图增加或是删除记录,实际上是对基本表进行增加和删除记录。
使用show createview 不仅可以查看创建视图时的定义语句,还可以查看视图的字符集
describe 试图名 --删除视图
alter view 视图名 as 修改
create or replacce view 视图名 as (SQL语句)
update 视图名 set ……
触发器
创建触发器
CREATE TRIGGER autoTimeAndEmail before insert on tstudent for each ROW begin set NEW.enterTime=now(); set NEW.Email=concat(PINYIN(NEW.sname),'@hotmaile.com'); end
插入两天记录测试触发器是否工作 insert into tstudent(studentid,sname,sex,class) values(‘00005’,'阿部高和','男','java'),(‘00006’,'比利还灵顿','男','c#');
一张表不能有多个插入触发器
删除触发器
drop TRIGGER autoTimeAndEmail;
创建记录跟踪的审计表 create table review ( username varchar(20), act VARCHAR(10), sname VARCHAR(10), actTime TIMESTAMP ) 创建触发器 该触发器像insertReview表中记录 CREATE TRIGGER insertReview BEFORE INSERT on 'TStudent' FOR EACH ROW BEGIN
在insert型触发器中new表表示将要插入或是已经插入的新数据
update表示将要或是已修改的原数据
delete表示将要或已删除的原数据

774

被折叠的 条评论
为什么被折叠?



