MySql

Mysql

一、SQL概念

DB
数据库(dlatabase) :存储数据的“仓库”。它保存了一系列有组织的数据。
DBMS
数据库管理系统(Database Management System)。数据库是通过DBMS创
建和操作的容器
SQL
结构化查询语言(Structure Query Language) :专门用来与数据库通信的语
言。

MySql特点:
成本低:开放源代码,一般可以免费试用
性能高:执行很快
简单:很容易安装和使用

DBMS分为两类:
基于共享文件系统的DBMS( Access )
基于客户机——服务器的DBMS(MySQL、Oracle、 SqlServer )

1、DML (Data Manipulation Language):数据操纵语句,用于添
加、删除、修改、查询数据库记录,并检查数据完整性
2、DDL (Data Definition Language):数据定义语句,用于库和
表的创建、修改、删除。
3、DCL (Data Control Language):数据控制语句,用于定义用
户的访问权限和安全级别。

DML
DML用于查询与修改数据记录,包括如下SQL语句:
●INSERT:添加数据到数据库中
●UPDATE:修改数据库中的数据
●DELETE:删除数据库中的数据
●SELECT:选择(查询)数据
➢SELECT是SQL语言的基础,最为重要。

DDL
DDL用于定义数据库的结构,比如创建、修改或删除
数据库对象,包括如下SQL语句:
●CREATE TABLE:创建数据库表
●ALTER TABLE: 更改表结构、添加、删除、修改列长度
●DROP TABLE:删除表
●CREATE INDEX:在表上建立索引
●DROP INDEX:删除索引

DCL
DCL用来控制数据库的访问,包括如下SQL语句:
●GRANT:授予访问权限
C)REVOKE:撤销访问权限
●COMMIT:提交事务处理
●ROLLBACK:事务处理回退
●SAVEPOINT:设置保存点
●LOCK:对数据库的特定部分进行锁定

二、MySql安装与使用

安装

看其他人CSDN

启动和停止MySql服务

方式一:通过计算机管理方式
右击计算机一 管理一服务- -启动或停止MySQL服务
方式二:通过命令行方式.
启动:net start mysq|服务名
停止:net stop mysq|服务名

登录

mysql -h 主机名 -u用户名 -p密码

退出

exit

MySql数据库的使用

不区分大小写
每句话用;或\g结尾
各子句一般分行写
关键字不能缩写也不能分行
用缩进提高语句的可读性

进入mysql,在命令行中输入: mysql -uroot -p## (其中: ##表示密码)
查看mysql中有哪些个数据库: show databases;
使用一.个数据库: use数据库名称;
新建一个数据库: create database数据库名
查看指定的数据库中有哪些数据表:showtables;
建表:
create table customer(
列明 列类型,
列明 列类型
);
查看表的结构:desc 表名;
删除表:drop table 表名;
查看表中的所有记录: select * from表名;
向表中插入记录: insert into表名(列名列表) values(列对应的值的列表);
查看服务器版本:
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysq1服务端
方式二:没有登录到mysql 1服务端
mysq1 --version .

mysql --V

MySql语法规范

1.不区分大小写,但建议关键字大写,表名、列名小写
2.每条命令最好用分号结尾
3.每条命令根据需要,可以进行缩进或换行
4.注释
单行注释:#注释文字
多行注释:/* 注释文字 */

三、DML语言

1.基础查询

1.特别注意

``表示字段			‘’ 表示常量

2.查询表中所有字段 *

select * from student;

3.查询常量、表达式、函数

#查询常量值
select 100;
#查询表达式
select 100*98;
#查询函数
select version();

4.起别名 关键字:AS

select 100*98 as 结果;
SELECT last_name AS 姓,first_ name AS 名 FROM employees ;

as可省略

SELECT last_name 姓,first_ name 名 FROM employees ;

5.去重 关键字 DISTINCT distinct

select distinct id from student;

6.“+号作用 仅仅只有一个功能:运算符

select 100+90; 两个操作数都为数值型,则做加法运算
select ‘123’+90;其中一 方为字符型,试图将字符型数值转换成数值型 如果转换成功,则继续做加法运算
select ‘john’+90;如果转换失败,则将字符型数值转换成0
select null+10; 只要其中一方为null, 则结果肯定为null

7.concat 作用:拼接字段。

select concat(first_name,last_name) 姓名 from employees;

例:显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_ PUT

SELECT
CONCAT(first_name,’,’,last_name,’,’,age,IFNULL (commission_ pct,0)) AS OUT_ PUT
FROM
employees;

2.条件查询

1.语法:

​ select
​ 查询列表
​ from
​ 表名
​ where
​ 筛选条件;

2.分类:

​ (1)按条件表达式筛选
​ 条件运算符: > < = != <>(不等于) >= <=
​ (2)按逻辑表达式筛选
​ 逻辑运算符: && || !
​ and or not
​ (3)模糊查询:
​ like
​ between … and…
​ in
​ is null

​ like
​ % :代表任意多个字符(包含0个和1个)
​ _ :代表任意一个字符
​ 通配符不能用于null(意思就是说,在使用通配符搜索时,搜索不到null值,返回的结果中这个属性就没有null值)

​ between…and…
​ 区间在 [ x , y ] 闭区间。

​ <=> :安全等于。

select * from student where id <=> null;

​ 等于

select * from student where id is null;

3.排序查询

order by 排序列表 asc | desc

desc :降序
asc :升序(默认)

使用不需要where
支持多个字段、表达式、函数、别名
order by 一般房子查询语句最后面,limit字句除外

4.常见函数

1.单行函数

(1)字符函数

length

select length('john');

concat 拼接字符串

selectconcat(first_name,last_name) from student;

upper、lower

select upper('john');

substr、substring :截取字符串

注:索引从1开始

SELECT SUBSTR('李莫愁爱上了陆展元,7)
out_ put;

结果:陆展元

SELECT SUBSTR('李莫愁爱上了陆展元',1,3)
out_ put; 

截取从指定索引处指定字符长度的字符

结果:李莫愁

instr :返回子串第一.次出现的索引,如果找不到返回0

SELECT INSTR('杨不殷六侠悔爱.上了殷六侠', '殷六侠') AS out_ put;

结果:3

trim :去除前后

去除前后空格

SELECT LENGTH (TRIM('   张 翠山   ' ) )ASout_ put;

结果:张 翠山

去除前后a

SELECT TRIM('a' FROM ' aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaa') AS out_ put;

结果:张aaaaaaaaaaaa翠山

lpad 用指定字符实现左填充指定长度

select lpad('田甜向上',2,'*');

结果:**田甜向上

rpad 用指定字符实现右填充指定长度

select rpad('田甜向上',2,'*');

结果:田甜向上**

replace 替换所以

SELECT REPLACE ('周正若周正右周正若周正若张无总爱上了周正右','周正右','赵敏') AS out_ put;

结果:赵敏赵敏赵敏赵敏张无忌爱上了赵敏

(2)数学函数

round 四舍五入

select round(2.5);select round(-1.2);

结果:3
-1

ceil 向上取整 返回>=该参数的最小整数

select ceil(-1.02);

结果:-1

floor 向下取整,返回<=该参数的最大整数

select floor(9.9);

结果:9

truncate 截断,保留小数位数。

select truncate(1.654,1);

结果:1.6

mod 取余

select mod(10,3);

结果:1

(3)日期函数

now 返回当前系统日期+时间

select now();

结果:2017-09-29 11:12:38

curdate 返回当前系统日期,不包含时间

select curdate();

结果:2017-09-29

curtime 返回当前时间,不包含日期

select curtime();

结果:11:13:35

可以获取指定的部分,年、月、日、小时、分钟、秒

year month day …

select year(now()) as 年;

结果:2021

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSZRMjRr-1627366708834)(C:\Users\刘星\AppData\Roaming\Typora\typora-user-images\image-20210708143512459.png)]

str_to_date 将字符通过指定的格式转换成日期

select STR_ TO_ DATE('9-13-1999','%m- %d-%Y');

结果:1999-09-13

date_ format 将日期转换成字符

select DATE_ FORMAT('2018/6/6','%Y年%m月%d日');

结果:2018年06月06日

(4)其他函数
select version();		//当前版本select database();		//当前数据库select user();			//当前用户
(5)流程控制函数

if

select if(10<5,'大','小');

结果:小

case

case函数的使用一: switch case 的效果

语法:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句2
when 常量2 then 要显示的值2或语句2

else 要显示的值n或语句n;
end;

select salary 原始工资  , department_id,case department_idwhen 30 then salary*1.1when 40 then salary*1.2when 50 then salary*1.3else salaryend as 新工资from employees;

case函数的使用二:类似于多重if

case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2

else
end;

select salary,casewhen salary >20000 then 'A'when salary >15000 then 'B'when salary >10000 then 'C'else 'D'end  as  薪资级别from employees;

2.分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

1.分类

​ sum 求和、avg 平均值、max 最大值、min 最小值、count 计算个数

2.支持类型

sum、avg :数值类型
max、min、count :数值与字符

是否忽略null
sum、avg、min、max、count忽略null值。所有分组函数都忽略null值。

可以和distinct搭配

SELECT SUM (DISTINCT salary) , SUM(salary) FROM employees;

count(*)与count(salary)可能不相等
count(1)也是统计行数等于count(*)

一般用count(*)统计行数
效率:
MYISAM存储引擎下,COUNT()的效率高
INNODB存储引擎下,COUNT(*)和COUNT (1)的效率差不多,比COUNT (字段)要高一些

3.分组查询

group by

select Max(salary),job_id from employees group by job_id;

having :用在group by 之后,作用与where相同。

select count(*),department_idfrom employeesgroup by department_idhaving count(*)>2;
4.分组查询中的筛选条件分为两类

分组前筛选:原始表 group by 的前面 where
分组后筛选:分组后的结果集 group by 的后面 having

5.连接查询

1.笛卡尔积

结果数 = m × n

2.连接查询分类

内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接

3.等值连接

SELECT NAME, boyNameFROM boys, beautyWHERE beauty . boyfriend_ _id= boys. id;

4.非等值连接

范围

5.自连接

把一张表当成多张表用,自己连接自己

select a.employee_id,a.namefrom employees a,employees bwhere a.manager_id=b.employee_id;

6. sql99语法

语法:
select 查询列表
from 表1 别名
[连接类型] join 表2 别名
on 连接条件
[where 筛选条件]
[group by 分组]
[having 筛选条件]
[order by 排序列表]
分类:
内连接:inner
外连接:
左外:left [outer]
右外:right [outer]
全外:full [outer]
交叉连接:cross

7.内连接

语法:
select 查询列表
from表1别名
inner join 表2别名
on 连接条件;

inner 可省略

例:查询员工名、部门名(等值连接)

select last_name,department_name
from  departments d
inner join employees e
on e.department_id=d.department_id;

例:查询员工的工资级别(非等值连接)

SELECT salary,grade_ levelFROM employees eJOIN job_ _grades gON e.salary BETWEEN g.lowest sal AND g.highest sal;

查询雇佣id和员工名字(自连接)

select a.employee_id,a.namefrom employees ainner join employees bon a.manager_id=b.employee_id;

8.外连接

应用场景:用于查询一个表中有,另一个表没有的记录

特点:
1.外连接的查询结果为主表中的所有记录。如果从表中有和它匹配的,则显示匹配的值,如果从表中没有和它匹配的,则显示null
2.左外连接,left [outer] join 左边的是主表
右外连接,right [outer] join 右边的是主表
全外连接,full [outer] join (mysql不支持)

9.交叉连接

语法:
select 查询列表
from 表1
cross jion 表2

6.子查询

1.概念

出现在其他语句内部的select语句,称为子查询或内查询

内部嵌套其他select语句的查询,称为外查询或主查询

如:

select first_name from employees where department_id in(select department_idfrom departmentswhere location_id=1700)

2.分类

1.按出现位置:

select后面:
标量子查询

from后面:
表子查询

where 或者having后面
标量子查询 √
列子查询 √
行子查询

exists后面:
标量子查询
列子查询
行子查询
表子查询

2.按结果集的行列

标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为一行多列
表子查询:结果集为多行多列

3.where或者having后面

1.标量子查询(单行子查询)

特点:
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用

> < >= <= = <>

例1:谁的工资比Abel高?

SELECT *
FROM employees
WHERE salary> (
SELECT salary
FROM employees
WHERE last_name =↑Abel ↑
);

例2:返回job_ id与141号 员工相同,salary比143号员工多的员工姓名,job_ _id和工资

SELECT last_ name, job_id, salaryFROM employeesWHERE job_ _id = (SELECT job_ _idFROM employeesWHERE employee_id = 141AND salary> (SELECT salaryFROM employeesWHERE employee_ id = 143);

例3:返回公司工资最少的员工的last_ name, job_ _id和salary

select last_name,job_id,salaryfrom employees where salary =(select min(salary)from employees);

例4:查询最低工资大于50号部门最低工资的部门id和其最低工资

select department_id,min(salary)from employeesGROUP BY department_idhaving min(salary)>(select min(salary)from employeeswhere department_id=50);
2.列子查询

一般搭配着多行操作符使用

IN/NOT IN  ANY/SOME ALL

IN/NOT IN:等于列表中的任意一个
ANY/SOME:和子查询返回的某一个值比较
ALL:和子查询返回的所有值比较

例1:返回location id是1400或1700的部门中的所有员工姓名

select last_namefrom employeeswhere department_id in(select department_idfrom departmentswhere location_id IN(1400,1700));

4.select后面的标量子查询

例1:查询每个部门的员工个数

select d.*,(select count(*) from employees ewhere e.department_id=d.department_id)from departments d;

例2:查询员工号=102的部门名

select (select department_namefrom department dinner join employees eon d.department_id=e.department_idwhere e.employee_id=102);

5.from后面的表子查询

例1:查询每个部门的平均工资的工资等级

SELECT
ag_dep.*,g.grade_level
FROM 
(
SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id
)ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal
;

6.exists后面的子查询(相关子查询)

exists(完整的查询语句)

例1:查询有员工名和部门名

select department_name
from departments d 
where exists(
select * 
from employees e
where d.department_id=e.department_id
)

7.分页查询

语法:

select查询列表
from 表1
[ 连接类型 join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段 ]
limit offset, size;
offset要显示条目的起始索引(起始索引从0开始)mysql中其余都是从1开始。
size 要显示的条目个数

例1:查询前五条员工信息

select * from employees limit 0,5;

例2:查询第11条一第25条

SELECTFROMemployees LIMIT 10, 15; .

特点:
①limit语句放在查询语句的最后
②公式:
要显示的页数page,每页的条目数size
select查询列表
from表
limit (page-1) *size, size;

size=10
page:页码
index:索引

pageindex
10
210
320

8.union联合查询

将多条查询语句的结果合并成- -个结果

1.语法:

​ 查询语句1
​ union
​ 查询语句2

2.应用场景:

要查询的结果来自于多个表,但查询的信息一致

例1:查询中国用户中男性的信息以及外国用户中年男性的用户信息

SELECT id,cname,csex FROM t_ca WHERE csex='男 'UNIONSELECT t_ id, tName, tGender FROM t_ua WHERE tGender= 'male' ;

3.特点

查询列数要相同,
结果相同会去除相同行,如果不要去除相同行,加ALL

如:

SELECT id,cname,csex FROM t_ca WHERE csex='男 'UNION ALLSELECT t_ id, tName, tGender FROM t_ua WHERE tGender= 'male' ;

四、DML语言

DML:数据操作语言
插入:insert
修改:update
删除:delete

1.插入语句

语法1:支持插入多行

​ 支持子查询

insert  into 表名(列名,...) values(列名,...);

例1:

INSERT INTO beauty (id, NAME, sex, borndate, phone, photo, boyfriend_ id)VALUES (13,'唐艺昕','女','1990-4-23','1898888888', NULL,2);

例2:

INSERT INTO beauty (id, NAME, phone)SELECT id, boyname, '1234567'FROM boysWHERE id<3;

语法2:不支持插入多行

insert into 表名 set 列名=值,列名=值,列名=值;

2.修改语句

update

语法1:修改单表

update 表名
set 列=新值,列=新值,列=新值...
where 筛选条件;

例1:修改beauty表中姓唐的女神的电话为13899888899

UPDATE beauty SET phone = '13899888899 '
WHERE NAME LIKE '唐号' ;

语法2:修改多表

update 表1 别名
inner | left | right join 表2 别名
on 连接条件
set 列=值, ...;

例2:修改张无忌的女朋友的手机号为114

UPDATE boys bo
INNER JOIN beauty b 
ON bo.id=b.boyfriend_id
SET b.phone='114'
WHERE  bo.boyName='张无忌';

3.删除语句

1.delete

语法1:单表的删除
delete from 表名 where 筛选条件;

例1:删除雇佣id为100的用户

delete from employees where employee_id=100;
语法2:多表的删除
delete 表1的别名,表2的别名from 表1 别名1inner join 表2 别名2on 连接条件where 筛选条件

例2:删除张无忌的信息以及他女朋友的信息

delete b,bofrom beauty binner join boys boon b.boyfriend_id=bo.idwhere bo.boyName='张无忌';

2.truncate(清空数据)

语法:多表的删除

truncate 不能加where等其他语句或条件

truncate table 表名;

例2:

truncate table boys;

3.truncate与delete比较

1.truncate的效率比delete效率高一点

2.假如要删除的表中有自增长列:
delete删除后,再插入数据,自增长列的值从断点开始,
truncate删除后,再插入数据,自增长列的值从1开始。

3.truncate删除没有返回值,delete删除有 返回值

4.truncate删除不能回滚,delete删除 可以回滚.

五、DDL语言

DDL:数据定义语言

库和表的管理

库和表的创建、修改、删除

创建:create
修改:alter
删除:drop

1.库的管理

1.库的创建

语法:

create database [if not exists] 库名;

例1:

create database if not exists book;

2.库的修改

1.修改名字
rename database 库名 to 新库名;

此语句已经过时,不可再用

2.更改库的字符集
alter database 库名 character set utf8;

3.库的删除

语法:

drop database if exists book;

2.表的管理

1.表的创建

语法:

create table [if not exists] 表名(	字段名 字段类型(长度) [约束],	字段名 字段类型(长度) [约束],	字段名 字段类型(长度) [约束],	...	字段名 字段类型(长度) [约束])

2.表的修改

1.添加列

语法:

alter table 表名 add columnn 列名 列类型 	约束	[first | after 字段名];

例1:

alter table student add column stuAge int after stuName;
2.修改例的类型和约束

语法:

alter table 表名 modify column 新类型 [新约束];

例2:

alter table student modify column int(10) primary key;
3.修改列名

语法:

alter table 表名 change column 列名 新列名 类型(长度);

这里的类型是原类型+长度

例3:

alter table student change column stuName student_Name  varchar(20);
4.删除列

语法:

alter table 表名 drop column 列名;

例1:

alter table stu drop column stuAge;
5.修改表名

语法:

alter table 表名 rename 新表名;

例:

alter table user rename stu_user;

3.表的删除

语法:

drop table 表名;

例:

drop table user if exists;

4.表的赋值

1.仅仅复制表的结构

语法:

create table 复制的表名 like 表名;

例1:

create table user2 like user;
2.复制表结构和数据

语法:

create table 复制的表名
selete * from 表名;

例2:

create table user3
select * from user;

3.通用写法

1.创建数据库

语法:

drop database if exists 旧库名;create database 新库名;

2.创建表

语法:

drop table if exists 旧表名;create table 表名();

4.mysql中的数据类型

1.分类

数值型:整数
小数:定点数
浮点数

字符型
较短的文本:char ,varchar
较长的文本:text , blob(较长的二进制数据)
日期型:

2.整型

1.分类:

类型tinyintsmallintmediumintint/integerbigint
字节12348

2.使用有符号和无符号
默认有符号
使用无符号,加上关键字unsigned
例:

drop table if exists table1create table	table1(	--有符号	t1 int ,	--无符号	t2 int unsigned)

如果数值超出范围,插入的是数值范围的临界值

3.zerofill关键字

int(7)表示显示结果该列的宽度,如果不够用0填充,默认不会出现0进行填充。需要使用zerofill进行填充,且将自动变为无符号

例:

create table table1(	id int(7) zerofill,	length int(7))

3.小数

1.浮点型:

float(M,D)
doublee(M,D)
默认M和D会根据插入的数值的精度来决定精度

2.定点型:

dec(M,D)
decimal(M,D)
M默认是10 ,D默认是0

M和D:

M表示有效位数,D表示小数点后的有效位数

定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用

4.字符型

较短的文本:

类型charvarchar
字节12
特点固定长度可变长度
耗费的空间比较耗费比较节省
效率

char 可以省略长度,默认为1
varchar不可以省略长度

了解enum,set类型
例:

CREATE TABLE tab_ set (s1 SET('a', 'b', 'c', 'd'));INSERT INTO tab_ set VALUES('a') ;INSERT INTO tab_ set VALUES('a,b') ;INSERT INTO tab_ set VALUES('a,c,d') ;

binary和varbinary用于保存较短的二进制

较长的文本:
text
blob

5.日期类型

分类:
日期和时间类型datedatetimetimestamptimeyear
字节48431
形式1000-01-011000-01-01 00:00:001000-01-01 00:00:00-838:59:591901

date只保存日期
time 只保存时间
year只保存年
datetime保存日期+时间
timestamp保存日期+时间

5.mysql常见约束

1.含义

​ 用于限制表中的数据,是为了保证表中的数据的准确和可靠性

2.分类:六大约束

not null : 非空,用于保证该字段的值不能为空。比如姓名、学号
default : 默认,用于保证该字段有默认值。比如性别
primary key : 主键,用于保证该字段的值具有唯一性,并且非空。比如学号、员工编号等。
unique : 唯一,用于保证该字段的值具有唯一性,但可以为空。比如座位号
check : 检查约束【mysql不支持】,比如年龄、性别
foreign key :外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联表的列的值。比如员工的部门编号。

3.添加约束的时机:

1.创建表时:
1.添加列级约束

语法

字段名  字段类型  约束类型

例1:添加列级约束

create table student(
	--主键约束
	id int primary key,
	--非空
	name varchar(25) not null,
	检查约束
	sex char(1) check(sex='男' or sex='女'),
	--唯一
	seat int unique,
	--默认
	age int default 18 ,
	--外键
	majorId int foreign key references major(id)
);
create table major(
	id int primary key,
	name varchar(15)
);
2.添加表级约束

语法

constraint 约束名称  约束类型(字段名) 

外键

[constraint 约束名称 ] 约束类型(字段名) references 另一个表(另一个表的字段)

例2:添加表级约束

create table student(	id int,	name varchar(25),	sex char(1),	seat int,	age int,	majorId int,	--主键	constraint pk primary key(id),	constraint uq unique(seat),	constraint ck check(sex='男' or sex='女'),	constraint fk_stuindo_major foreign key(majorId)  references major(id));
2.修改表时:
1.添加非空约束

语法:

alert table 表名 modify column 字段名 类型(长度) not null;
2.添加默认约束

语法:

alert table 表名 modify column 字段名 类型(长度) default 值;
3.添加主键
1.列级约束

语法:

alert table 表名 modify column 字段名 类型(长度) primary key;
2.表级约束

语法:

alert table 表名 add primary key(字段名);
4.添加唯一约束
1.列级约束

语法:

alert table 表名 modify column 字段名  类型(长度)  unique;
2.表级约束

语法:

alert table 表名 	add unique(字段名);
5.添加外键

语法:

alert table 表名 add constraint 外键名称 foreign key(字段名)  refierences 外键的表(外键的字段名);

4.约束的添加分类

1.列级约束:

六大约束语法上都支持,但外键约束没有效果

2.表级约束

除了非空、默认,其他约束都支持

3.查看表中所有索引:
show index from 表名;

5.主键和唯一的区别

约束类型保证唯一性是否允许为空是否可多个是否允许组合
主键最多有一个允许,但不推荐
唯一可多个允许,但不推荐

6.外键的特点

1.要求在从表的外键列类型和主表的关联列的类型要求一致或兼容,名称没有要求
2.主表(字段作为外键的表)的关联列必须是一个key(一般是主键或唯一)
3.要求在从表设置外键关系
4.插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,再删除

7.修改表时删除约束

1.删除非空约束

语法:

alert table 表名 modify column 字段名 类型(长度) null;
2.删除默认约束

语法:

alert table 表名 modify column 字段名 类型(长度);
3.删除主键

语法:

alert table 表名 drop primary key ;
4.删除唯一

语法:

alert table 表名 drop index 字段名 ;
5.删除外键

语法:

alert table 表名 drop foreign key 外键名;

8.标识列(自增长列)

含义:可以不用手动的插入值,系统提供默认的序列值,默认从1开始,偏移为1

auto_increment

更改偏移:

set auto_increment_increment=值;

特点:
1、标识列必须和主键搭配吗?不一定,但要求是一个key(主键、唯一、外键或者自定义key)
2、一个表可以有几个标识列?至多一个!
3、标识列的类型只能是数值型(INT,FLOAT等)
4、标识列可以通过 SET auto_increment_increment=3;设置步长

六、TCL语言

Transaction Control Language : 事务控制语言

1.事务概念

事务:

事务由单独单元的一个或多个SQL语句组成, 在这个单元中, 每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。

一个最小的不可再分的工作单元。

一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行

2.特点(ACID)

1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency )
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3.隔离性(Isolation )
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4.持久性(Durability )
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

3.事务的创建

1.隐式事务

事务没有明显的开启和结束的标记
比如:insert、update、delete语句

2.显示事务

事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用

set autocommit=0;

步骤1:开启事务

set autocommit=0;
start transaction;

步骤2:编写事务中的sql语句
语句1;
语句2;

步骤3:结束事务
commit; //提交事务
rollback; //回滚事务

4.数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。

1.并发问题

1.脏读:对于两个事务T1, T2, T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚, T1读取的内容就是临时且无效的.
2.不可重复读:对于两个事务T1, T2, T1读取了一一个字段,然后T2更新了该字段之后, T1再次读取同一个字段,值就不同了。
3.幻读:对于两个事务T1, T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。

数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力。使它们不会相互影响,避免各种并发问题。

一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

2.隔离级别

READ UNCOMMITED(读未提交数据):允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现。
READ COMMITED(读已提交数据):只允许事务读取已经被其它事务提交的变更,可以避免脏读.但不可重复读和幻读问题仍然可能出现
REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值.在这个事务持续期间,禁止其他事物对这个字段进行更新.可以避免脏读和不可重复读,但幻读的问题仍然存在.
SERIALIZABL E(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作。所有并发问题都可以避免,但性能十分低下。

3.默认支持的事务级别

Oracle支持的2种事务隔离级别: READ COMMITED,SERIALIZABLE。Oracle 默认的事务隔离级别为: READ
COMMITED
Mysql支持4种事务隔离级别.Mysql默认的事务隔离级别默认为:REPEATABLE READ

4.设置隔离级别

每启动一个mysql程序,就会获得一个单独的数据库连。每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。
查看当前的隔离级别: SELECT @ @tx_ _isolation;
设置当前mySQL连接的隔离级别:
set transaction isolation level read committed;
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;

5.savepoint:保存点

savepoint搭配rollback使用

演示savepoint的使用

SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点

6.delete与truncate在事务中的区别

delete:在使用事务会根据事务的提交或回滚
truncate : 在使用事务时不会根据事务的提交或回滚来进行相应操作,truncate不管是执行还是回滚都会执行

七、视图

一、含义

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.分类

系统变量:
全局变量
会话变量
自定义变量:
用户变量
局部变量

2.系统变量

1.概念

变量是由系统提供的,不是用户定义,属于服务器层面

**注:**如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session

2.语法

1.查看所有系统变量
show global |  session variables;
2.查看满足条件的部分系统变量
show global | session.系统变量名  like  '%变量%';
3.查看指定的某个系统变量的值
select @@global | session .系统变量名;
4.为某个给系统变量赋值

方式一:

set @@global | session .系统变量名=值;

方式二:

set global | session 系统变量名=值;

**注:**如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果什么都不写,默认session。

3.系统变量中的全局变量

1.作用域

服务器每次启动将为多有的全局变量赋初始值,针对于所有的会话(连接)。但不能跨重启。

2.查看所有的全局变量
show global variables;
3.查看部分的全局变量
show global variables like '%变量%';
4.为某个指定的全局变量赋值
set @@global.系统变量名=值

例:

set @@global autocommit=0;   

4.系统变量中的会话变量

1.作用域

仅仅针对于当前会话(连接)

1.查看所有的会话变量
show variables;
或者
show session variables;
2.查看部分的会话变量
show session variables like '%变量%';
或者
show variables like '%变量%';
3.查看指定的某个会话变量
select @@session.变量名;
或者
select @@变量名;
4.为某个会话变量赋值
set @@session.变量名=值;
或者
set session 变量名=值;

3.自定义变量

1.概念

变量是用户自定义的,不是由系统定义

2.用户变量

1.作用域

针对于当前会话(连接)有效,同于会话变量的作用域

2.声明并初始化

赋值的操作符: =或 :=

set @用户变量名=值;
或
set @用户变量名:=值;
或
select @用户变量名:=值;

例1:

set @name='john';
3.赋值
set @用户变量名=值;
或
set @用户变量名:=值;
或
select @用户变量名:=值;
或
select 字段(或变量) into @用户变量名

例2:

select count(1) into @count
from employees;

3.局部变量

1.作用域

仅仅在定义它的begin end 中有效,且

2.声明

declare 变量名 类型;
或
declare 变量名 类型 default 值;

3.赋值

set 局本变量名=值;
或
set 局本变量名:=值;
或
select @局本变量名:=值;
或
select 字段 into 局本变量名 from 表;

4.使用

select 局本变量名;

九、存储过程和函数

1.存储过程

1.存储过程概念

说明:都类似于java中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字。
好处
1、提高重用性
2、sql语句简单
3、减少了和数据库服务器连接的次数,提高了效率

2.存储过程创建

create procedure 存储过程名(参数模式  参数名 参数类型)
begin
	存储过程体
end

注:
1、参数列表包含三部分:参数模式 参数名 参数类型
举例:
IN stuname VARCHAR(20)
参数模式:
IN: 该参数可以作为输入,也就是该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2、如果存储过程体仅仅只有一句话,BEGIN END可以省略
存储过程体中的每条sQL语句的结尾要求必须加分号。
存储过程的结尾可以使用 DELIMITER 重新设置
语法:
DELIMITER 结束标记
案例:
DELIMITER S

3.存储过程调用

call 存储过程名(实参列表)

在cmd中执行call需要加$ ,navicat不需要,但要加分号

1.空参列表

案例1:插入到admin表中五条记录

delimiter  $
create procedure  myp1()
begin
	insert into admin(username,password) values('zs','0000'),('ls','0000'),('ws','0000'),('as','0000'),('zg','0000');
end $

调用

call myp1() $
2.创建带in模式参数的存储过程

in可以省略

案例2:创建存储过程实现根据女神名,查询对应的男神信息

delimiter $
create procudure myp2(in beautyName varchar(20))
begin 
	select bo.*
	from boys bo
	left join beauty b on bo.id=b.id
	where b.name=beautyName;
end $

调用

call myp2('柳岩') $

案例3:创建存储过程实现,用户是否登录成功

delimiter $
CREATE PROCEDURE myp4|(IN username VARCHAR(20) , IN PASSWORD VARCHAR(20) )
BEGIN
DECLARE result VARCHAR(20) DEFAULT '' ;#声明并初始化
SELECT COUNT(*) INTO result #赋值
FROM admin
WHERE admin. username = use rname
AND admin. password = PASSWORD;
SELECT result; #使用
END $

#调用

CALL myp3('张飞', '8888') $
3.创建带out模式的存储过程

案例1:根据女神名,返回对应的男神名

CREATE PROCEDURE myp5 (IN beautyName VARCHAR(20) , OUT boyName VARCHAR(20) )
BEGIN
SELECT bo. boyName INTO boyName
FROM boys bo
INNER
JOIN beauty b ON bo.id = b.boyfriend id
WHERE b. name=beautyName;
END $

调用

CALL myp5(' 小昭' , @bName) $
SELECT @bName $
4.创建带inout模式参数的存储过程

案例1:传入a和b两个值,最终a和b都翻倍并返回

delimiter $
CREATE PROCEDURE myp8 (INOUT a INT , INOUT b INT)
BEGIN
SET a=a*2 ;
SET b=b*2 ;
END $
#调用
SET @m=10$
SET @n=20$
CALL myp8 (@m, @n)S
SELECT @m, @n$
4.查看存储过程
show create procedure 存储过程名;
5.删除存储过程
drop procedure  c

2.函数

1.函数概念

说明:都类似于java中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字。
好处
1、提高重用性
2、sql语句简单
3、减少了和数据库服务器连接的次数,提高了效率

2.函数与存储过程的区别

存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
函数:有且仅有1个返回,适合做处理数据后返回一个结果

3.创建函数语法

CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
	函数体
END

注:
1.参数列表包含两部分,参数名 参数类型
2.函数体:肯定会有return语句,如果没有会报错
如果return语句没有放在函数体的最后也不报错,但不建议

return值;
3.函数体中仅有一句话,则可以省略begin end
4.使用delimiter语句设置结束标记

4.调用语法

select 函数名(参数列表);

例1:无参有返回,返回公司的员工个数

delimiter $
create function muyf1() return int
begin
	declare  c int default 0;
	select count(*)  into c
	from employees;
	return c;
end $
#调用
select myf1() $

例2:有参有返回,根据员工名返回他的工资

delimiter $
create function myf2(empName varchar(20)) return double
begin
	set @sal=0;
	select salary into @sal
	from employees
	where last_name=empName; 
	retrun @sal;
end $

select myf2('K_ing');

5.函数的查看

show create function 函数名;

6.函数的删除

drop function 函数名;

十、流程控制结构

1.分类

顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

1.分支结构

1.if函数

功能:实现简单的双分支
语法:
if (表达式1,表达式2 ,表达式3)
执行顺序:
如果表达式1成立,则if函 数返回表达式2的值,否则返回表达式3的值
应用:任何地方

2.case结构

情况1:类似于java 中的switch语句,一般用于实现等值判断

语法:

CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1或语句1 ;
WHEN 要判断的值 THEN 返回的值2或语句2;
ELSE 要返回的值n或语句n;
END CASE ;
情况2:类似于java中的多重IF语句,一般用于实现区间判断

语法:

CASE
WHEN 要判断的条件1 THEN 返回的值1或语句1;
WHEN 要判断的条件2 THEN 返回的值2或语句2;
ELSE 要返回的值n或语句n;.
END CASE;
特点:

1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END中或BEGIN END的外面;可以作为独立的语句去使用,只能放在BEGIN END中
2.如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE
如果都不满足,则执行ELSE中的语句或值
3.ELSE可以省略,如果ELSE省略了 ,并且所有WHEN条件都不满足,则返回NULL

例:根据传入的成绩,来显示等级,比如传入的成绩: 90-100, 显示A, 80-90, 显示B,60-80, 显示C,否则,显示D

CREATE PROCEDURE test_ case (IN score INT )
]BEGIN
CASE 
WHEN score>=90 AND score<=100 THEN SELECT ' A' ;
WHEN score>=80 THEN SELECT ' B' ;
WHEN score>=60 THEN SELECT 'C' ;
ELSE SELECT 'D' ;
END CASE; 
END $
CALL test_ case(95) $

3.if结构

功能:实现多分支
语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if;

**位置:**只能放在begin end中

2.循环结构

1.位置

只能放在begin end中

1.分类

while、loop、repeat

2.循环控制语句:

iterate:类似于continue, 继续,结束本次循环,继续下一次
leave:类似于break,跳出,结束当前所在的循环

3.while

语法:

[名称:] while 循环条件 do
循环体
end while [名称] ;

2、loop
语法:

[名称: ] 1oop
循环体
end loop [名称] ;

3、repeat
语法:

[名称:] repeat
循环体
until结束条件
end repeat [名称] ;

对比

①这三种循环都可以省略名称,但如果循环中添加了循环控制语句 (leave或iterate)则必须添加名称
②loop一般用于实现简单的死循环
while先判断后执行
repeat先执行后判断,无条件至少执行一-次
tion muyf1() return int
begin
declare c int default 0;
select count(*) into c
from employees;
return c;
end $
#调用
select myf1() $


例2:有参有返回,根据员工名返回他的工资

delimiter $
create function myf2(empName varchar(20)) return double
begin
set @sal=0;
select salary into @sal
from employees
where last_name=empName;
retrun @sal;
end $

select myf2(‘K_ing’);


### 5.函数的查看

show create function 函数名;


### 6.函数的删除

drop function 函数名;


# 十、流程控制结构

## 1.分类

顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

## 1.分支结构

### 1.if函数

功能:实现简单的双分支
语法:
if (表达式1,表达式2 ,表达式3)
执行顺序:
如果表达式1成立,则if函 数返回表达式2的值,否则返回表达式3的值
应用:任何地方

### 2.case结构



#### 情况1:类似于java 中的switch语句,一般用于实现等值判断

语法:

CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1或语句1 ;
WHEN 要判断的值 THEN 返回的值2或语句2;
ELSE 要返回的值n或语句n;
END CASE ;




#### 情况2:类似于java中的多重IF语句,一般用于实现区间判断

语法:

CASE
WHEN 要判断的条件1 THEN 返回的值1或语句1;
WHEN 要判断的条件2 THEN 返回的值2或语句2;
ELSE 要返回的值n或语句n;.
END CASE;


#### 特点:

1.可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,BEGIN END中或BEGIN END的外面;可以作为独立的语句去使用,只能放在BEGIN END中
2.如果WHEN中的值满足或条件成立,则执行对应的THEN后面的语句,并且结束CASE
如果都不满足,则执行ELSE中的语句或值
3.ELSE可以省略,如果ELSE省略了 ,并且所有WHEN条件都不满足,则返回NULL

例:根据传入的成绩,来显示等级,比如传入的成绩: 90-100, 显示A, 80-90, 显示B,60-80, 显示C,否则,显示D

CREATE PROCEDURE test_ case (IN score INT )
]BEGIN
CASE
WHEN score>=90 AND score<=100 THEN SELECT ’ A’ ;
WHEN score>=80 THEN SELECT ’ B’ ;
WHEN score>=60 THEN SELECT ‘C’ ;
ELSE SELECT ‘D’ ;
END CASE;
END $
CALL test_ case(95) $


### 3.if结构

功能:实现多分支
语法:

if 条件1 then 语句1;
elseif 条件2 then 语句2;

else 语句n;
end if;


**位置:**只能放在begin end中

## 2.循环结构

### 1.位置

只能放在begin end中

### 1.分类

while、loop、repeat

### 2.循环控制语句:

iterate:类似于continue, 继续,结束本次循环,继续下一次
leave:类似于break,跳出,结束当前所在的循环

### 3.while

语法:

[名称:] while 循环条件 do
循环体
end while [名称] ;


2、loop 
语法:

[名称: ] 1oop
循环体
end loop [名称] ;


3、repeat
语法:

[名称:] repeat
循环体
until结束条件
end repeat [名称] ;






### 对比

①这三种循环都可以省略名称,但如果循环中添加了循环控制语句      	(leave或iterate)则必须添加名称
②loop一般用于实现简单的死循环
	while先判断后执行
	repeat先执行后判断,无条件至少执行一-次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值