MySQL基本操作

202 阅读5分钟

MySQL登录、访问、退出操作

登录命令:mysql -h localhost -u root -p

-h:host主机名,后面要跟访问的数据库服务器地址

-u:user用户名,后面跟登陆数据的用户名

-p:password密码,一般不直接输入,而是回车后以保密的方式输入

显示MySQL中的数据库列表:show databases

切换当前数据库的命令:use mysql

显示当前数据库的所有数据表:show tables

退出数据库可以使用quit或者exit命令完成,也可以使用\q;完成退出操作

SQL语言

SQL语言分为五个部分:

· 数据查询语言(Data Query Language,DQL):DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。

· 数据操作语言(Data Manipulation Language,DML):DML主要用于对数据库中的数据进行增加、修改和删除的操作,其主要包括:

  1. INSERT:增加数据

  2. UPDATE:修改数据

  3. DELETE:删除数据

· 数据定义语言(Data Definition Language,DDL):DDL主要用针对是数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)进行创建、修改和删除操作。其主要包括:

  1. CREATE:创建数据库对象

  2. ALTER:修改数据库对象

  3. DROP:删除数据库对象

·  数据控制语言(Data Control Language,DCL):DCL用来授予或回收访问 数据库的权限,其主要包括:

 1. GRANT:授予用户某种权限

 2. REVOKE:回收授予的某种权限

 

·  事务控制语言(Transaction Control Language,TCL):TCL用于数据库的事务管理。其主要包括:

  1. START TRANSACTION:开启事务

  2. COMMIT:提交事务

  3. ROLLBACK:回滚事务

  4. SET TRANSACTION:设置事务的属性

创建数据库表

创建数据库表:

create table t_student(
    sno int(6),
    sname varchar(5),
    sex char(1),
    age int(3),
    enterdate date,
    classname varchar(10),
    email varchar(15)
 )

查看表结构:展示表的字段详细信息

desc t_student

查看表中的数据:

select * from t_student

查看建表语句:

show create table t_student

数据库表的类型:

整数类型

image.png

浮点数类型

image.png

字符串类型

image.png

日期和时间

image.png

添加、修改、删除语句

添加:

insert into t_student values (1,'张三','男',18,'2002-5-8','软件一班','234342@321.com')

insert into t_student (sno,sname,enterdate) values (10,'李四','2023-7-5')

修改:

update t_student set sex = '女'

update t_student set sex ='男' where sno =10

删除:

delete from t_student where sno = 2

修改、删除数据库表

增加一列:

alter table t_student add score double(5,2) --5:总位数 2:小数位数

增加一列放在最前面:

alter table t_student add score double(5,2) first

增加一列(放在sex列的后面):

alter table t_student add score double(5,2) after sex

删除一列:

alter table t_student drop score

修改一列:

alter table t_student modify score float(4,1) --modify修改的是列的类型和定义,但是不会改变列的名字

alter table t_student change score scorel double(5,1) --change修改列名和列的类型定义

删除表:

drop table t_student

表的完整性约束

为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中的数据的准确性和一致性,这种机制就是完整性约束

image.png

非外键约束

代码示例:

--第一种
create table t_student(
    sno int(6) primary key auto_increment,
    sname varchar(5) not null,
    sex char(1) defaule '男' check(sex='男' || sex='女'),
    age int(3) check(age>=18 and age<=50),
    enterdate date,
    classname varchar(10),
    email varchar(15) unique
)

--第二种
create table t_student(
    sno int(6) auto_increment,
    sname varchar(5) not null,
    sex char(1) defaule '男',
    age int(3),
    enterdate date,
    classname varchar(10),
    email varchar(15) unique,
    constraint pk_stu primary key (sno),
    constraint ck_stu_sex check (sex='男' || sex='女'),
    constraint ck_stu_age check (age>=18 and age<=50),
    constraint uq_stu_email unique (email)
    
    --第三种
create table t_student(
    sno int(6),
    sname varchar(5) not null,
    sex char(1) defaule '男',
    age int(3),
    enterdate date,
    classname varchar(10),
    email varchar(15) unique  
)
alter table t_student add constraint pk_stu primary key (sno);
alter table t_student modify sno int(6) auto_increment; --修改自增条件
alter table t_student add constraint ck_stu_sex check (sex='男' || sex='女');
alter table t_student add constraint ck_stu_age check (age>=18 and age<=50);
alter table t_student add constraint uq_stu_email unique (email);

外键约束

应用场景:有时候我们在具体任务中会遇到多个表,假如一个学生表包含了学生的基本信息和班级编号,一个班级表包含了班级名称,班级编号,教室。此时进行删除操作删除班级表中的教室,但是学生表中仍有删除教室编号,这便产生了问题,而解决这个问题就要用到外键约束

注意:外键约束只有表级约束,没有列级约束:

代码示意:

create table t_student(
    sno int(6) primary key auto_increment,
    sname varchar(5) not null,
    classno int(4),
    constraint fk_stu_classno foreign key (classno) references t_class (cno)
);

create table t_class(
    cno int(4) primary key auto_increment,
    cname varchar(10) not null,
    room char(4)
);

外键策略:

直接删除和修改主表数据时,因为有外键的束缚,会产生不必要的错误,这里就需要用到外键策略

策略1:no action 不允许操作

通过操作sql来完成:

先把班级2的学生对应的班级 改为null

update t_student set classno = null where classno = 2;

然后再删除班级2:

delete from t_class where cno = 2;

策略2:cascade 级联操作:操作主表的时候影响从表的外键信息:

先删除之前的外键约束:

alter table t_student drop foreign key fk_stu_classno;

重新添加外键约束:

alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno) on update cascade on delete cascade;

策略3:set null  置空操作:

先删除之前的外键约束:

alter table t_student drop foreign key fk_stu_classno;

重新添加外键约束:

alter table t_student add constraint fk_stu_classno foreign key (classno) references t_class (cno) on update set null on delete set null;

DQL-查询操作

单表查询

起别名:

select empno 员工编号 from emp

select empno as 员工编号 from emp

去重操作:

select distinct job, deptno from emp

排序:

select * from emp order by sal; -- 默认情况下是按照升序排列的

select * from emp order by sal asc; -- asc 升序,可以默认不写

select * from emp order by sal desc; -- desc 降序

select * from emp order by sal asc ,deptno desc;-- 在工资升序的情况下,deptno按照降序排列

where子句 + 逻辑运算符and或&&

where子句 + 逻辑运算符or或in

where子句 + 模糊查询

select * from emp where ename like '%A%'

select * from emp where ename like '_A%'

关于null的判断

select * from emp where comm is null

select * from emp where comm is not null

单行函数

字符串函数:

image.png

image.png

数值函数:

image.png

日期与时间函数:

image.png

image.png

多行函数

image.png

group by

代码示意:

select deptno,avg(sal) from group by deptnko

having(分组后筛选)

select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000

单表查询语句总结:

select column,group_function(column)
from table
[where condition]
[group by group_by_expression]
[having group_condition]
[order by column]

多表查询

交叉连接

cross join

select *
from emp
cross join dept  --笛卡尔乘积

自然连接

natural join

优点:自动匹配所有同名项,同名列只展示一次

缺点:自动匹配表中所有的同名列,但是有时候我们希望只匹配部分同名列

select *
from emp
natural join dept;

内连接

select *
from emp
inner join dept d --inner可以省略不写
using (deptno)
select *
from emp e
inner join dept d
on (e.deptno = d.deptno)
where sal > 3500

外连接

左外连接

left outer join --左面的那个表的信息,即使不匹配也可以查看结果

select *
from emp e
left outer join dept d
on e.deptno = d.deptno

右外连接

right outer join --左面的那个表的信息,即使不匹配也可以查看结果

select *
from emp e
right outer join dept d
on e.deptno = d.deptno

union 取并集 去重

union all 取并集 不去重

不相关子查询

单行子查询

select ename,sal
from emp
where sal > (select avg(sal) from emp)
select ename,sal
from emp
where deptno = (select deptno from emp where ename = 'CLARK')
and
sal < (select sal from emp where ename ='CLARK')

多行子查询

select *
from emp
where deptno = 20
and job = any (select job from emp where deptno = 10)
select empno,ename,sal
from emp
where sal > all(select sal from emp where job = 'SALESMAN')

相关子查询

select * 
from emp e
where sal = (select max(sal) from emp where deptno = e.deptno) order by deptno

事务

手动开启事务:

start transaction;

update account set balance = balance - 200 where id = 1;

update account set balance = balance + 200 where id = 2;

手动回滚:刚才执行的操作全部取消:

rollback;

手动提交:

commit;

在回滚和提交之前,数据库中的数据都是操作的缓存中的数据,而不是数据库的真实数据

视图

-- 创建/替换单表视图:

create or replace view myview01
as
select empno,ename,job,deptno
from emp
where deptno = 20
with check option;
-- 查看视图:
select * from myview01;
-- 创建/替换多表视图:
create or replace view myview02
as
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e
join dept d
on e.deptno = d.deptno
where sal > 2000 ;
select * from myview02;
-- 创建统计视图:
create or replace view myview03
as
select e.deptno,d.dname,avg(sal),min(sal),count(1)
from emp e
join dept d
using(deptno)
group by e.deptno ;
select * from myview03;
-- 创建基于视图的视图:
create or replace view myview04
as
select * from myview03 where deptno = 20;
select * from myview04;

存储过程

--实现模糊查询
无返回值
create procedure mypro01 (name varchar(10))
begin
    if name is null or name = "" then
        select * from emp;
    else
        select * from emp where ename like concat('%',name,'%');
    end if;
end;

call mypro01('R')

有返回值
create procedure mypro01 (in name varchar(10),out num int(3))
begin
    if name is null or name = "" then
        select * from emp;
    else
        select * from emp where ename like concat('%',name,'%');
    end if;
    select found_rows() into num;
end;

call mypro01('R',@aaa)
select @aaa