MySQL之DQL、DDL、DML、TCL和函数、视图、存储过程的用法


mysql 语句通用框架和执行顺序

  • 5 -【select 字段|表达式】
  • 1 -【from 表】
  • 2 -【where 条件】
  • 3 -【group by 分组字段】
  • 4 -【having 条件】
  • 6 -【order by 排序的字段】
  • 7 - 【limit 起始位置,条目数】

1、MySQL入门命令

  • 1.show databases;查看当前所有的数据库
  • 2.show tables;查看当前库的所有表
  • 3.use database;使用某个库
  • 4.desc tablename;查看表结构
  • 5.create table tablename 创建表
create table tablename(
	列名 列类型,
	...);

2、DQL 数据查询语言

Data Query Language 数据查询语言,主要是做查询,包括简单查询和复杂查询

1)简单查询

select * from table;
select name from stuinfo;

  • select查询的结果是一个虚拟表,要查询的内容可以是常量值、字段或者函数

2)带条件的筛选查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:

select 
	字段|表达式|常量值|函数
from 
	table
where 
	condition ;

条件查询

  • 条件表达式: 字段 运算符 值

age>32

  • 二、逻辑表达式

示例:age>21 and age<=50

  • 逻辑运算符:

and:两个条件同时成立,结果为true,否则为false
or:两个条件只要有一个成立,结果为true,否则为false
not:取反

  • 三、模糊查询 字段 like “%”

示例:name like ‘%Joe%’

3)order by 排序

asc表升序排序,desc表示降序排序,具体语法如下

select
	字段
from
	table
where 
	条件
order by 表达式 asc|desc

4)常见函数

1)单行函数
  • 1、字符函数

    concat(a, “srr”, b) 把a和b用str拼接,像python的join
    substr(str, len) 从str中截取子串,截取长度为len
    upper(str) 把str全部转换成大写
    lower(str) 把str转换成小写
    trim(str) 去前后指定的空格和字符
    ltrim 去左边空格
    rtrim 去右边空格
    replace(str, ‘a’ ,‘b’) 把str字符串中a给替换成b
    lpad 左填充
    rpad 右填充
    instr 返回子串第一次出现的索引
    length(str) 获取字节个数,一个中文3个字节长度

  • 2、数学函数

    round() 四舍五入
    rand() 随机数
    floor()向下取整
    ceil()向上取整
    mod()取余
    truncate()截断

  • 3、日期函数

    now当前系统日期+时间
    curdate当前系统日期
    curtime当前系统时间
    str_to_date 将字符转换成日期
    date_format将日期转换成字符

  • 4、流程控制函数

    if 处理双分支
    case语句 处理多分支
    情况1:处理等值判断
    情况2:处理条件判断

  • 5、其他函数

    version版本
    database当前库
    user当前连接用户

2)分组函数

sum 求和
max 最大值
min 最小值
avg 平均值
count 计数

特点:
1、以上五个分组函数都忽略null值,除了count(*)
2、sum和avg一般用于处理数值型 max、min、count可以处理任何数据类型
3、都可以搭配distinct使用,用于统计去重后的结果
4、count的参数可以支持:字段、常量值 ,建议使用 count()

5)分组查询

语法

select 
	分组字段,统计函数
from 
	table
group by 
	分组字段

特点:

1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选
针对的表 位置 关键字
分组前筛选: 原始表 group by的前面 where
分组后筛选: 分组后的结果集 group by的后面 having
4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名

6)表与表的关联查询

建议使用以下三种方式

  • 内连接:表A inner join 表B,查询结果没有NULL值,等价于根据某个字段取交集
  • 左连接:表A left join 表B,以表A为主表,等价于根据某个字段取交集,表B无法匹配的用NULL值填充
  • 外连接:表A outer join 表B,输出结果为3部分,表A+表B+相互无法匹配的填充为NULL
select 字段,...
from1
inner|left outer|right outer|cross join2 on  连接条件
where 条件
group by 分组字段
having 分组后的筛选条件
order by 排序的字段或表达式

7)子查询

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询在外面的查询语句,称为主查询或外查询。
特点:

1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替

8)查询结果合并 UNION、UNION ALL

  • UNION 等价于查询结果取并集
  • UNION ALL 等价于两个表上下直接堆叠
    特点:

1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重

3)DML数据控制语言

1)插入 insert into table

语法:

insert into 表名(字段名,...) values(1...);
--案例: INSERT INTO books(id, bname, author_birth) VALUES(1,'alex',20);

特点:

1、字段类型和值类型一致或兼容,而且一一对应
2、可以为空的字段,可以不用插入值,或用null填充
3、不可以为空的字段,必须插入值
4、字段个数和值的个数必须一致
5、字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致

2)修改 update table

语法:

update1 别名1,2 别名2
set 字段=新值,字段=新值
where 连接条件
and 筛选条件

3)删除

  • delete语句

单表的删除 delete from 表名 【where 筛选条件】

  • 多表的删除

delete 别名1,别名2
from 表1 别名1,表2 别名2
where 连接条件
and 筛选条件;

  • truncate语句

truncate table 表名

两种方式的区别

1.truncate不能加where条件,而delete可以加where条件。
2.truncate的效率高一丢丢。
3.truncate 删除带自增长的列的表后,如果再插入数据,数据从1开始。delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始。
4.truncate删除不能回滚,delete删除可以回滚。

4、DDL数据定义语句

DDL语言(数据定义语言)针对【库和表】

1)库和表的管理

1)库的管理

一、创建库
create database 库名
二、删除库
drop database 库名

2)表的管理
1)表的创建
CREATE TABLE IF NOT EXISTS stuinfo(
	stuId INT,
	stuName VARCHAR(20),
	gender CHAR,
	bornDate DATETIME)
2)表的修改
  • ①修改字段名update table tbname change column old new type
ALTER TABLE studentinfo CHANGE  COLUMN sex gender CHAR;
  • ②修改表名 ALTER TABLE tbname RENAME [TO] newname;
ALTER TABLE stuinfo RENAME [TO]  studentinfo;
  • ③修改字段类型和列级约束ALTER TABLE tbname MODIFY COLUMN newname type ;
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
  • ④添加字段 ALTER TABLE tbname ADD COLUMN newname VARCHAR(20) ;
ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20);
  • ⑤删除字段
ALTER TABLE studentinfo DROP COLUMN email;
  • ⑤表的复制
CREATE TABLE copy1 LIKE books;
CREATE TABLE copy2 SELECT * FROM books;
3)表的删除
drop table if exists tablename;

5、TCL事务控制语言

1)事务

事务:一组sql语句组成一个执行单元,要么一起执行,要么都不执行。

事务属性:ACID

原子性:事务不可再分
一致性:从一个一致性状态转移到另一个一致性状态
隔离性:事务之间互不干扰(与隔离级别有关)
持久性:事务一旦提交,就不可修改,也就是永久修改。

显示事务:事务必须有明显的开启和结束标记,
前提:必须先禁用自动提交功能。
步骤:

1、set autocommit=0; 开启事务取消自动提交事务的功能
2、编写事务的一组逻辑操作单元(多条sql语句)
insert
update
delete
3、提交事务或回滚事务

2)使用到的关键字

set autocommit=0;
start transaction;
commit;
rollback;

savepoint  断点
commit to 断点
rollback to 断点

3)事务的隔离级别

  • 事务并发问题如何发生?

当多个事务同时操作同一个数据库的相同数据时

  • 事务的并发问题有哪些?

【脏读】:对于两个事务T1,T2,T1读取了已经被T2更新没有提交,若T2回滚,T1读取的内容就是临时且无效的。
【不可重复读】:t1读取,然后t2更新了该字段,t1再次读取同一个字段,值就不同了
【幻读】:t1,t2,在t2插入了一些新的行之后,t1再读取,就会多几行。

  • 如何避免事务的并发问题?通过设置事务的隔离级别

1、READ UNCOMMITTED
2、READ COMMITTED 可以避免脏读
3、REPEATABLE READ 可以避免脏读、不可重复读和一部分幻读
4、SERIALIZABLE可以避免脏读、不可重复读和幻读

  • 设置隔离级别
set session|global  transaction isolation level 隔离级别名;
  • 查看隔离级别:
select @@tx_isolation;

2)视图

含义:理解成一张虚拟的表
视图和表的区别:
在这里插入图片描述

视图的优点:

1、sql语句提高重用性,效率高
2、和表实现了分离,提高了安全性

1)视图的创建
CREATE VIEW  视图名
	AS
	查询语句;
2)视图的增删改查
  • 1、查看视图的数据
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';
  • 2、插入视图的数据
INSERT INTO my_v4(last_name,department_id) VALUES('虚竹',90);
  • 3、修改视图的数据
UPDATE my_v4 SET last_name ='梦姑' WHERE last_name='虚竹';
  • 4、删除视图的数据
DELETE FROM my_v4;
3)某些视图不能更新

包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
常量视图
Select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表

4)视图逻辑的更新
#方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;

#方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;
SELECT * FROM test_v7;
4)视图的删除

DROP VIEW test_v1,test_v2,test_v3;

5)视图结构的查看

DESC test_v7;
SHOW CREATE VIEW test_v7;

6、变量

(1)系统变量:包含全局变量和会话变量,该类变量由系统提供,属于服务器

# 查看系统变量:
show global VARIABLES;
# 为某个系统变量赋值:
set global autocommit=1;

(2)自定义变量: 用户变量和局部变量
使用步骤: 声明===》赋值===》使用

  • 用户变量,作用域:针对当前会话有效,同于会话变量的作用域。

1)用户变量

1)用户变量声明并初始化 =或:=

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

2)用户变量赋值

方式一:通过select 或者 SET

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

方式二:通过select into

select X into 变量名 from 表

案例:

set @name2='alex';
set @name1:='frank';
select @name2, @name1;

select count(*) into @count from employees;
select @count;

在这里插入图片描述

2)局部变量

局部变量的作用域:仅仅在定义它的begin end中有效,l例如存储过程、函数。且往往是在是sql的第一句

1)局部变量声明

declare 变量名 类型;
declare 变量名 类型 DEFAULT 值;

2)局部变量赋值
  • 方式一:通过select 或者 SET

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

  • 方式二:通过select into

SELECT 字段 INTO 变量名 FROM 表

3)局部变量使用

select 局部变量名;

7、存储过程

含义:一组经过预先编译的sql语句的集合
优点:

1、提高代码的重用性
2、简化操作
3、减少编译次数和数据库连接次数,提高效率

分类:

1、无返回无参
2、仅仅带in类型,无返回有参
3、仅仅带out类型,有返回无参
4、既带in又带out,有返回有参
5、带inout,有返回有参
注意:in、out、inout都可以在一个存储过程中带多个

1)创建存储过程

create procedure 存储过程名(in|out|inout 参数名  参数类型,...)
begin
	存储过程体
end

注意:

  • 1、需要设置新的结束标记 delimiter 新的结束标记

示例:

delimiter $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
BEGIN
	sql语句1;
	sql语句2;
END $
  • 2、存储过程体中可以有多条sql语句,如果仅仅一条sql语句,则可以省略begin end

  • 3、参数前面的符号的意思

in:该参数只能作为输入 (该参数不能做返回值)
out:该参数只能作为输出(该参数只能做返回值)
inout:既能做输入又能做输出

2)调用存储过程

  • call 存储过程名(实参列表)
    这边举一个实际例子吧
delimiter $
CREATE PROCEDURE myp6(INOUT a INT, INOUT b INT)
BEGIN
		SET a = POWER(a,2);
		SET b = power(b,2);
END $

SET @a=10;
SET @b=5;
CALL myp6(@a, @b) ;
SELECT @a, @b ;

8、函数

函数和存储过程实现的功能差不多,但是有略微区别,函数可以直接返回值

1)创建函数

CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型
BEGIN

	函数体
END

2)调用函数

SELECT 函数名(实参列表)

3)函数和存储过程的区别

类别关键字调用语法返回值应用场景
函数FUNCTIONSELECT 函数()仅有一个一般用于查询结果仅为一个值并需要返回时
存储过程PROCEDURECALL 存储过程()可以有0个或多个一般用于更新

案例:

CREATE FUNCTION sumtwo(a FLOAT, b FLOAT) RETURNS FLOAT
BEGIN
		DECLARE c FLOAT DEFAULT 0; 
		SET c=a+b;
		RETURN c;
END  
SELECT sumtwo(1.3, 2.4) 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值