赞
踩
目录
1.DDL数据库操作(dataBase definition language(数据定义语言)
2.DML数据库操作(dataBase Manipulation language(数据操作语言)
3.DQL数据库操作(dataBase query language(数据查询语言))
5 触发器(只有,insert/delete/update时才会触发)
6 视图(由数据库中一张表或者多张表根据特定的条件查询出的数据构造成的虚拟表
## 查看指定数据库创建时的sql指令
show databases
## 查看指定数据库创建时的sql指令
show create database graduation_wz
## 创建数据库
create database graduation_wz
## 创建数据库 如果不存在
create database if not exists graduation_wz
## 创建数据库 并设置编码
CREATE database if not exists graduation_wz character set utf8
##删除数据库
drop database if exists <dbname>
##使用数据库
use <dbname>
## 查看所有数据表
SHOW TABLES
## 查看表的详情
DESC <tableName>
## 删除表如果表存在
DROP table if exists <tableName>
## 修改表名
ALTER TABLE tb_store RENAME store
## 修改表的字符集,默认和数据库一样
alter table store character set utf8
## 添加字段
alter table store add store_type varchar(100)
## 删除字段
alter table store drop column store_type
## 修改字段的类型
alter table store modify store_states varchar(200)
## 修改字段的列名和类型
alter table store change store_states states varchar(2)
## 删除表的主键约束
alter table store drop primary key
## 删除表的外键约束 (删除需要带上外键名称)
alter table store drop foreign key PK_STUDENT_CLASS
## 添加表的主键约束
alter table store modify store_id varchar(32) primary key
# 常见约束?
# 1.非空约束(not null): 限制此列的值必须提供,不能为null
# 2.唯一约束(unique): 在表中该列的值不能重复
# 3.主键约束(primary key): 非空+唯一 能够唯一标识数据表中的一条数据
# 4.外键约束(foreign key): 建立不同表之间的关联关系
- ## 插入语句
- insert into test values('1','张三')
- insert into test ( id ) values ('2')
-
- ## 删除语句
- delete from test
-
- ## 修改语句
- update test set id = '1',name = '李四' where id = '1'
- ## 多条件查询连接关键字(and, or,not(取反))
- select * from test where id not between '1' and '2'
-
- ## 模糊查询(%表示任意多个字符,_表示一个字符)
- select * from test where name like '%李四'
-
- ## 查询去重复
- select distinct * from test
-
- ## 排序asc(升序) desc(降序)先按照id进行排序,如果id相同的再通过name排序
- select * from test order by id desc,name desc
## 日期函数
## 当我们向日期类型的列添加数据时,可以通过字符串类型赋值(字符串格式必须为yyyy-MM-dd hh:mm:ss)
## 获得当前时间 用 now() 或者 sysdate()
## 字符串函数
- ## upper()将字段的英文字母转化成大写 lower()将字段的英文字母转化成小写
- select upper(name) from test
- select lower(name) from test
- ## substring()截取字符串,concat(col,col)
- select substring(name,1,1) from test
- select concat(id,'-',name) from test
## 分组查询(group by)
- ## select 后使用 *,显示的是对分组查询后的每一组的第一条数据
- ## 只有出现 group by 时才可以使用 having(对分组后的数据进行过滤)
- select type,sum(id),avg(id),count(*) from test where id >= 1 group by type having count(*) > 1 order by id desc
## 分页查询(limit) 0 表示 数据的索引,3 表示 显示的条数
select * from test limit 0 , 3
## 一对一关联
# 1.主键关联--两张数据表中主键相同的数据为相互对应的数据
# 2.唯一外键--在任意一张表中添加一个字段添加外键约束与另一张表主键关联,并将外键添加唯一约束。
## 一对多,多对一
# 1.设置外键--在多的一方表中添加一个字段添加外键约束与另一张表主键关联。
## 多对多
# 1.新建关系表--在关系表中定义两个外键,分别与两个数据表的主键相关联。
## 外键的创建
1.在创建表的时候创建
- create table class(
- class_id int primary key auto_incremment,
- class_name varchar(32) not null unique,
- class_remark varchar(200)
- )
-
- create table student(
- stu_num varchar(32) primary key,
- stu_name varchar(32) not null unique,
- cla_id int,
- constraint PK_STUDENT_CLASS foreign key(cla_id) references class(class_id)
- )
2.创建好表后在给其添加外键
alter table student add constraint FK_STUDENT_CLASS foreign key(cla_id) references class(class_id)
3.外键约束-级联操作 在创建外键时 添加 级联操作
- on update cascade(级联修改)
- on delete cascade (级联删除)
- alter table student add constraint FK_STUDENT_CLASS foreign key(cla_id) references class(class_id) on update cascade on delete cascade
- 内连接查询(inner join)
- select * from student inner join class
- # 笛卡尔积(A表&B表):使A表中的每条记录和B表中的每条记录关联,笛卡尔积的总数 = A表记录的数量*B表记录的数量
- # 如果直接执行连接查询会生成两张表的笛卡尔积(即用student表中的每条记录去和class表中的每条记录相匹配)
-
- 连接条件
- 1.where:是在两张表产生笛卡尔积后,在通过条件来对生成的笛卡尔积进行筛选的(效率不高)
- select * from student inner join class where student.cls_id = class.class_id
- 2.on : 通过on设置两张表进行连接查询的匹配条件(效率高)
- select * from student inner join class on student.cls_id = class.class_id
- 结果:只获取两张表中匹配条件成立的数据,任意一张表在另一张表,如果没有找到对应的匹配则不会出现在查询结果中
-
- #左连接 (left join)
- #结果:显示左边表中的所有数据,如果在右表中有对应的匹配关系,则进行匹配,如果右表中不存在匹配数据,则显示为null
- select * from student left join class on student.cla_id = class.class_id
-
- #右连接(right join)
- # 结果:显示右边表中的所有数据,如果在左表中有对应的匹配关系,则进行匹配,如果左表中不存在匹配数据,则显示为null
- select * from student right join class on student.cla_id = class.class_id

- # 单列多行(作为查询条件)//查询所有在Java班级的同学
- select * from student where cla_id in (select class_id from class where class_name like 'java%')
- # 多行多列(作为虚拟表)//查询所有在java班并且性别是男的同学
- select * from (select * from student where cla_id in (select class_id from class where class_name like 'java%')) as t where t.stu_sex = '男'
# 存储过程:将能够完成特定功能的SQL指令进行封装(SQL指令集),编译之后存储在数据库服务器上,并且为之取一个名字,客户端可以通过名字直接调用这个SQL指令集,获得执行结果。
# 存储过程优点:
1.SQL指令无需客户端编写,通过网络传送,可以节省网络开销,同时避免SQL指令在网络传输过程中被恶意篡改保证安全性;
2.存储过程经过编译创建并保存在数据库中,执行过程无需重复进行编译,对SQL执行过程进行了性能优化。
3.存储过程中多个SQL指令之间存在逻辑关系,支持流程控制语句,可以实现复杂的业务。
#存储过程的缺点
1.存储过程是根据不同的数据库进行编译,创建并存储在数据库中的,当我们需要更换数据库时,需要从新编写存储过程。
2.存储过程受限于数据库产品,如果需要高性能的优化会成为一个问题。
3.如果需要对数据库高并发访问,使用存储过程会增加数据库的连接执行时间(因为存储过程是把复杂的业务交给了数据库处理)
- # 创建一个加法的存储过程:
- create procedure add_num (in a int,in b int,out c int)
- begin
- set c = a + b;
- end
- # 调用存储过程
- set @m = 0 ; -- 定义用户变量(全局变量) @m
- call add_num(3,2,@m) -- 调用存储过程获得结果赋值给@m
- select @m from dual; -- 参看变量值
-
- # 创建一个求输入值的 平方 和 一半相加的结果
- create procedure add_test (in int a,out int b)
- begin
- declare x int default 0; --定义局部变量
- declare y int default 0;
- set x = a * a;
- set y = a / 2;
- set b = x + y;
- end
- set @n = 0; --定义用户变量
- call add_test(6,@n);
- select @n from dual;
-
- # 创建一个求学生数量的总和(把查询结果赋值给变量)
- create procedure get_stuNum(out int c)
- begin
- select count(*) into c from student;
- end
-
- set @num = 0;
- call get_stuNum(@num)
- select @num from student

# 局部变量:定义在存储过程中的变量,只能在存储过程内部使用。(必须定义在存储过程开始)
# 用户变量:相当于全局变量,存放在mysql数据库的数据字典中(dual),使用set关键字直接定义,变量名要以@开头
# 存储过程参数:in(入参),out(出参),inout(即可当入参,又可当出参)# 入参的用法 添加一名学生
- create procedure add_student(in stuNum varchar(32),in stuName varchar(32),in claId int,in stuSex varchar(2))
- begin
- insert into student values(stuNum,stuName,claId,stuSex);
- end
-
- call add_student('202202','李四','5','男')
- # 1.分支语句 if-then-else
-
- # 单分支语句
- create procedure proce_test ( in a int ) begin
- if
- a = 1 then
- insert into student values ( '202203', '王二', '5', '男' ) ;
- end if;
- end
- call proce_test(1)
-
- # 双分支语句
- create procedure proce_test2 ( in a int ) begin
- if
- a = 1 then
- insert into student values ( '202204', '小红', '5', '女' );
- else insert into class values ( '2', 'mysql2022', '很棒' );
- end if;
- end
-
- # 2.多分支 case when
- create procedure proce_test2 (in a int) begin
- case a
- when 1 then
- insert into student values ( '202204', '小红', '5', '女' );
- when 2 then
- insert into class values ( '2', 'mysql2022', '很棒' );
- else --如果不符合上面的条件就执行else中的
- insert into class values ( '2', 'mysql2022', '很棒' );
- end case;
- end;
-
- ## 循环语句
- # while循环 向class表中循环添加数据
- create procedure add_class(in num int)
- begin
- declare x int default 0;
- while
- x < num do
- insert into class(class_name,class_remark) values (concat('java',x),x);
- set x = x + 1;
- end while;
- end
-
- # repeat循环 向class表中循环添加数据
- create procedure repeat_addClass(in num int)
- begin
- declare x int default 0;
- repeat
- insert into class(class_name,class_remark) values (concat('c++',x),x);
- set x = x + 1;
- until i >= num end repeat;
- end
-
- # loop循环 向class表中循环添加数据
- create procedure loop_addClass(in num int)
- begin
- declare x int default 0;
- myloop:loop
- insert into class(class_name,class_remark) values(concat('html',x),x);
- set x = x + 1;
- if x >= num then
- leave myloop;
- end if;
- end loop;
- end

- # 查看存储过程
- show procedure status where db = 'test'
-
- # 查看存储过程的创建细节
- show create procedure test.add_class
-
- # 删除存储过程
- drop procedure add_class;
-
- # 通过存储过程查询出一条数据
- create procedure find_one(in a int,out b varchar(32))
- begin
- declare id int default 0;
- declare name varchar(32) default '';
- declare remark varchar(32) default '';
- select class_id,class_name,class_remark into id,name,remark from class where class_id = a;
- set b = concat_ws('-',id,name,remark);
- end
- set @m = '';
- call find_one(1,@m);
- select @m from dual;
-
- # 通过游标查询多个结果集
- create procedure find_all(out result varchar(200))
- begin
- declare id int default 0;
- declare name varchar(32) default '';
- declare remark varchar(32) default '';
- declare num int default 0;
- declare x int default 0;
- declare str varchar(32) default '';
- declare mycursor cursor for select * from class;
- select count(*) into num from class;
- open mycursor;
- while x < num do
- fetch mycursor into id,name,remark;
- set str = concat_ws('-',id,name,remark);
- set result = concat_ws(',',result,str);
- set x = x + 1;
- end while;
- close mycursor;
- end
-
- set @m = '';
- call find_all(@m);
- select @m from dual

# 触发器,就是一种特殊的存储过程,触发器和存储过程一样是一个能够完成特定功能,存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。
- # 触发器的定义
- create trigger <trigger_name>
- <before|after> --定义触发时机
- <insert|delete|update> --定义DML类型
- ON <table_name> --监听那个表
- for each row --声明为行级触发器(只要操作一条记录就触发触发器执行一次)
- sql_statement --触发后要执行的操作
-
- # 创建一个触发器(当向学生表中添加信息时向日志表中插入一条日志)
- create trigger insert_trigger before insert on student for each row
- insert into student_log values (now(),concat('添加',new.stu_name,'学生信息'));
-
- # 创建一个触发器(当向学生表中更新信息时向日志表中插入一条日志)
- create trigger update_trigger before update on student for each row
- insert into student_log values (now(),concat('将',old.stu_name,'改为',new.stu_name))
-
- # 创建一个触发器(当向学生表中删除信息时向日志表中插入一条日志)
- create trigger delete_trigger after delete on student for each row
- insert into student_log values (now(),concat('删除',old.stu_name,'学生信息'))
-
- # 查看触发器
- show triggers
-
- # 删除触发器
- drop trigger <trigger_name>

## 视图的作用
# 1安全性:如果我们直接将数据库表授权给用户,那么用户可以CRUD数据表中的所有数据,我们可以把表中公开的部分数据生成视图,授权用户访问视图,用户通过访问视图,获得公开的数据,从而达到将数据库表中的部分数据对用户隐藏。
# 2简单性:如果我们需要查询的数据来源于多张数据表,可以使用多表连接查询来实现,通过视图将这些连表的查询结果对用户开放,用户可以通过查询视图获取多表数据,操作更便捷。# 创建视图
- create view <view_name>
- as
- select_statement
-
- # 创建一个查看所有学生信息和班级信息的视图
- create view v_student
- as
- select s.stu_num,s.stu_name,c.class_name,c.class_remark from student s left join class c on s.cla_id = c.class_id
1.如果视图是通过查询一个表产生的可以有(增删改查)
2.如果视图是都过多张数据表产生的就只可以(查询)
单表视图时:在视图中添加数据,数据会被添加到源数据表,删除数据时,原表数据也会被删除,修改数据时,原表数据也会被修改。
视图使用建议:对复杂查询简化操作,并且不会对数据进行修改的情况下使用视图。
# 查看视图 desc <view_name>
- # 修改视图
- # 方式一:
- create or replace view v_student
- as
- select * from student;
- # 方式二:
- alter view v_student
- as
- select * from student;
-
- # 删除视图(删除视图时,不会删除原表数据)
- drop view v_student
#索引:就是将数据表中的某一列/某几列的值取出来构造成便于查找的结构进行存储,生成数据表的目录当我们进行数据查询的时候,则先在(目录)中进行查找得到对应的数据地址,然后再到数据表中根据地址快速的获取数据记录,避免全表扫描。
mysql索引分类:
1.主键索引:在数据库表的主键字段创建的索引,这个字段必须被primary_key修饰,每张表只能有一个主键。
2.唯一索引:在数据库表中的唯一列创建的索引(unique),此列的所有值只能出现一次,可以为null。
3.普通索引:在普通字段上创建的索引,没有唯一性的限制。
4.组合索引:两个及以上字段联合起来创建的索引。
--说明--
1.在创建数据表时,将字段声明为主键(添加主键约束),会自动在主键字段创建主键索引。
2.在创建数据表时,将字段声明为唯一键(添加唯一约束),会自动在唯一字段创建唯一索引。
- # 1.唯一索引
- -- 创建唯一索引:创建唯一索引列的值不能重复
- -- create unique index <index_name> on 表名(列名)
- create unique index index_stuName on student(stu_name)
-
- # 2.普通索引
- --创建普通索引:不要求创建索引列值的唯一性
- -- create index <index_name> on 表名(列名)
- create index index_stuSex on student(stu_sex)
-
- # 3.组合索引
- --创建组合索引
- -- create index <index_name> on 表名(列名,列名)
- create index indexStuNumOrStuName on student(stu_num,stu_name)
-
- # 4.全文索引
- --create fulltext index <index_name> on 表明(字段名)

使用:索引创建完成后无需调用,当根据创建索引的列进行数据查询时,会自动使用索引。
(重点):组合索引需要根据创建索引的所以字段进行查询时触发。
- # 在命令行窗口查看查询语句的查询规划
- explain select * from student where stu_num = '202201'\G;
-
- # 查看索引
- # 1.命令行查看
- show create table student\G;
- # 2.查看数据库索引
- show indexes from <table_name>;
- # 3.查询索引
- show keys from student;
-
- # 删除索引
- drop index index_stuName on student;
# SQL的转义字符是:’(单引号)
# 再sql中查询 值为'5'的列
''5''等于 '5'
select * from student where name = '''5'''
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。