mysql基本语法笔记

:[]中的可写可不写

-- # :单行注释,写在语句开头,换行后注释截止。

/**/:多行注释,在注释区域内可以随意换行

DDL:定义数据库对象(数据库,表,字段)

数据库操作

查询数据库:show databases;

使用数据库:use 库;

创建数据库:create database 库 [charset=utf8] [ comment 表注释];

删除数据库:drop database 库;

表操作

查看表:show tables;

查看表结构:desc 表;

查看建表语句(详细信息):show create table 表;

创建表:
create table 表(         varchar(长度) 文本类型
                         data         日期类型
列名称 列类型,             timestamp    时间戳类型
列名称 列类型,
……
)comment '注释';
修改表:
# 修改表名
alter table 表 rename to 新表;
删除表:
1)drop table 表; 
2)drop table if exists 表;
# 删除表,并重新创建该表
3)truncate table 表;
新增表字段:
alter table 表 add 字段名 类型(长度) [comment 注释];

例:alter table student add id varchar(20) ;
修改表字段:
# 修改字段名和字段类型
1)alter table 表 change 旧字段 新字段 类型(长度) [comment 注释];
# 修改字段类型
2)alter table 表 modify 字段 新类型(长度);
删除表字段:
alter table 表 drop 字段;

DML:表数据操作

删除表数据:
1)delete from 表 (where 条件)

注:在同一表中查询的数据作为同一表的更新数据。

2)truncate 表名,清空表数据

例:删除表中id小于4的数据
delete from student where id < 4;
插入表数据:
1)insert into 表(列1,列2……) values(值1)(值2)……
#插入少量数据
2)insert into student(id) values(1001),(1002)。。。
#插入全部列数据
3)insert into studnet(id,name,age) values(1001,'zhangsan',24)。。。。
#插入全部列数据 快捷写法
4)insert into studnet values(1001,'zhangsan',24)...
更新表数据:
update 表 set 列=值 [where 条件]

例:将年龄等于20的学生姓名修改为'zhangsan'

update student set name='zhangsan' where age = 20;

DQL:查询表记录

运行顺序:where > group >having>select > distinct>order > limit distinct :去重

基本结构
select 字段
from 表
where 条件  # 条件查询
group by 列 # 按照某列分组
order by 列 [ASC小到大 | DESC大到小] # 按照某列排序
having  一般需要前有group by分组,having对组内数据进行约束
limit [n,m] # 从n开始数m条数据,以下标记
查询表数据
select 字段列表(可以多个,","分隔) from 表 [where 条件]
1)# 查询全部数据
select * from student;
2)# 去除重复记录
select distinct 字段 from 表;
3)# 设置别名,as可省略
select 字段 AS 别名,字段 AS 别名...from 表; 
like:模糊查询
a%以a开头的字符串
_a%第二个字符为a的字符串,_的个数代表前有多少个字符
a%b_以a开头,然后是任意多个字符,接着是b,最后是一个人员字符
COLLATE utf8mb4_general_ci不区分大小写
%a以a结束的字符串
-- 查询课程名 name 以字母 'D' 开头的所有课程信息

SELECT * from courses where name like 'D%'

注:%匹配任意字符,_下划线匹配单个字符

例:

选择姓氏以 'smi' 开头的所有员工,不区分大小写。

SELECT * FROM employees WHERE last_name LIKE 'smi%' COLLATE utf8mb4_general_ci;
条件查询
# 在某一范围内 前小后大

between...and 
例:select * from student where age between 15 and 20;

# 是null
is null
分组聚合
select 字段,聚合函数(字段).... from 表 [where 条件] group by 字段 having 分组后的过滤条件;

select 后的字段需要与 group by后的字段保持一直,不能超过group by后的字段量

执行顺序: where > 聚合函数 > having,判断条件不同:where不能对聚合函数进行判断,而having可以。

聚合函数:sum(字段)、avg(字段) 平均、min(字段)、max(字段)、 count(字段) 求数量

1)# 根据性别获取平均年龄
select gender, avg(age) from student group by gender;

2)# 获取年龄小于45的员工,并根据地址分组,再获取员工数量大于3的地址
select address,count(*) address_count(别名) from 表 where age < 45 group by address having(对结果再加条件) address_count >= 3;

排序查询
select 字段 from 表 order by 字段 排序方式;

# 先根据年龄升序排序,年龄相同再根据入职时间降序排序
select * from student order by age asc, enterdate desc;

注 where、group by、order by、limit 可按需要省略

DCL:创建数据库用户,控制数据库的访问权限

用户管理
1)# 查询用户
use mysql
select * from user;

2)# 创建用户
create user '用户名'@'主机名' IDENTIFIED BY '密码'

3)# 修改用户密码
alter user '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'

4)# 删除用户
DROP USER '用户名'@'主机名'
权限控制
1)# 查询权限
show grants for '用户名'@'主机名'

2)# 授予权限
grant 权限 on 库.表 to '用户名'@'主机名'

3)# 撤销权限
revoke 权限 on 库.表 from '用户名'@'主机名'

函数

字符串函数
1)concat(s1,s2,s3)字符串拼接

2)lower(str)全部转换为小写,upper(str)全部转换为大写

3)lpad(str,n,pad)对str左填充n个字符,rpad(str,n,pad)对str右填充n个字符

4)trim(str)去除字符串头部和尾部的空格

5)substring(str,start,len) 返回从字符串start起len个长度的字符串

例:
select concat('hello','mysql')
数值函数
1)ceil(x)向上取整,floor(x)向下取整

2)mod(x,y)返回x/y的模(余数),rand()返回0~1内的随机数

3)round(x,y) 求x的四舍五入的值,保留y位小数
例:
select rand();
日期函数
1)curdate()返回当前日期,	curtime()返回当前时间,	now()返回现在的日期和时间
2)year(date)返回指定date的年份,	month(date)返回指定date的月份,		day(date)返回指定date的日期
3)datediff(date1,date2)返回date2与date1之间的天数

4)date_add(date,interval expr type)返回一个时间值加上一个时间间隔expr后的时间值
例:
# 从现在向后推70天
select date_add(now(),interval 70 day)
select datediff('2021-11-12','2022-03-05')

例句 RANGE INTERVAL 6 DAY PRECEDING指定了窗口的大小为当前行加上前面六天的数据
SELECT visited_on, 
SUM(amount) OVER (ORDER BY visited_on RANGE interval 6 day preceding) AS amount
FROM  Customer


%Y:年(四位数)
%m:月(01-12)
%d:日(01-31)
%H:时(00-23)
%i:分(00-59
%s:秒(00-59)
SELECT date_format(current_date,'%Y-%m-%d')
流程函数
with

with as 子查询仅执行一次,将结果存储在用户临时表中,

1)–相当于建了个e临时表
with e as (select * from scott.emp e where e.empno=7499)
select * from e;

2)–相当于建了e、d临时表
with
e as (select * from scott.emp),
d as (select * from scott.dept)
select * from e, d where e.deptno = d.deptno;


其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它.
if
# 如果value为true返回a,否则返回b
select if(value,a,b)
if null
# 如果value1不为空返回value1,否则返回value2
ifnull(value1,value2)
case when
1)CASE WHEN [value] THEN 结果1 ELSE 结果2 END

如果value为true返回结果1,否则返回结果2

2)CASE [列1] WHEN [value2] THEN 结果1 ELSE 结果2 END

在列1中,value1的值为True,返回结果1,否则返回结果2

3)# 查询员工姓名和工作地址(北京/上海-->一线城市,其他-->二线城市)
select name,
(case workadress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;

约束

约束描述关键字
非空约束限制该字段的数据不能为空not null
唯一约束保证该字段的所以数据唯一unique
主键约束主键一行是唯一标识primary key
默认约束保存数据时,采用默认值default
检查约束保证字段值满足某一条件check
外键约束用来让两张表的数据之间建立联系foreign key
外键约束
# 创建表添加外键
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
# 给已有表添加外建
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名)
REFERENCES 主表 (主表列名) ;
# auto_increment 自动增长

create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
)comment '员工表';
删除外键、主键
ALTER TABLE 表名 DROP FOREIGN(primary) KEY 外键名称; 
删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行 为有以下几种:

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不 允许删除/更新。 (与 RESTRICT 一致) 默认行为
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不 允许删除/更新。 (与 NO ACTION 一致) 默认行为
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则 也删除/更新外键在子表中的记录。
SET NULL 当当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表 中该外键值为null(这就要求该外键允许取null)。
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)

具体语法为:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

例:CASCADE

alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

然后修改父表id为1的记录,将id修改为6,我们发现,父表的数据删除成功了,但是子表中关联的记录也被级联删除了。

多表查询

-- 创建dept表,并插入数据
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');

-- 创建emp表,并插入数据
create table emp(
id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';

-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);

-- 插入数据
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
    (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);

dept表共6条记录,emp表共17条记录。

外键约束
-- 添加外键,创表的时候用
constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);
-- 将dept_id作为外键,别名为fk_emp_dept_id,并依赖于dept表id

-- 表创建好了,再修改添加
alter table 表 add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);

当给从表添加数据时,必须依赖主表的约束
内连接:求多张表的交集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1)     隐式内连接
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

2)     显式内连接 就是把表之间的逗号换成join,把where换成on
SELECT 字段列表 FROM 表1 [ INNER 可省略] JOIN 表2 ON 条件 ... ;

例:查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

表结构: emp , dept

连接条件: emp.dept_id = dept.id

select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;

-- 为每一张表起别名,简化SQL编写
select e.name,d.name from emp e , dept d where e.dept_id = d.id;

同样条件(显式内连接实现)

select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;

-- 为每一张表起别名,简化SQL编写
select e.name, d.name from emp e join dept d on e.dept_id = d.id;
外连接:分左右

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1)A inner join B:取交集

2)A left join B:取A全部,B没有对应的值,则为null

3)A right join B:取B全部,A没有对应的值,则为null

4)A full outer join B:取并集,彼此没有对应的值为null

上述4种的对应条件,在on后填写。

外连接分为两种,分别是:左外连接 和 右外连接。具体的语法结构为:

1)左外连接
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;

2)右外连接
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;

左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。

右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;

select e.*, d.name from emp e left join dept d on e.dept_id = d.id;
自连接

自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接 的查询语法:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;

查询员工 及其 所属领导的名字
表结构: emp
select a.name , b.name from emp a left join emp b on a.managerid = b.id;
联合查询

对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
  • union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

例:将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

select * from emp where salary < 5000
union all
select * from emp where age > 50;

union 联合查询,会对查询出来的结果进行去重处理。

子查询

常用关键字:All、any、some、in、exists

格式:

1)all 
select……from……where c <(可换) all(查询语句)

2)any、some
select……from……where c <(可换) any/some(查询语句)

3)in
select……from……where c in (查询语句)

4)exists
select……from……where exists (查询语句)

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后

例: 查询 "销售部" 的所有员工信息

1)  查询 "销售部" 部门ID
select id from dept where name = '销售部';

2)  根据 "销售部" 部门ID, 查询员工信息
select * from emp where dept_id = (select id from dept where name = '销售部');

事务

事务:是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

数据准备

drop table if exists account;

create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐 式的提交事务。

控制事务一
1)     查看/设置事务提交方式
        SELECT @@autocommit ;
        SET @@autocommit = 0 ;   # 设置手动提交
2)     提交事务
        COMMIT;    # 若没有异常保存,执行此命令提交事务,相应的表就会发生改变
3)    回滚事务
        ROLLBACK;   # 当报错异常,需要执行此命令,保证数据的安全

注意:上述的这种方式,我们是修改了事务的自动提交行为,把默认的自动提交修改为了手动提交,此时我们执行的DML语句都不会提交,因此对应的表不会有变动,需要手动的执行commit进行提交。

控制事务二
1)开启事务
START TRANSACTION 或 BEGIN ;

2)提交事务
COMMIT;

3)回滚事务
ROLLBACK;

例:转账案例

-- 开启事务
start transaction

-- 1. 查询张三余额
select * from account where name = '张三';

-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';

-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

-- 如果正常执行完毕, 则提交事务
commit;

-- 如果执行过程中报错, 则回滚事务
-- rollback;
事务四大特性
  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立 环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。 上述就是事务的四大特性,简称ACID。
并发事务问题
赃读:一个事务读到另外一个事务还没有提交的数据。

不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据
已经存在,好像出现了 "幻影"。
事务隔离级别
隔离级别脏读不可重复读幻读
Read uncommitted111
Read committed011
Repeatable Read(默认)001
Serializable000
 查看事务隔离级别
 SELECT @@TRANSACTION_ISOLATION;
 
 设置事务隔离级别  SESSION代表当前会话,GLOBAL代表全局
 SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

例:SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

注意:事务隔离级别越高,数据越安全,但是性能越低。

窗口函数

window function (expr) over(
partition by
order by
frame_clause
)

1)expr 是参数,有些函数不需要参数
2)partition by 用于将数据拆分成多个分区,类似group by
3)order by 指定分区内的排序方式
序号函数

row_number()、rank()、dense_rank() 可以用来实现分组排序,并添加序号

格式:

row_number()|rnak()|dense_rank() over(
partition by
order by
)

对每个地区的员工按照薪资排序,并给出排名

-- 对每个地区的员工按照薪资排序,并给出排名
--  ROW_NUMBER(),当工资相同时,排序依次增加
SELECT name,address,revene,ROW_NUMBER() OVER (
    PARTITION BY address  -- 按照地区分组
    ORDER BY revene DESC  -- 按照工资降序排
    ) as rn FROM employee;


-- rank(),当工资相同时,排序并列
SELECT name,address,revene,rank() OVER (
    PARTITION BY address  -- 按照地区分组
    ORDER BY revene DESC  -- 按照工资降序排
    ) as rn FROM employee;
    
--  dense_rank(),当工资相同时,排序并列,依次
SELECT name,address,revene,dense_rank() OVER (
    PARTITION BY address  -- 按照地区分组
    ORDER BY revene DESC  -- 按照工资降序排
    )as rn FROM employee;
拓展
-- 分组求每个地区第一名

-- 把(对每个地区的员工按照薪资排序,并给出排名)当成结果表
-- 使用子查询
SELECT * FROM (
SELECT
    name,
    address,
    revene,
    dense_rank() OVER (
    PARTITION BY address
    ORDER BY revene DESC
        ) as RN FROM employee
    ) t WHERE t.RN =1;
分布函数

cume_dist() 、percent_rank()

用途:分组内小于、等于、当前rank值的行数/分组内总行数

应用场景:查询小于等于当前薪资的比例

-- cume_dist()
SELECT
    id,
    name,
    address,
    revene,
    cume_dist()
            OVER (
                PARTITION BY address -- 按照地址分组
                ORDER BY revene -- 按照薪水的排序,以薪水为标准排序
                ) as average FROM employee;

开窗聚合函数

使用聚合函数sum()等,可以动态计算在指定的窗口内的各种聚合函数值。

-- 开窗聚合函数
SELECT
    name,
    address,
    revene,
    sum(revene) -- 求出的是每一组的累加值
    OVER (
    PARTITION BY address -- 按照地址分组
    ORDER BY id -- id排序
        ) as average FROM employee;

-- 如果不使用ORDER BY排序,默认将分组内所有数据相加
SELECT
    name,
    address,
    revene,
    sum(revene) -- 求出的是每一组的累加值
    OVER (
    PARTITION BY address -- 按照地址分组
        ) as average FROM employee;

-- 使用BETWEEN 起始位置 AND 结束位置,给计算增加范围
SELECT
    name,
    address,
    revene,
    sum(revene) -- 求出的是每一组的累加值
    OVER (
    PARTITION BY address -- 按照地址分组
        ORDER BY id -- 按照id排序
        -- 只从当前行的前三行开始加
        ROWS BETWEEN 3 PRECEDING AND current row
        ) as average FROM employee;
前后函数

lag、lead

用途:返回位于当前行的前n行lag(expr,n)或lead(expr,n)的值。

应用场景:查询前1名同学的成绩和当前同学成绩的差值

SELECT
    name,
    salary,
    dept_id,
    entrydate,
    lag(entrydate,1) OVER (
        PARTITION BY dept_id
        ORDER BY entrydate DESC
        ) as one FROM emp;

得到的结果为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而lead的用法只需要替换lag即可,得到下一行的结果。

头尾函数

first_value(expr)、 last_value(expr)

用途:返回第一个或最后一个expr的值。

-- 按照部分分组,找到入职时间的第一个入职员工的工资
SELECT
    name,
    entrydate,
    emp.dept_id,
    salary,
    first_value(emp.salary) OVER (
        PARTITION BY emp.dept_id -- 按照部门分组
        ORDER BY emp.entrydate ASC -- 按照入职时间排序
        ) AS first from emp;
其他函数

nth_value(expr,n)、ntile(n)

用途:返回窗口中第n个expr的值

常用积累

date_format(pay_date,‘%Y-%m’) 返回年份和月份

ROWS BETWEEN CURRENT ROW and 1 FOLLOWING(perceding)   返回当前行和下一行(前一行)的数据

SELECT *,sum(price) OVER (
    ORDER BY products.pid ROWS BETWEEN CURRENT ROW and 1 FOLLOWING
    ) as rn from products;

索引

主键索引:主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行数据

唯一索引:唯一索引要求索引列的值在整个表中必须是唯一的,用于确保数据的唯一性。

b-tree索引:B-tree(Balance Tree)索引是最常见的索引类型,适用于等值查询、范围查询和排序。

视图

是一个虚拟的表,本身不具有数据,可以像表一样去操作视图

视图建立在已有表的基础上,可以将视图理解为存储起来的select语句

对于视图的操作不会影响基表

  • 创建
create [or replace] view 视图名称 
as 
select语句 [with[cascaded | local] check option]

-- or replace 可省略
-- with[cascaded | local] check option 不满足条件就不允许操作
-- cascaded检查所有有联系的视图,local只检查本视图
  • 查询
查看创建视图语句:show create view 视图名称

查看视图数据(同查表数据方式相同):select * from 视图名称
  • 修改
1)create [or replace] view 视图名称 as select语句 [with[cascaded | local] check option] # 和创建一样,通过新的覆盖旧的
2)alter view 视图名称 as select语句 [with[cascaded | local] check option]
  • 删除
drop view [if exists] 视图名称

触发器

  • 创建
create trigger 名字 
before/after insert/update/delete 
on tbl_name For each row -- 行级触发器
begin
	逻辑
end
  • 查看

show triggers;

  • 删除

drop trigger 名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值