数据库笔记(基础操作)

数据库笔记

数据库基础

1.终端启动MySql服务:

net start mysql;

2.连接MySQL:(加一条,-proot不加;哦)

mysql -h localhost -p 3306 -u root -proot (h 数据库链接,p 数据库端口号,u 数据库用户名  -p 数据库密码,p与密码之间不能有空格)

3.查看数据库:

`show databases;`

4.创建数据库:

`create database test;(test数据库名字)`

5.进入数据库:

use test;

6.查看数据库中的表:

show tables;

7.修改数据库的编码:
bank数据库名

alter database bank character set utf8;

8.修改具体表的编码格式:
user为表名

alter table user CONVERT TO CHARACTER SET utf8

9.查看数据库的编码格式:

show variables like '数据库名'

10.查看数据表的编码格式:

show create table 表名'

7.建立数据表:

create table pet (  --(pet表名)
     name VARCHAR(20),   --(name键,varchar char字符串数据类型,data日期相关类型)
     owner VARCHAR(20),
     species VARCHAR(20),
     sex CHAR(1),
     birth DATE,
     death DATE);     

8.查看创建好的数据表结构:

describe pet;

在这里插入图片描述

9.退出数据库服务器:

exit;

10.如何查看数据表中的数据记录:

select*from pet;

11.如何往数据表中添加数据:

insert into pet
values('pullball','diane','hamster','f','1990-03-03',NULL);

12.如何删除数据库中表的数据:

delete form pet where name='周星星';

13.如何修改数据:

updata pet set name='周星' where owner='bei';
(--  updata 更新  pet 表名  set 设置  改name为周星 通过owner=bei 去锁定表中的某条数据。
数据库约束

14.mysql建表约束:(主键约束、外键约束、自增约束、唯一约束、非空约束、默认约束)
15.主键约束(它能够唯一确定一张表中的一条数据,也就是我们通过给某个字段添加约束,就可以使得字段不重复且不为空)。

create table user(id int primary key, name varchar(20));
(-- id为主键,不可重复)

联合主键:

create table user2 (id int,name varchar(20),password varchar(20),primary key(id,name));
(id,name为主键,联合主键任意一个主键都不可为空,联合主键是只要两个主键加起来不重复即可)
insert into user2 values(1,'张三','123456');
insert into user2 values(1,'张三','123456');(--报错)
insert into user2 values(2,'张三','123456');(--不报错)

16.自增约束:primary key auto_increment;

creste table user(id int primary key auto_increment,name varchar(20));
insert into user3 (name) values ('张三');

17.为某个表添加主键:

(1) 直接添加
alter table user4 add primary key(id);
(2) 通过modify添加
alter table user4 modify name varchar primary key;

18.删除某个表的主键:

alter table user4 drop primary key;

19.唯一约束:约束修饰字段的值不可以重复

添加唯一约束:
(1ALTER table user5 add unique(name);2create  table user6 (id int, name varchar, unique(name));

20.删除唯一约束:

alter table user6 drop index name;

21.非空约束:修饰的字段不能为空

create table user7 (id int, name varchar(20) not null);

22.默认约束:当插入字段值是如果没有传值就设为默认值

create table user7 (id int,name varchar(20),age int default 10);

23.添加默认约束:

alter table user3 ALTER name set DEFAULT 'zhangsansan';

24.外键约束:涉及到两个表,父表与子表(主表与副表)
主表中没有的数据值,在子表中是不可以使用的。
主表中被子表使用的数据值,是不可删除的。
比如说创建子表时,子表中有外键,但是父表中外键没有这个数,这是创建子表会失败的。

--班级表
create table classes (
id int primary key ,
name varchar(20));
--学生表
create table students (
id int primary key ,
name varchar(20),
calss_id int,(--关联班级表的id的,建立两表之间的联系)
foreign key(class_id) references classes(id);(--绑定id,指名class_id来自于classes中的id)

25.数据库的三大设计范式:(满足与否据实际开发而定)
1.第一范式:不可拆分范式:字段为最小单元,不可在拆分。

(可拆分)
create table adress(
id int, name varchar(20),adress varchar(50)
);
insert into adress values(1,'张三','中国山西省运城市新绛县')
(不可拆分)
create table adress1(
id int,name varchar(20),cuntry varchar(50),privice varchar(20),
city varchar(20),details varchar(20)
);
insert into adress2 values(1,'张三','中国','山西省','运城市','新绛县');
    2.第二范式:必须在满足第一范式的基础上,除主键外的每一列都必须完全依赖于主键。如果出现不完全依赖,只能发生在联合主键的情况下。
    3.第三范式:必须满足 第二范式的前提下,除主键列的其他列之间不能有传递依赖关系。
数据库查询

1.查询表中得所有记录:

select * from student;(student 为表名)

在这里插入图片描述
2.查询表中指定字段记录:

select ssname,ssex,class from student;

在这里插入图片描述

where后加查询的或与条件、统计条件

3.查询表中某个字段下数据区间:(between…and…)

select * from score where degree between '60' and '80';(--''也可不加)
select * from score where degree >70 and degree<80;

在这里插入图片描述
在这里插入图片描述
4.查询字段下特定的几个值:

select * from score where degree in (60,88,78);

在这里插入图片描述
5.查询非同一字段的数据记录:(where 条件 or 条件)
查询表中班级为95031或性别为女的记录:

select * from student where class='95031' or ssex='女';

在这里插入图片描述

order by后添加升序降序条件

7.升序,降序(asc一般默认为升序,desc):
以class升序插叙student表中的所有记录:

select * from student order by class;(--默认为升序)
select * from student order by class  asc;(--升序)
select * from student order by class  desc;(--降序)

在这里插入图片描述
在这里插入图片描述
8.以某个字段升序以某个字段降序:
查询学号升序中学号中成绩最低:

select * from score order by cno asc,degree desc;

在这里插入图片描述
9.统计:(select count(*) from student where 条件)
查询”95031“班的学生人数:

select count(*) from student where class="95031";

在这里插入图片描述
10.子查询或者排序:
查询score中最高分的学生学号和课程号:步骤
(1)找到最高分:
select max(degree) from score;
(2).找最高分的sno和cno:
select sno,cno from score where degree=(select max(degree) from score);

select sno,cno from score where degree=(select max(degree) from score);

在这里插入图片描述
排序找最高分的做法(有缺陷一般不用):
limit 从第一个数字开始到第几位数字。
select sno,cno,degree from score order by degree
desc limit 0,1;
在这里插入图片描述

11.查询每门课的平均成绩:
avg();平均
group by; 分组(先将每门课分组,最后在平均)
select avg(degree) from score where cno=‘3-105’;
select cno ,avg(degree) from score group by cno;
在这里插入图片描述
12.统计 count
平均 avg
以什么开头 like(模糊查询)
%为通配符
count(*)统计数量可以显示出来的
having分组后对聚合的数据进行筛选
查询score表中至少有2名学生选修的并以3开头的课程的平均分数。
先对cno课程进行分组在统计比较大于2的cno

select cno from score group by cno having count(cno)>=2 and cno like '3%';

在这里插入图片描述
在这里插入图片描述
13.select sname,cno,degree from student,score where student.sno=score.sno;
查询sname cno degree(两表联查)
在这里插入图片描述
14.三表联查(找出共同的表,共同表中的相对应的列会被替换)
在这里插入图片描述
15.显示相应得列(student.sno)
在这里插入图片描述
16.as 取别名(student.sno as stu)
在这里插入图片描述
17.查询95031班学生没门课程得平均成绩
(第一步先拿出属于95031的学生,然后把他作为条件去分数表里去筛选出成绩,在以课程分组,这样就拿到了没门课程的平均成绩)
SELECT AVG(degree) FROM score WHERE sno IN(SELECT sno FROM student WHERE class=‘95031’);

--查询95031班学生号;
SELECT sno FROM student WHERE class='95031';
--根据学生号查出对应的成绩.in表示或的关系;
SELECT * FROM score WHERE sno IN(SELECT sno FROM student WHERE class='95031');
--对课程号进行分组再去求平均成绩
SELECT cno,AVG(degree) FROM score WHERE sno IN(SELECT sno FROM student WHERE class='95031') GROUP BY cno; 

18。查询选修3-105课程的成绩高于109号同学3-105成绩的所有同学的记录:
1.首先涉及到了学号、课程、成绩。
2.先找出学号109的学生3-105课程的成绩。
3.在找出成绩高于学号109的学生3-105课程的数据。
4.在筛选出课程伪3-105的成绩。
在这里插入图片描述
20.year获取年:
SELECT YEAR(sbirthday) FROM student WHERE sno IN (101,108);
在这里插入图片描述
查询年和学号101,102相同的学生
在这里插入图片描述
20.查询张旭教师任课的学生的成绩;
在这里插入图片描述

21.查询选修某课程人数大于5人的课程的教师姓名;
查询大于5的课程:
在这里插入图片描述

SELECT tname FROM teacher WHERE tno IN (SELECT tno FROM course WHERE cno IN (SELECT cno FROM score GROUP BY cno HAVING COUNT(*)>5));

在这里插入图片描述
22.not in (不在什么里边)
union求并集;(将表结合第一起)
23.至少,大于其中至少一个,any(大于其中一个)
查询选修3-105成绩掷筛至少大于3-245成绩的cno degree

select * from score where cno='3-1056' and degree>any(select degree from score where cno='3-245' order by degree desc);
24.且?all(大于全部任意一个)
查询选修3-105成绩且至少大于3-245成绩的cno degree 
```sql
select * from score where cno='3-1056' and degree>all(select degree from score where cno='3-245' order by degree desc);(--大于括号内的所有)

25.查询教和所有学生的名字,生日(用union可以将两个表连起来,as可以起别名,第一个表起别名后第二个表会自动修改为起好的别名)
在这里插入图片描述
在这里插入图片描述
26.查询成绩b比该课程平均成绩低的同学的成绩。
在这里插入图片描述
27.查询所有任课老师的名字,(任课就是在课程表里安排了课程)在这里插入图片描述
33.查询至少有两名学生为男生的班号(首先先查班号以班号为分组,再查男生)
having后加条件,(分组之后要跟的条件)

select class from student where ssex='男' group by class having count(*)>1

在这里插入图片描述
34.查出表中不姓李的同学:(首先找出姓李的,那就是模糊查询用到了like %,在不姓李,就是not)

SELECT *FROM student WHERE sname NOT LIKE '李%';

在这里插入图片描述
35查询每个学生的姓名与年龄:
当前年份:select year(now())

SELECT sname,YEAR(NOW())-YEAR(sbirthday) AS '年龄' FROM student;

在这里插入图片描述
36.查询student 表中最大与最下的年份:(函数max(),min()) 只是去比较了数字的大小。

SELECT MAX(sbirthday) AS '最大',MIN(sbirthday) AS '最小' FROM student;

在这里插入图片描述
37.以班号和年龄从大到小查询表记录:首先想到的应该是排序:

select * from student order by class desc,sbirthday;

在这里插入图片描述
38.查询男教师所任课得课程。

SELECT * FROM course WHERE tno IN( SELECT tno FROM teacher WHERE tsex='男');

39.查询最高分同学得cno:(使用max函数)
注意:max函数一般是在select后边

SELECT * FROM score WHERE degree=(SELECT MAX(degree) FROM score );

在这里插入图片描述
39.

SELECT degree FROM score WHERE cno IN (SELECT cno FROM course WHERE cname='数电') AND sno IN (SELECT sno FROM student WHERE ssex='男');

***
40.查询成绩等级:
建等级表:
在这里插入图片描述

在这里插入图片描述

SQL的四种连接查询

一、内连接(筛选相同数据)
inner join 或者 join(inner join与 join一样 后边的on表示条件,join 表 on 条件)
二、外连接(连接连个表)
1.左外连接 left join 或者 left outer join(左边为主)
会把左边表里边的所有数据取出来,而右边表中的数据,如果相等的就会显示,如果么有就会补NULL
2.右连接 right join 或者 right outer join(右边为主)
会把右边表里边的所有数据取出来,而左边表中的数据,如果相等的就会显示,如果么有就会补NULL
3.完全外连接 full join 或者 full outer join(全部数据,有相同就显示,没有就显示null)
MySQL实现全外连接要左外和右外用union连接起来:

三、来建立两个表
建表时遇到了错误:Table ‘card’ already exists(原因是因为这个表已经存在了)
没有创建外键
在这里插入图片描述
在这里插入图片描述

1- inner join 查询:(内连查询就是通过某个字段相对,将俩个表里有关系的数据查询出来撒)
在这里插入图片描述
2.left join(左外连接)(会把左边表里边的所有数据取出来,而右边表中的数据,如果相等的就会显示,如果么有就会补NULL)
在这里插入图片描述
3 full join 全外连接(full join mysql不支持全外连接)(用左外与右外union连接)

在这里插入图片描述

在这里插入图片描述

MySQL事务(

MySQL中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如:有这样一个需求:转账,这是有两条sql语句,不能一条成功一条失败,这样就造成了数据的不对称,所以有时候会要求多条语句同时成功会同时失败,这时就有了事务的出现。

MySQL中是如何控制事务的:

1.MySQL默认是开启事务的(自动提交)。
默认开始事务的作用是:当我们执行一条sql语句时,效果会立即体现,并且不能回滚。
–如果想回滚就要设置MySQL的自动提交为false,(set autocommit=0);
–回滚是指:撤销sql的执行效果,
(关闭自动提交 set autocommit=0)(开启自动提交 set autocommit=1)(回滚语句 rollback)
(查询是否自动提交)
2.事务分为:自动提交、手动提交、事务回滚。
自动提交在MySQL默认情况下就是自动提交。不可回滚。
手动提交是指自己手动commit。不可回滚。
事务回滚:撤销语句执行效果rollback。
在这里插入图片描述
张三像aa转账2元
在这里插入图片描述
3.手动开启事务,可以回滚
事务表示可以回滚,

begin; --或者
start transaction;--都可以帮我们手动开启一个事务,(可回滚);

4.事务的四大特征
(1)原子性:事务是最小单位不可分割的。
(2)一致性:事务要求,同一事务中的sql语句,必须保证同时成功或者同时失败,否则会造成信息的不对称。
(3)隔离性:事务1 与 事务2 之间是具有隔离性的。
(4) 持久性:事务一旦结束(commit)就不可返回(回滚)。
事务开启:(可回滚rollback)
1.修改默认提交:set autocommit=0;
2.begin;
3。start transcation;
** 事务手动提交**
commit;
事务手动回滚
rollback;
事务的隔离性
查看事务的隔离级别:MySQL5.x 语句为:select @@global.tx_isolation;
修改事务的隔离级别:set transaction isolotion level read committed;
MySQL默认隔离级别为:repeatable read;
mysql 8 版本:(可以设置的)
系统级别隔离:select @@global .transaction_isolation;
会话级别隔离:select @@transaction_isolation;
修改隔离级别为串行化:set global transaction isolation level serializable;
在这里插入图片描述
脏读:是指一个事务读到了另外一个事务未提交的数据。
分为四种:(这四种都可以设置隔离级别)
1、读未提交的:read uncommitted (可能出现脏读)
2、读已提交的:read committed;(可能会出现不可重复读现象,上一分钟和下一分钟数据可能不一样)
3、可以重复读:repeatable read;(可能会出现幻读,就是a,b两个事务在不同的地方操作同一张表,其中的一个事务commit后,另一个事务不会读到,这个就是幻读)
4、串行化::serializable(这时b是可以看到a的,但是其中有一个事务正在进行中时,两一个事务必须要等到这个事务commit之后才可以进行)。
——读未提交的(resd uncommitted):比如说有a,b两个事务,a事务存到了虚拟表中,但是还没有提交,这时b事务是可以看到a事务的,这就是读未提交的。
——读已提交的(read committed):

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值