mysql常用语句

数据库学习

1.1操作数据库CURD(Mysql不区分大小写)

1.创建数据库

create database [IF NOT EXISTS] westos;

2.删除数据库

drop database [IF EXISTS] westos;

3.使用数据库

use westos;

4.查看数据库

show databases;

5.创建表

CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` varchar(220) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `pwd` varchar(220) NOT NULL COMMENT '密码',
  `sex` char(2) NOT NULL DEFAULT '女' COMMENT '性别',
  `day` datetime DEFAULT NULL COMMENT '出生日期',
  `address` varchar(220) NOT NULL DEFAULT '匿地址' COMMENT '地址',
  `email` varchar(220) NOT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

6.修改删除表

修改

--修改表名称
alter table teacher rename as teacher1;
--增加表字段
alter table teacher add name varchar(220);
--修改表字段 (重命名:修改约束)
alter table teacher modify name varchar(220); --修改约束
alter table teacher change name teacher_name varchar(220); --字段重命名

删除

---删除表(如果存在再删除)
drop table if exists teacher;

7.插入表数据

INSERT INTO 表名 (id-----) values(id-----)

INSERT INTO westos.student (id, name, pwd, sex, day, address, email) VALUES (1, '狗蛋', '12345678', '男', '2021-12-08 13:34:44', '安徽合肥', '5104@sohu.com')

8.修改表数据

Update 表名 SET 字段 =‘李四’ where 字段=‘***’

-- 一定要指定条件 where
update student set address ='安徽合肥市' where name='狗蛋';

9.查找表数据

Select 字段名(要什么查什么,全都要就*) from表 where 字段=’ ';

select id, name, pwd, sex, day, address, email from student where name='狗蛋';

10.删除表数据

DELETE FROM 表 where 字段 =’ ’

DELETE FROM westos.student WHERE id = 2;

所有创建和删除都要添加判断不然会报错

11.逆向语句查询

show create table student; --查看建表语句
desc student;   --查看表结构

12.去重关键字

select distinct studentno  from result   --distinct

Where语句

--查询考试成绩在90分以上100分一下
select studentno ,studentresult from result where studentresult >= 90 && result.studentresult<=100;
--区间查询
--between      a between b and c A在BC之间为true
select studentno,studentresult from result where studentresult between 95 and 100;
--除了1000号之外所有学生的成绩
select studentno ,studentresult from result where result.studentno<>1000;
select studentno ,studentresult from result where result.studentno!=1000;
select studentno ,studentresult from result where not result.studentno =1000;

Like语句

--开头是姓刘的  %(代表0到任意一个字符)  _代表一个字符
select studentno, studentname from student where student.studentname like '刘%';
--后面是一个字符开头是刘的人
select studentno, studentname from student where student.studentname like '刘_';
--左右匹配带刘的都展示
select studentno, studentname from student where student.studentname like '%刘%';

in语句

--查询某个区间  他是一个或者多个具体的值
select studentno,studentname from student where studentno in (1001,1002,1003);

null not null 语句

select studentno,studentname from student where address is null;
select studentno,studentname from student where address is not null;

联表查询 join

select s.studentno, studentname, subjectno, studentresult
from student s
         inner join
     result r
where s.studentno = r.studentno;

#左查询
select s.studentno, studentname, subjectno, studentresult
from student s
         left join result r
                   on s.studentno = r.studentno;

#右查询
select s.studentno, studentname, subjectno, studentresult
from student s
         right join
     result r
     on s.studentno = r.studentno;


select s.studentno, studentname, subjectname, studentresult
from student s
         right join result r
                    on r.studentno = s.studentno
         inner join subject sub
                    on r.subjectno = sub.subjectno;

分页limit和排序 orderby

--desc 降序  esc升序
select r.studentno, studentname, subjectname, studentresult
from result r
         left join student s
        on r.studentno = s.studentno
    inner join subject sub
        on r.subjectno = sub.subjectno
where sub.subjectname like '%C%'
order by studentresult desc
select s.studentno,studentname,subjectname,studentresult
from student s
inner join result r
    on s.studentno = r.studentno
inner join subject sub
    on sub.subjectno=r.subjectno
where sub.subjectname like '%C%' && r.studentresult > 30
order by r.studentresult desc
limit 0,10

联表查询 和 子查询

--子查询
select s.studentno,studentname
from student s
inner join result r on s.studentno = r.studentno
where r.studentresult >=30 and subjectno = (
    select subjectno from subject where subjectname = 'C语言-1'
);

select s.studentno,studentname
from student s
inner join result r on s.studentno = r.studentno
inner join subject s2 on r.subjectno = s2.subjectno
where r.studentresult>=30 && s2.subjectname='C语言-1'


分组查询

select subjectname,max(studentresult),min(studentresult),avg(studentresult)
from result r
inner join subject s on r.subjectno = s.subjectno
group by r.subjectno ----通过什么来分组
having avg(studentresult)>=70  ----分组过后用having来再次筛选数据 而不是where
;

聚合函数

select count(address)from student; --会去掉null值
select count(1)from student; --不忽略null值
select count(*)from student; --不忽略null值
select count(studentname) from student where studentname ='铁蛋';

select sum(studentresult) 总分 from result;
select avg(studentresult) 平均 from result;
select max(studentresult) 最高 from result;
select min (studentresult) 最低 from result;

事务原则:原子性,一致性,持久性,隔离性(ACID) (脏读幻读)

原子性(Atomicity)

一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性

一致性(Consistency)

事务前后的数据完整性要保持一致 事务前总金额1000 事务后也是1000

持久性(Durability)

事务一旦被提交 那就持久化到数据库中 不可逆

隔离性(Isolation)

事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

隔离所导致的问题

脏读

指一个事物读取了另一个事务未提交的数据

不可重复读

在一个事务中读取表的某个数据,多次读取不同(不一定是读取错误,可能是某些场合不对)

幻读 虚读

是指在一个事务内读取到了其他事务插入的数据,导致前后读取不一致