✨ 目录
- 初级语法之登录、库操作、表操作、数据操作,索引
- 高级语法之主键、试图、变量、流程、函数、存储过程
- 查询语法之联合查询、子查询、链接查询
初级语法之登录、库操作、表操作、数据操作,索引
- 登录数据库:
mysql –u用户名 [-h服务器IP地址] [-P端口] -p密码
- 数据库操作之显示所有数据库:
show databases;
- 数据库操作之创建数据库:
create database 数据库名;
- 数据库操作之选择数据库:
use 数据库名称;
- 数据操作之查看执行查询效率:
explain sql语句
- 数据库操作之删除数据库
drop database 数据库名;drop database if exists 数据库;
show tables;show tables in 数据库名;
create table 表名()engine=innodb comment '用户表';
drop table 表名;drop table if exists 表名;
describe 表名;describe 表名\G;desc 表名;
show create table 表名;show create table 表名\G;
alter table 表名 属性名=新属性值;alter table test engine=MyISAM;
rename table [库名.]旧表名 to [库名.]新表名;
alter table 表名 add 新字段名 字段类型 [字段属性列表];
alter table 表名 drop 字段名
alter table 表名 change 旧字段名 新字段名 新字段类型 [字段属性];
alter table 表名 modify 字段名 字段新类型 [字段新属性列表];
insert into 表名 values (字段1值, 字段2值, … 字段n值);insert into 表名 (字段1, 字段2, … 字段n) values (字段1值, 字段2值, … 字段n值);
select 字段列表 from [库名.]表名 [where 查询条件];
update 表名 set 字段1=字段1新值, 字段2=字段2新值, …. 字段n=字段n新值 where 条件语句;
delete from 表名 where 条件语句;
truncate [库名.]表名;
Alter table 表名 modify 字段名 字段类型 auto_increment
alter table 表名 add primary key(字段名称)
Alter table 表名 drop primary key;
alter table 索引名 modify id int unsigned;
create unique index 索引的名称 on 表名(字段名称)
alter table 表名 drop index 索引的名称
create index 索引的名称 on 表名(字段名称);
alter table 表名 drop index 索引的名称
alter table 表名 add index 索引名称(字段名称(长度))
alter table 表名 drop index 索引名称
高级语法之主键、试图、变量、流程、函数、存储过程
- 高级语法之主键
- 使用外键的前提:外键所存在的表必须是
Innodb
引擎的、 - 默认情况下被关联的外键数据是
无法删除
的 - 默认情况下被关联的字段值是无法被修改的,非关联字段可以修改
- 主表关联字段修改后,会影响外键字段的值
- 主表数据删除后,外键字段会自动修改为
NULL
值
create table tableName(foreign key (外键字段) references 主表 (主表关联字段) [删除时执行语句] [更新时执行语句];)engine=Innodb charset=utf-8;alter table 表名 dropforeign key 外键标识;alter table 表名 drop index 索引字段名;alter table 表名 add foreign key (外键字段) references 主表 (主表关联字段) [删除时执行语句] [更新时执行语句];
- 高级语法之视图
- 应用场景:有一个查询语句非常复杂,写太多很麻烦,可以用一个视图来代替这个
select
语句,充当一个 变量
角色 - 视图其实是以表子查询的
SQL
语句的形态存在的 - 操作视图就相当于操作原表,
一般不会直接操作视图,保持视图数据的干净
- 重启
MYSQL
后,在不同的黑窗口客户端中依然能够使用重启之前创建的视图 - 视图
可以
在多个客户端进程中通用,视图必须在 选择数据库之后
才能进行操作
create view 视图名称 as (查询SQL语句);drop view 视图名称;drop view if exists 视图名称;select * from information_schema.views;
- 高级语法之变量
mysql
变量分类:系统变量
、用户变量
、局部变量
- 查看全局所有变量:
show global variables;
- 查看所有的会话:
show session variables;
- 修改全局变量:
set @@global.变量名=变量值;
,重启数据库后,set
方式修改的全局变量将会被重新初始化 - 修改会话变量:
set @@session.变量名=变量值;
,重启数据库之后,set
方式修改的会话变量的值将会被还原 - 定义用户变量:
set @变量名=变量值;
- 定义局部变量:
declare 变量名 变量数据类型 [default 默认值];
- 定义
mysql
结束符:delimiter 符号
set @变量名=变量值;set @变量名=变量值,@变量名=变量值;select @变量名,@变量名;select @var1=name,@var2=age,@var3=email from table where 1;declare var1 int default 0;
- 高级语法之流程分支
- 流程分支:
if分支
、while循环
if条件语句thenif结构体[elseif条件语句thenelseif结构体]elseelse结构体end if; if @var > 100 theninsert into values('');elseinsert into values('');end if;while 条件 do循环结构体end while;
createfunction函数名(形参1 形参1数据类型, 形参2形参2数据类型,…, 形参n形参n数据类型)returns预估的函数返回值数据类型[begin]函数的结构体[end]select函数名(实参列表);dropfunction函数名;
- 高级语法之存储过程
- 参数的传递类型:
in
:只进不出(只传值不传名) 在存储过程中修改值将不影响外部变量out
:只出不进(只传名不传值) 在存储过程中无法获得值inout
:能够进也能够出(即传名也传值) 最常用的类型
createprocedure存储过程名(数据传递类型形参1形参1数据类型, 数据传递类型形参2形参2数据类型,…, 数据传递类型形参n形参n数据类型)begin存储过程结构体endcall存储过程名(实参列表);dropprocedure存储过程名;
查询语法之联合查询、子查询、链接查询
(select * from table where id>200)union(select * from table where id>200);(select * from table where id>200)union all(select * from table where id>200);
标量子查询
:本条查询语句的查询条件 是 另一个查询语句查询出来的单个值
select * from class where teacher_name = (select name from teacher where id = 10);
列子查询
:本条查询语句的查询条件 是 另一个查询语句查询出来的一列结果
select * from class where teacher_name in (select name from teacher where id = 10 or id=30);
行子查询
:本条查询语句中的查询条件 是 另一个查询语句所查出来的一行记录
select * from class where (teacher_name,teacher_num)=(select name,num from teacher where id = 10)
表子查询
:本条查询语句所查询的表 是 另一个查询语句查询出来的一个虚拟表结果集
insert into table values(select * from teacher where 1);
select * from table1 where exists (select * from table2 where table1.name == table2.name);
- 连接查询之内连接:在两张表中,如果任意一张表的数据根据条件连不上另外一张表中的数据,则这条记录直接被忽略不展示出来
select * from table1 inner join table2 on table1.name = table2.name;select * from table1 join table2 on table1.name = table2.name; select * from table1 join table2 where table1.name = table2.name; select * from table1 join table2 on using(name);
- 连接查询之交叉连接:所谓的交叉连接,指的是将左表的每条数据都与右表的每条数据连接一次
select * from table1 inner join table2;
select * from table left outer join table2 on table.name = table2.name;select * from table left join table2 on table.name = table2.name;
select * from table right outer join table2 on table.name = table2.name;select * from table right join table2 on table.name = table2.name;
(select * from table right join table2 on table.name = table2.name)union(select * from table right join table2 on table.name = table2.name);
- 连接查询之自然连接:两张表有且仅有一个相同的字段,否则数据会出错,所以,实际项目中并没有什么卵用
select * from table join table2 using(name);select * from table natural join table2; select * from table natural left join table2;select * from table natural right join table2;