目录
1.概述
1.3SQL的优点
1.4 SQL 语言的分类
2. 软件的安装与启动
2.1 安装
2.2 MySQL服务的启动和停止
2.3 MySQL服务的登录和退出
编辑
2.4 mysql常用命令
2.5 图形化用户结构Sqlyong
3.DQL 语言
3.1 基础查询
3.1.1、语法
3.1.2 特点
3.2 条件查询
3.2.1 语法
3.2.2 举例
3.3 模糊查询
3.3.1 语法
3.3.2 举例
3.4 排序查询
3.4.1 语法
3.4.2 举例
3.5常见函数
3.5.1 语法
3.5.2 举例
3.5.2.1 单行函数
3.5.2.2 数学函数
3.5.2.3 日期函数
3.5.2.4 其他函数
3.5.2.5 流程控制函数
3.5.2.6 分组函数
3.6 分组查询
3.6.1语法:
3.6.2 举例
3.7 连接查询
3.7.1 语法
3.7.2 举例
3.7.2.1 sql 92 标准
3.7.2.2 sql 99 标准
3.8 子查询
3.8.1 语法
3.8.2 举例
3.9 分页查询
3.9.1 语法
3.9.2 举例
3.10 联合查询
4 DML 语言
4.1 插入
4.1.1 语法
4.1.2 举例
4.2 修改
4.2.1 语法
4.2.2 举例
4.3 删除
4.3.1 语法
4.3.2 举例
5 DDL
语法:
5.1 库的管理
5.2 表的管理
5.3 常见的数据类型
5.3.1 整型
5.3.2 浮点型编辑
编辑
5.2.4 字符型
编辑
5.2.5 日期型
5.4 常见约束
5.5 标识列
6 mysql 事务(TCL)
6.1 事务以及相关概念
6.2 事务的演示
7视图
7.1语法
7.2 举例
1.1数据库的好处
数组集合文件
•使用完整的管理系统统一管理,易于查询
首先下载SQLyog 和mysql的相关版本。
可以使用我的链接链接
https://pan.baidu.com/s/1hrwTpAtTRS7q0VsjmRePQg?pwd=2z3o
提取码:2z3o
MySQL
点击安装,
登录:mysql 【-h 主机名 -P 端口号】 -u 用户名 -p密码
用户名和密码都是自己安装的时候的。
1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名
3.查看当前库的所有表
show tables;
4.查看其它库的所有表
show tables from 库名;
5.创建表
create table 表名(
列名 列类型,
列名 列类型,
);
6.查看表结构
desc 表名;
7.查看服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端
mysql --version
或
mysql --V
###a)MySQL的语法规范 1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每条命令根据需要,可以进行缩进 或换行
4.注释 单行注释:#
注释文字 单行注释:-- 注释文字
多行注释:/* 注释文字 */
###b)SQL的语言分类
DQL(Data Query Language):数据查询语言
select
DML(Data Manipulate Language):数据操作语言
insert 、update、delete
DDL(Data Define Languge):数据定义语言
create、drop、alter
TCL(Transaction Control Language):事务控制语言
commit、rollback
运行,快捷键F9 所有的代码都运行。默认鼠标滚轮+ctrl 可以修改终端的的字体大小。
以后演示代码都会在Sqlyong 进行演示。
在学习之前需要将数据库中添加数据。才能接下来的学习。点击root@localhost 右键,执行sql 脚本。sql 文件。在次点击root@localhost 刷新。就可以看到增加了两个数据库。
链接:https://pan.baidu.com/s/1Ve_ruDuYwQkZSYDKUL5jpg?pwd=ydye
提取码:ydye
首先主要使用myemployees;
点击+好可以新建一个查询分析器。
1、查询单个字段
select 字段名 from 表名;
2、查询多个字段
select 字段名,字段名 from 表名;
3、查询所有字段
select * from 表名
4、查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
5、查询函数
select 函数名(实参列表);
6、查询表达式
select 100/1234;
7、起别名
①as
②空格 (别名不能有空格,特殊用途,否则有歧义可以加上双引号)
8、去重
select distinct 字段名 from 表名;9、+
作用:做加法运算
select 数值+数值; 直接运算
select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
select null+值;结果都为null10、【补充】concat函数
功能:拼接字符
select concat(字符1,字符2,字符3,...);11、【补充】ifnull函数
功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;12、【补充】isnull函数
功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
1、查询列表可以是字段、常量、表达式、函数,也可以是多个。
2、查询结果是一个虚拟表。
代码如下。
USE myemployees ;
SELECT * FROM employees;
SELECT last_name FROM employees;
SELECT
last_name,
first_name,
salary,
email
FROM
employees ;
常量查询。
起别名:
去重
9 + 号的作用
查询员工的姓和名连接成一个字段,显示为姓名
条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select
要查询的字段|表达式|常量值|函数
from
表
where
条件 ;
分类:
一、条件表达式
示例:salary>10000
条件运算符:
> < >= <= = != <>
二、逻辑表达式
示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
查询员工工资大于12000 的员工信息有哪些
查询部门部门编号不等90号的员工木你给和部门编号。
查询在10000-20000之间员工名,工资,奖金
查询部门编号不是90 到110 之间,或者工资高于15000 的员工信息。
3、模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符between a and b(包含临临界值 and 前后位置不能颠倒)
in :判断某字段的值是否属于in 列表中的某一项特点:1.使用in 提高简洁度
2.in 列表的值类型必须一致或者兼容。
3. 列表内部不支持通配符
is null /is not null:用于判断null值,= != 不能判断null 值。is 和null 搭配不能配其他数is null PK <=>(安全等于)
普通类型的数值 null值 可读性
is null × √ √
<=> √ √ ×
查询员工名总包含字符a的员工信息(% 是通配符表示任意字符出现任意次)
查询员工名中第三个字符为n,第5 个字符为l的员工名和工资。
查询员工名中第二个字符为_的员工名
查詢員工编号在100 到120 之间的员工信息。
查询员工的工种编号为IT_PROG,AD_VP,AD_PRES 中的一个的员工 名和工种编号
查询没有奖金的员工名和奖金率
一、语法
select 查询列表
from 表
where 筛选条件
order by 排序列表 【asc|desc】
查询员工信息,要求工资从高到低进行排序
从低到高
排序+ 筛选:查询部门编号>=90,要求按入职时间先后进行排序
按年薪的高低显示员工的信息和年薪【按表达式排序】
按姓名的长度显示员工的姓名和工资[按函数排序]
查询员工信息,按工资排序,按员工编号排序【多个字段进行排序】
功能:类似于java中的方法
好处:提高重用性和隐藏实现细节
调用:select 函数名(实参列表) 【from 表】;特点:函数名?
功能?
二、单行函数(做统计使用的,有成为统计函数,聚和函数)
1、字符函数
concat:连接
substr:截取子串
upper:变大写
lower:变小写
replace:替换
length:获取字节长度
trim:去前后空格
lpad:左填充
rpad:右填充
instr:获取子串第一次出现的索引
2、数学函数
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截断
rand:获取随机数,返回0-1之间的小数3、日期函数
now:返回当前日期+时间
year:返回年
month:返回月
day:返回日
date_format:将日期转换成字符
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间
hour:小时
minute:分钟
second:秒
datediff:返回两个日期相差的天数
monthname:以英文形式返回月
4、其他函数
version 当前数据库服务器的版本
database 当前打开的数据库
user当前用户
password('字符'):返回该字符的密码形式
md5('字符'):返回该字符的md5加密形式5、流程控制函数
①if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
②case情况1
case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end③case情况2
case
when 条件1 then 值1
when 条件2 then 值2
...
else 值n
end三、分组函数
1、分类
max 最大值
min 最小值
sum 和
avg 平均值
count 计算个数2、特点
①语法
select max(字段) from 表名;②支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数据类型③以上分组函数都忽略null
④都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from 表;
⑤count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
案例:查询每个部门的员工个数
1 xx 10
2 dd 20
3 mm 20
4 aa 40
5 hh 40count(1):统计结果集的行数
效率上:
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)和count(1)效率>count(字段)⑥ 和分组函数一同查询的字段,要求是group by后出现的字段
length() 函数
concat() 函数
upper() ,lower() 函数
让姓大写,名小写进行拼接。
substr() ,substring()
案例:
单一函数:
upper() lower() 姓名中首字母大写,其他字符小写,然后用_拼接,显示出来
instr() 函数获取子字符串第一次出现的时候所出现的索引。找不到返回0
trim() 去前后空格
lpad () 函数:左填充指定长度 的字符使得总长度是是你填入的值
rpad() 右填充
replace() 替换函数
round()四舍五入
可以先算绝对值,再加符号
ceil() 向上取整 返回大于等于该参数的最小整数
floor() 向下取整,返回小于等于该参数的最大整数。
truncate() 截断
mod() 取余
now() 返回日期加时间
日期格式化
查询入职日期是1992-4-3 的员工信息
date_format 将日期转换成字符
查询有奖金的员工名和入职日期(xx月/xx日/xx年)
if :if else 函数
case函数: switch case 效果
case 要判断的字段或者表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
.....
else 要显示的值n或者语句n
end;
/查询员工的工资,要求
部门号为30 ,显示的工资位工资的1.1倍
40, 1.2倍
50, 1.3
其他原工资
/
case 使用2
case
when 条件1 then 要执行的值1或者语句
when 条件2 then 要执行的值2或者语句
....
else 要显示 的值n
end
查询员工的工资
如果大于20000 显示A
15000 ,B
10000,C
其他,D
又称为统计函数或者组函数 sum ,avg,max 最大值,min 最小值 ,count() 计算个数简单的使用
sum()
参数支持哪里类型
特点
1.sum ,avg 一般用于处理数据类型
max,min,count 可以处理任何类型
2.所有分组函数都忽略null 值(直接逃过null 的数据,不参加计算)
3 可以和distinct 搭配
4.count() 函数的 研究
count() 详细介绍
效率的问题
效率:INNODEB myisam count(*)和count(1) 差不多 ,比count(字段)高
MYISAM ,count(*) 高
5.和分组函数一同查询的字段有限制
和分组函数一同查询的字段的要求是group by 后的字段,其他的都不行。
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
二、特点使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by的前面
分组后筛选 having 分组后的结果 group by 的后面
查询每一个工种的最高工资
查询每个位置上的部门个数
添加筛选条件分组钱
案例:查询邮箱中包含a 字符的每个部门的平均工资
查询有奖金每个领导手下的员工的最高工资
#添加复杂筛选条件
添加筛选,分组后
查询员工个数大于2 的部门
查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资
查询领导编号大于102 的每个领导手下的最低工资大于5000 的领导编号,以及其最低工资
总结:分组查询筛选条件分为两类,分组前筛选,分组后筛选
分组前: 数据源 原始表 位置 where +group by 前面 关键字 where
分组后: 数据源分组后的结果 having +group by 后面 关键字 having
分组函数做条件,肯定放在having自句中:
能用分组前就用分组前的筛选。
#按表达式或者函数分组
案例:按员工姓名的长度分组,查询每一组员工的个数,筛选员工个数大于5 的有哪些
#按多个字段分组
查询每个部门每个工种的员工的 平均工资
#分组排序添加排序
查询每个部门每个工种的员工的 平均工资,并且按照平均工资的高低进行排序
多层级筛选
group by 支持单个字段分组,多个字段用,隔开,没有顺序,也可以用表达式
也可以添加排序,添加到最后。
又称为多表查询,当查询的字段来自多个表时候,会用到多表查询。
一、含义
当查询中涉及到了多个表的字段,需要使用多表连接
select 字段1,字段2
from 表1,表2,...;笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
二、分类按年代分类:
sql92:
等值
非等值
自连接也支持一部分外连接(用于oracle、sqlserver,mysql不支持)
sql99【推荐使用】
内连接
等值
非等值
自连接
外连接
左外
右外
全外(mysql不支持)
交叉连接
三、SQL92语法
1、等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】特点:
① 一般为表起别名
②多表的顺序可以调换
③n表连接至少需要n-1个连接条件
④等值连接的结果是多表的交集部分
2、非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
3、自连接语法:
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
四、SQL99语法
1、内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;特点:
①表的顺序可以调换
②内连接的结果=多表的交集
③n表连接至少需要n-1个连接条件分类:
等值连接
非等值连接
自连接
2、外连接
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
①查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
②left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
③一般用于查询除了交集部分的剩余的不匹配的行3、交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;特点:
类似于笛卡尔乘积
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
如何解决:添加有效的连接条件
正确写法:
分类:
年代分类
sql92 标准 :仅支持内联
sql99 标准 :所有内连加外联加交叉
功能分类:
内连接
等值
非等值
自连接
外连接
左外连接
右外连接
全外连接
交叉链接
查询女神名和男神名
查询员工名和对应的部门名
查询工种号,工种名,工种名
查询城市中第二个字符为‘o’的对应的部门名和城市名(添加筛选)
添加分组
查询每个城市的部门个数
#案例2 查询出有奖金的 每个部门名和部门的领导编号以及该部门的最低工资
添加排序
每个工种的工种名和员工的个数并且按照员工个数进行降序排序
实现三表连接
查询员工名,部门名和所在的城市
sql 92 标准
多表等值连接,为多表的交集部分
n表连接,至少n-1 链接条件
多表顺序没有要求,建议对表起别名
可以搭配所有句子使用
2.非等值连接
案例1:查询员工的工资和工资级别
#自连接
查询员工名和上级的名称
内联,左外,右外,全外。
select 查询列表 from table1 表1 别名 【连接类型】 join 表2 别名 on 连接条件 where 筛选条件 【group by】 [having] [order by]
内联 inner
左 left [outer]
右 right[outer]
全 full
交叉 cross join
1 内连接
查询员工名,部门名
查询名字中包含e的员工名和工种名(添加筛选)
查询部门个数>3 的城市名和部门个数,(添加分组和筛选)
查询哪个部分的员工个数大于3的部门名和员工个数,并按照个数进行排序(添加排序)
查询员工名,部门名,工种名,并按部门名降序。
# 非等值连接
查询员工的工资级别
查询每个工资级别的个数>20的个数,并且按工资界别降序
#自连接
查询员工的名字和上级的名字
# 二外连接
一般外连接用于查询一个表中有,另一个表没有。需要分主从表
特点:
查询结果为主表的中的所有记录,如果从表有匹配的,则显示匹配 的值
如果没有匹配的则显示null
外连接的的结果=内连接结果+主表中有而从表中没有的记录
左外中left join左侧是主表
右外 right join右侧是主表
左右外,交换两个表可以实现同样的效果。
查询男朋友 不在男神表的女神名
查询男朋友不在男神表的女神名。(最好选择从表主键列)
右外连接
案例:
查询哪个部门没有员工
# 全外连接
全外连接=内连接+表1有表2 没有,表2有但是表1没有的
#交叉连接
笛卡尔乘积
一、含义
嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询二、分类
1、按出现位置
select后面:
仅仅支持标量子查询
from后面:
表子查询
where或having后面:
标量子查询 单行子查询
列子查询 多行子查询
行子查询 多行多列子查询
exists后面:
标量子查询(只有一个结果)
列子查询
行子查询
表子查询2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
三、示例
where或having后面
1、标量子查询
案例:查询最低工资的员工姓名和工资
①最低工资
select min(salary) from employees②查询员工的姓名和工资,要求工资=①
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);2、列子查询
案例:查询所有是领导的员工姓名
①查询所有员工的 manager_id
select manager_id
from employees②查询姓名,employee_id属于①列表的一个
select last_name
from employees
where employee_id in(
select manager_id
from employees
);
案例:#单行子查询
谁的工资比Abel 高
返回job_id 与141号员工相同,salary 比143号员工多的员工的姓名,job_id 和工资
返回公司工资最少的last_name,job_id,和salary
题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
#多行子查询
返回location_id是1400或1700的部门中的所有员工姓名
#案例2:返回其它工种中比job_id为'IT_PROG'部门任一工资低的员工的员工号、姓名、job_id以及salary
返回其它部门中比job_id为'IT_PROG'部门所有工资都低的员工的员工号、姓名、job_id以及salary
#行子查询(一行多列,或者多行多列)
查询员工编号最小并且工资最高的员工信息
#放在select 后面的(里面只支持一行一列)
查询每个部门的员工个数
查询员工号=1贴2的部门名
#放到from 后面 将子查询的结果充当一张表,必须起别名
#案例:查询每个部门的平均工资的工资等级
exists 后面(相关子查询)
一、应用场景
当要查询的条目数太多,一页显示不全
二、语法select 查询列表
from 表
limit 【offset,】size;
注意:
offset代表的是起始的条目索引,默认从0卡死
size代表的是显示的条目数公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;
select查询列表from表
【join type join表2on连接条件
where 筛选条件group by分组字段having分组后的筛选order by排序的字段】limit offset,size;
I
offset要显示条目的起始索引(起始索引从0开始)
size要显示的条目个数
#查询前五条员工信息
#查询第11条道25条
#案例3:有奖金的员工信息,并且工资较高的前10名显示出来
3.10.1 语法
一、含义
union:合并、联合,将多次查询结果合并成一个结果多表没有关系的首先考虑
二、语法
查询语句1
union 【all】
查询语句2
union 【all】
...三、意义
1、将一条比较复杂的查询语句拆分成多条语句
2、适用于查询多个表的时候,查询的列基本是一致四、特点
1、要求多条查询语句的查询列数必须一致
2、要求多条查询语句的查询的各列类型、顺序最好一致
3、union 去重,union all包含重复项
#引入的案例:查询部门编号>90或邮箱包含a的员工信息()
语法:
查询语句1
union
查询语句2
union
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
一、方式一
语法:
insert into 表名(字段名,...) values(值,...);
特点:
1、要求值的类型和字段的类型要一致或兼容
2、字段的个数和顺序不一定与原始表中的字段个数和顺序一致
但必须保证值和字段一一对应
3、假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
①字段和值都省略
②字段写上,值使用null
4、字段和值的个数必须一致
5、字段名可以省略,默认所有列二、方式二
语法:
insert into 表名 set 字段=值,字段=值,...;
两种方式 的区别:
1.方式一支持一次插入多行,语法如下:
insert into 表名【(字段名,..)】 values(值,..),(值,...),...;
2.方式一支持子查询,语法如下:
insert into 表名
查询语句;
#——、插入语句/*
语法:
insert into表名(列名,...) values(值1,... ) ;
L出 /
#插入方式1
#插入方式2
#两种方式的对比
一、修改单表的记录 ★
语法:update 表名 set 字段=值,字段=值 【where 筛选条件】;二、修改多表的记录【补充】
语法:
update 表1 别名
left|right|inner join 表2 别名
on 连接条件
set 字段=值,字段=值
【where 筛选条件】;
#修改单表的例
#案例1:修改beauty表中姓唐的女神的电话为13899888899
#案例2:修改boys表中id好为2的名称为樊华,魅力值10
#多表修改
案例:案例1:修改张无忌的女朋友的手机号为114
#案例2:修改没有男朋友的女神的男朋友编号都为2号
方式一: delete语法:
1、单表的删除【★】
delete from表名where筛选条件2、多表的删除【补充】
方式二:truncate
i语法:truncate table表名;I
#方式一,delete
#多表的的删除
sql92错法:
delete表1的别名,表2的别名from表1别名,表2别名
where连接条件
and筛选条件;
sql99语法:
delete表1的别名,表2的别名from表1别名
inner l leftlright join表2别名on连接条件where筛选条件l
#案例:删除张无忌的女朋友的信息
#案例:册删除黄晓明的信息以及他女朋友的信息
将魅力值>100的男神信息册除--只能全部删除
-
两种删除的区别
数据定义语言,主要涉及库和表的管理和操作
一、创建库
create database 【if not exists】 库名【 character set 字符集名】;二、修改库
alter database 库名 character set 字符集名;
三、删除库
drop database 【if exists】 库名;=================================
一、创建表 ★
create table 【if not exists】 表名(
字段名 字段类型 【约束】,
字段名 字段类型 【约束】,
。。。
字段名 字段类型 【约束】)
二、修改表
1.添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
2.修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
3.修改列名
alter table 表名 change column 旧列名 新列名 类型;
4 .删除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;三、删除表
drop table【if exists】 表名;四、复制表
1、复制表的结构
create table 表名 like 旧表;
2、复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;=================================
一、数值型
1、整型
tinyint、smallint、mediumint、int/integer、bigint
1 2 3 4 8特点:
①都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
②如果超出了范围,会报out or range异常,插入临界值
③长度可以不指定,默认会有一个长度
长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型
2、浮点型
定点数:decimal(M,D)
浮点数:
float(M,D) 4
double(M,D) 8特点:
①M代表整数部位+小数部位的个数,D代表小数部位
②如果超出范围,则报out or range异常,并且插入临界值
③M和D都可以省略,但对于定点数,M默认为10,D默认为0
④如果精度要求较高,则优先考虑使用定点数二、字符型
char、varchar、binary、varbinary、enum、set、text、blobchar:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略三、日期型
year年
date日期
time时间
datetime 日期+时间 8
timestamp 日期+时间 4 比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间===============================================
一、常见的约束
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表
可以通过以下两种方式来删除主表的记录
#方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;#方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;二、创建表时添加约束
create table 表名(
字段名 字段类型 not null,#非空
字段名 字段类型 primary key,#主键
字段名 字段类型 unique,#唯一
字段名 字段类型 default 值,#默认
constraint 约束名 foreign key(字段名) references 主表(被引用列))
注意:
支持类型 可以起约束名
列级约束 除了外键 不可以
表级约束 除了非空和默认 可以,但对主键无效列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
三、修改表时添加或删除约束
1、非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型 ;2、默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型 ;
3、主键
添加主键
alter table 表名 add【 constraint 约束名】 primary key(字段名);
删除主键
alter table 表名 drop primary key;4、唯一
添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5、外键
添加外键
alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);
删除外键
alter table 表名 drop foreign key 约束名;
四、自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key一、创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
)
二、修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
三、删除自增长列
alter table 表 modify column 字段名 字段类型 约束
存储位置
进一步
更改库的名字不安全,取消了
可以更改库的字符集
删除库
create table 表名(
列名列的类型【(长度)约束】列名列的类型【(长度)约束】列名列的类型【(长度)约束】,.--
列名列的类型【(长度)约束】
表的修改
#2.表的修改
#1修改列名
#2修改列的类型或约束#3添加新列
#4删除列##5修改表名
1表名的修改
2修改列的类型或约束
3添加新列
#表的删除
通用写法
DROP DATABASEIFEX工STs 旧库名
;CREATE DATABASE新库名;
DROPTABLE工F EX工STS 旧表名;CREATETABLE表名()
#表的复制
#只复制结构不复制内容
#结构加内容
#只复制部分
#只复制两个列的结果,没有数据
数值型:
整型小数:
定点数浮点数
字符型:
较短的文本: char. varchar
较长的文本: text、blob(较长的二进制数据>
日期型:
##1.如何设置无符号和有符号
#无符号
char 固定长度,varchar 是可变长度
enum
set
#设置时区
总结
一、常见的约束
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段主键和唯一
1、区别:
①、一个表至多有一个主键,但可以有多个唯一
②、主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
外键:
1、用于限制两个表的关系,从表的字段值引用了主表的某字段值
2、外键列和主表的被引用列要求类型一致,意义一样,名称无要求
3、主表的被引用列要求是一个key(一般就是主键)
4、插入数据,先插入主表
删除数据,先删除从表
可以通过以下两种方式来删除主表的记录
#方式一:级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;#方式二:级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;二、创建表时添加约束
create table 表名(
字段名 字段类型 not null,#非空
字段名 字段类型 primary key,#主键
字段名 字段类型 unique,#唯一
字段名 字段类型 default 值,#默认
constraint 约束名 foreign key(字段名) references 主表(被引用列))
注意:
支持类型 可以起约束名
列级约束 除了外键 不可以
表级约束 除了非空和默认 可以,但对主键无效列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
三、修改表时添加或删除约束
1、非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型 ;2、默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型 ;
3、主键
添加主键
alter table 表名 add【 constraint 约束名】 primary key(字段名);
删除主键
alter table 表名 drop primary key;4、唯一
添加唯一
alter table 表名 add【 constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5、外键
添加外键
alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列);
删除外键
alter table 表名 drop foreign key 约束名;
四、自增长列
特点:
1、不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment=值;
2、一个表至多有一个自增长列
3、自增长列只能支持数值型
4、自增长列必须为一个key一、创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
)
二、修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
三、删除自增长列
alter table 表 modify column 字段名 字段类型 约束
#创建表时候添加约束
1添加列级约束
#查看stuinfo表中所有的索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;
总结
2.添加表级约束
#外键
# 修改表的时候添加约束
总结
#修改表的时候删除约束
#修改表的时候设置标识列
一、含义
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
二、特点(ACID)
A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D 持久性:一个事务一旦提交了,则永久的持久化到本地三、事务的使用步骤 ★
了解:
隐式(自动)事务:没有明显的开启和结束,本身就是一条事务可以自动提交,比如insert、update、delete
显式事务:具有明显的开启和结束使用显式事务:
①开启事务
set autocommit=0;
start transaction;#可以省略②编写一组逻辑sql语句
注意:sql语句支持的是insert、update、delete设置回滚点:
savepoint 回滚点名;③结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名;
四、并发事务
1、事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题都有哪些?
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据
3、如何解决并发问题
通过设置隔离级别来解决并发问题
4、隔离级别
脏读 不可重复读 幻读
read uncommitted:读未提交 × × ×
read committed:读已提交 √ × ×
repeatable read:可重复读 √ √ ×
serializable:串行化 √ √ √
事务
#事务的创建
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、 delete语句
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
步骤1:开启事务
set autocommit=0;
start transaction; 可选的
步骤2:编写事务中的sq1语句(select insert update delete)
语句1;
语句2;
步骤3:结束事务
commit;提交事务
rollback;回滚事务
会开一个专题做一个演示(插入图片太多,写的时候太卡了这个博客)
一、含义
mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:
1、简化sql语句
2、提高了sql的重用性
3、保护基表的数据,提高了安全性
二、创建
create view 视图名
as
查询语句;
三、修改
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句四、删除
drop view 视图1,视图2,...;
五、查看
desc 视图名;
show create view 视图名;
六、使用
1.插入
insert
2.修改
update
3.删除
delete
4.查看
select
注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新
①包含分组函数、group by、distinct、having、union、
②join
③常量视图
④where后的子查询用到了from中的表
⑤用到了不可更新的视图
七、视图和表的对比
关键字 是否占用物理空间 使用
视图 view 占用较小,只保存sql逻辑 一般用于查询
表 table 保存实际的数据 增删改查
创建
修改和查看
视图和表的对比