一天学会MYSQL数据库_笔记
视频是b站的:
一天学会MYSQL数据库
说是说一天,但我看了三四天,有点基础可能看的更加快。我直接从notepad中把自己做的笔记粘过来了~
第一章 mysql建表约束
--mysql 学习笔记----关系型数据库--一、如何使用终端操作数据库--1.如何登录数据库服务器?
widows:mysql -uroot -p123456--2.如何查询数据库服务器中所有的数据库?
mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)--3.如何选中一个数据库进行操作?
mysql> select * from admin;--4.如何退出数据库?
mysql> exit;
Bye--5.如何在数据库服务器中创建我们的数据库?
mysql> create database test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changed--6.如何查看某个数据库中所有的数据表?
mysql> show tables;
Empty set (0.00 sec)--7.如何创建一个数据表?
CREATE TABLE pet(name VARCHAR(20),owner VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth DATE,death DATE);mysql> CREATE TABLE pet(-> name VARCHAR(20),-> owner VARCHAR(20),-> species VARCHAR(20),-> sex CHAR(1),-> birth DATE,-> death DATE);
Query OK, 0 rows affected (0.05 sec)--8.查看数据是否创建成功
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| pet |
+----------------+
1 row in set (0.00 sec)--9.查看创建好的数据表的结构
mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)--10.如何查看数据表中的记录?
mysql> select * from pet;
Empty set (0.00 sec)--11.如何往数据表中添加数据记录?
mysql> INSERT INTO pet-> VALUES ('Puffball','Jane','hamster','f','1999-03-31',NULL);
Query OK, 1 row affected (0.00 sec)--12.再一次查询?
mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Jane | hamster | f | 1999-03-31 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)INSERT INTO pet
VALUES ('旺财','TK','狗','公','2009-01-31',NULL);mysql> INSERT INTO pet-> VALUES ('旺财','TK','狗','公','2009-02-31',NULL);
ERROR 1292 (22007): Incorrect date value: '2009-02-31' for column 'birth' at row 1
mysql> INSERT INTO pet-> VALUES ('旺财','TK','狗','公','2009-01-31',NULL);
Query OK, 1 row affected (0.00 sec)mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Puffball | Jane | hamster | f | 1999-03-31 | NULL |
| 旺财 | TK | 狗 | 公 | 2009-01-31 | NULL |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)--13.mysql 常用数据类型有哪些?
--MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
--数值
create table testType(number TINYINT);
INSERT INTO testType VALUES(128);mysql> INSERT INTO testType VALUES(128);
ERROR 1264 (22003): Out of range value for column 'number' at row 1
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值--日期/时间
类型 大小
( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4
1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS 混合日期和时间值,时间戳--字符串(字符)
类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据--数据类型如何选择?
日期 选择按照格式
数值和字符串按照大小!INSERT INTO PET VALUES('Slim','Benny','snake','m','1998-09-28',NULL);
INSERT INTO PET VALUES('Fat','Benny','snake','m','1998-09-28',"2299-12-26");--14.如何删除数据?DELETE from pet where name='Fat';mysql> DELETE from pet where name='Fat';
Query OK, 1 row affected (0.01 sec)--15.如何修改数据?
update pet set name='旺旺旺财' where owner='TK';mysql> update pet set name='旺旺旺财' where owner='TK';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0--总结一下:数据库常见操作?
--增加
INSERT
--删除
DELETE
--修改
UPDATE
--查询
select--16.mysql建表约束.sql--a.主键约束它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段
不重复且不为空create table user(id int primary key,name varchar(20));insert into user value(1,'张三');mysql> insert into user value(1,'张三');
Query OK, 1 row affected (0.01 sec)mysql> insert into user value(1,'张三');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'insert into user value(2,'张三');
mysql> select * from user;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
+----+--------+
2 rows in set (0.00 sec)mysql> insert into user value(null,'张三');
ERROR 1048 (23000): Column 'id' cannot be null--b.联合主键
--只要联合的主键加起来不重复就可以
create table user2(id int,name varchar(20),password varchar(20),primary key(id,name)
);insert into user2 values(1,'张三','123');
insert into user2 values(2,'张三','123');
insert into user2 values(1,'李四','123');insert into user2 values(null,'李四','123');
mysql> insert into user2 values(null,'李四','123');
ERROR 1048 (23000): Column 'id' cannot be null--c.自增约束
create table user3(id int primary key auto_increment,name varchar(20)
);insert into user3(name) values('张三');mysql> insert into user3(name) values('张三');
Query OK, 1 row affected (0.00 sec)mysql> select * from user3;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
+----+--------+
1 row in set (0.00 sec)mysql> insert into user3(name) values('张三');
Query OK, 1 row affected (0.00 sec)mysql> select * from user3;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
+----+--------+
2 rows in set (0.00 sec)-- 如果说我们创建表的时候,忘记创建主键约束了,怎么办?
create table user4(id int,name varchar(20)
);mysql> desc user4-> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)--修改表的结构,添加主键
alter table user4 add primary key(id);mysql> desc user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)--如何删除?
alter table user4 drop primary key;mysql> alter table user4 drop primary key;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)--使用modify修改字段,添加约束
alter table user4 modify id int primary key;mysql> alter table user4 modify id int primary key;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)--d.唯一约束
--约束修饰的字符不可重复
create table user5(id int,name varchar(20)
);alter table user5 add unique(name);mysql> alter table user5 add unique(name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)insert into user5 values(1,'zhangsan');mysql> insert into user5 values(1,'zhangsan');
Query OK, 1 row affected (0.01 sec)mysql> insert into user5 values(1,'zhangsan');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'name'--name=lisi
mysql> insert into user5 values(1,'lisi');
Query OK, 1 row affected (0.01 sec)create table user6(id int,name varchar(20),unique(name)
);create table user7(id int,name varchar(20) unique
);create table user8(id int,name varchar(20),unique(id,name)
);-- unique(id,name)表示两个键在一起不重复就行
mysql> create table user8(-> id int,-> name varchar(20),-> unique(id,name)-> );
Query OK, 0 rows affected (0.03 sec)mysql> desc user8;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)insert into user8 values(1,'zhangsan');
insert into user8 values(2,'zhangsan');
insert into user8 values(1,'lisi');
mysql> select * from user8;
+------+----------+
| id | name |
+------+----------+
| 1 | lisi |
| 1 | zhangsan |
| 2 | zhangsan |
+------+----------+
3 rows in set (0.00 sec)-- 如何删除唯一约束?
alter table user7 drop index name;mysql> alter table user7 drop index name;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc user7;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)-- modify 添加alter table user7 modify name varchar(20) unique;mysql> alter table user7 modify name varchar(20) unique;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> desc user7;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)--总结:
--1、建表的时候就添加约束
--2、可以使用 alter... add...
--3、alter... modify...
--4、删除alter... drop...--非空约束
--修饰的字符不能为空 NULLcreate table user9(id int,name varchar(20) NOT NULL
);mysql> create table user9(-> id int,-> name varchar(20) NOT NULL-> );
Query OK, 0 rows affected (0.03 sec)mysql> desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)insert into user9 values(1);mysql> insert into user8 values(1);
ERROR 1136 (21S01): Column count doesn't match value count at row 1insert into user9 values(1,'zhangsan');mysql> insert into user9 values(1,'zhangsan');
Query OK, 1 row affected (0.01 sec)mysql> select * from user9;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)insert into user9(name) values('lisi');mysql> insert into user9(name) values('lisi');
Query OK, 1 row affected (0.00 sec)mysql> select * from user9;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| NULL | lisi |
+------+----------+
2 rows in set (0.00 sec)--e.默认约束
--就是当我们插入字段的时候,如果没有传值,就会使用默认值create table user10(id int,name varchar(20),age int default 10
);mysql> desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)insert into user10 (id,name) values(1,'zhangsan');mysql> insert into user10 (id,name) values(1,'zhangsan');
Query OK, 1 row affected (0.01 sec)mysql> select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
+------+----------+------+
1 row in set (0.00 sec)insert into user10 values(1,'zhangsan',18);mysql> insert into user10 values(1,'zhangsan',18);
Query OK, 1 row affected (0.01 sec)mysql> select * from user10;
+------+----------+------+
| id | name | age |
+------+----------+------+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 18 |
+------+----------+------+
2 rows in set (0.00 sec)--f.外键约束
--涉及到两个表:父表、子表
--主表、副表。--班级
create table classes(id int primary key,name varchar(20)
);-- 学生表
create table students(id int primary key,name varchar(20),class_id int,foreign key(class_id) references classes(id)
);insert into students values(1001,'张三',1);
insert into students values(1002,'张三',2);
insert into students values(1003,'张三',3);
insert into students values(1004,'张三',4);insert into students values(1005,'李四',5);mysql> insert into students values(1005,'李四',5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))insert into classes values(1,'一班');
insert into classes values(2,'二班');
insert into classes values(3,'三班');
insert into classes values(4,'四班');mysql> select * from classes;
+----+--------+
| id | name |
+----+--------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
+----+--------+
4 rows in set (0.01 sec)-- 1 主表(父表) classes 中没有的数据值 ,在副表(子表)中,是不可以使用的
-- 2 主表中的记录被副表引用,是不可以被删除的。delete from classes where id=4;
mysql> delete from classes where id=4;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))--二、如何使用可视化工具操作数据库?--三、如何在编程语言中操作数据库?
第二章 数据库的三大设计范式
-- 数据库的三大范式.sql--1.第一范式
-- 1NF-- 数据表中的所有字段都是不可分割的原子值create table student2(id int primary key,name varchar(20),address varchar(30)
);insert into student2 values(1,'zhangsan','成都郫都区');
insert into student2 values(2,'wangwu','成都金牛');
insert into student2 values(3,'lisi','成都武侯区');mysql> select * from student2;
+----+----------+-----------------+
| id | name | address |
+----+----------+-----------------+
| 1 | zhangsan | 成都郫都区 |
| 2 | wangwu | 成都金牛 |
| 3 | lisi | 成都武侯区 |
+----+----------+-----------------+
3 rows in set (0.00 sec)-- 字段值还可以继续拆分的,就不满足第一范式
create table student3(id int primary key,name varchar(20),country varchar(30),province varchar(30),city varchar(30),details varchar(30)
);insert into student3 values(1,'zhangsan','中国','四川省','成都市','郫都区1号');
insert into student3 values(2,'wangwu','中国','四川省','成都市','金牛区2号');
insert into student3 values(3,'lisi','中国','四川省','成都市','武侯区3号');mysql> select * from student3;
+----+----------+---------+-----------+-----------+---------------+
| id | name | country | province | city | details |
+----+----------+---------+-----------+-----------+---------------+
| 1 | zhangsan | 中国 | 四川省 | 成都市 | 郫都区1号 |
| 2 | wangwu | 中国 | 四川省 | 成都市 | 金牛区2号 |
| 3 | lisi | 中国 | 四川省 | 成都市 | 武侯区3号 |
+----+----------+---------+-----------+-----------+---------------+
3 rows in set (0.00 sec)-- 范式,设计的越详细,对于某些实际操作可能更好,但是不一定都是好处-- 2.第二范式
-- 必须满足第一范式的前提下, 第二范式要求,除主键外的每一列都必须完全依赖于主键
-- 如果出现不完全依赖 ,只可能发生在联合主键的情况下--订单表create table myOrder(product_id int,customer_id int,product_name varchar(20),customer_name varchar(20),primary key(product_id,customer_id)
);-- 问题?
-- 除主键外的其他列,只依赖于与主键的部分字段
-- 拆表create table myOrder(order_id int primary key,product_id int,customer_id int
);create table product(id int primary key,product_name varchar(20)
);create table customer(id int primary key,customer_name varchar(20)
);-- 分成三个表,就满足了第二范式的设计!!-- 3.第三范式
-- 3NF
-- 必须先满足第二范式,除开主键列的其他列之间不能有传递依赖关系。create table myOrder(order_id int primary key,product_id int,customer_id int
);create table customer(int primary key,name varchar(20),phone varchar(15)
);
第三章 mysql查询练习
-- mysql 查询练习学生表
Student
学号
姓名
性别
出生年月日
所在班级
create table student(sno varchar(20) primary key,sname varchar(20) not null,ssex varchar(20) not null,sbirthday datetime,class varchar(20)
); 教师表
Teacher
教师编号
教师名字
教师性别
出生年月日
职称
所在部门
create table teacher(tno varchar(20) primary key,tname varchar(20) not null,tsex varchar(20) not null,sbirthday datetime,prof varchar(20) not null,depart varchar(20) not null
); 课程表
Course
课程号
课程名称
教师编号
create table course(cno varchar(20) primary key,cname varchar(20) not null,tno varchar(20) not null,foreign key(tno) references teacher(tno)
); 成绩表
Score
学号
课程号
教师编号
create table score(sno varchar(20) not null,cno varchar(20) not null,degree decimal,foreign key(sno) references student(sno),foreign key(cno) references course(cno),primary key(sno,cno)
);-- 往数据表添加数据
#添加学生信息
insert into student values('101','曾华','男','1977-09-01','95033');
insert into student values('102','匡明','男','1972-09-01','95031');
insert into student values('103','王丽','女','1974-09-01','95033');
insert into student values('104','李军','男','1974-09-01','95033');
insert into student values('105','王芳','女','1976-09-01','95031');
insert into student values('106','陆君','男','1978-09-01','95031');
insert into student values('107','王尼玛','男','1975-09-01','95033');
insert into student values('108','张全蛋','男','1976-09-01','95031');
insert into student values('109','赵铁柱','男','1974-09-01','95031');#添加教师表
insert into teacher values('804','李成','男','1958-12-02','副教授','计算机系');
insert into teacher values('856','张勋','男','1969-9-18','讲师','电子工程系');
insert into teacher values('825','王萍','女','1972-6-13','助教','计算机系');
insert into teacher values('831','刘冰','女','1986-10-10','助教','电子工程系');#添加课程表
insert into course values('3-105','计算机导论','825');
insert into course values('3-245','操作系统','804');
insert into course values('6-166','数字电路','856');
insert into course values('9-888','高等数学','831');#添加成绩表
insert into score values('103','3-245','86');
insert into score values('105','3-245','75');
insert into score values('109','3-245','68');
insert into score values('103','3-105','92');
insert into score values('105','3-105','88');
insert into score values('109','3-105','76');
insert into score values('103','6-166','85');
insert into score values('105','6-166','79');
insert into score values('109','6-166','81');
#insert into score values('103','3-105','64');
#insert into score values('105','3-105','91');
#insert into score values('109','3-105','78');--查询练习
-- 1、查询student表的所有记录
mysql> select * from student;
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 107 | 王尼玛 | 男 | 1975-09-01 00:00:00 | 95033 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
9 rows in set (0.00 sec)--2、查询student表中所有记录的sname、ssex和class列
mysql> select sname,ssex,class from student;
+-----------+------+-------+
| sname | ssex | class |
+-----------+------+-------+
| 曾华 | 男 | 95033 |
| 匡明 | 男 | 95031 |
| 王丽 | 女 | 95033 |
| 李军 | 男 | 95033 |
| 王芳 | 女 | 95031 |
| 陆君 | 男 | 95031 |
| 王尼玛 | 男 | 95033 |
| 张全蛋 | 男 | 95031 |
| 赵铁柱 | 男 | 95031 |
+-----------+------+-------+
9 rows in set (0.00 sec)--3、查询教师所在的单位即不重复的depart列
mysql> select distinct depart from teacher;
+-----------------+
| depart |
+-----------------+
| 计算机系 |
| 电子工程系 |
+-----------------+
2 rows in set (0.00 sec)--4、查询score表中成绩在60到80之间的所有记录
-- 查询区间 between ... and ...
mysql> select * from score where degree between 60 and 80;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
+-----+-------+--------+
4 rows in set (0.00 sec)--直接使用运算符比较
mysql> select * from score where degree > 60 and degree < 80;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
+-----+-------+--------+
4 rows in set (0.00 sec)--5、查询score表中成绩为85,86或88的记录
--表示 或者关系的查询 in
mysql> select * from score where degree in(85,86,88);
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
+-----+-------+--------+
3 rows in set (0.00 sec)--6、查询student表中“95031”班或性别为女的记录
-- or表示或者
mysql> select * from student where class='95031' or ssex='女';
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
6 rows in set (0.00 sec)--7、以class降序查询student表的所有记录
-- 升序,降序
mysql> select * from student order by class desc;
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1975-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
9 rows in set (0.00 sec)-- 默认升序asc;
mysql> select * from student order by class ;
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1975-09-01 00:00:00 | 95033 |
+-----+-----------+------+---------------------+-------+
9 rows in set (0.00 sec)--8、以cno升序、degree降序查询score表中的所有记录
mysql> select * from score order by cno asc,degree desc;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
| 103 | 3-245 | 86 |
| 105 | 3-245 | 75 |
| 109 | 3-245 | 68 |
| 103 | 6-166 | 85 |
| 109 | 6-166 | 81 |
| 105 | 6-166 | 79 |
+-----+-------+--------+
9 rows in set (0.00 sec)--9、查询“95031”班的学生人数
--统计count
mysql> select count(*) from student where class='95031';
+----------+
| count(*) |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)--10、查询score表中的最高分的学生学号和课程号。(子查询或者排序)
mysql> select sno,cno from score where degree=(select max(degree) from score);
+-----+-------+
| sno | cno |
+-----+-------+
| 103 | 3-105 |
+-----+-------+
1 row in set (0.00 sec)-- 1找最高分
select max(degree) from score-- 2找最高的sno 和 cno
mysql> select sno,cno from score where degree=(select max(degree) from score);-- 排序的做法:
select sno,cno,degree from score order by degree ;mysql> select sno,cno,degree from score order by degree ;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 109 | 3-245 | 68 |
| 105 | 3-245 | 75 |
| 109 | 3-105 | 76 |
| 105 | 6-166 | 79 |
| 109 | 6-166 | 81 |
| 103 | 6-166 | 85 |
| 103 | 3-245 | 86 |
| 105 | 3-105 | 88 |
| 103 | 3-105 | 92 |
+-----+-------+--------+
9 rows in set (0.01 sec)--select sno,cno,degree from score order by degree desc limit 0,1;
-- limit第一个数字表示从多少开始,第二个数表示查多少条
mysql> select sno,cno,degree from score order by degree desc limit 0,1;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
+-----+-------+--------+
1 row in set (0.00 sec)--11、查询每门课的平均成绩
select * from course;--avg()
select avg(degree) from score where cno='3-105';
select avg(degree) from score where cno='3-245';
select avg(degree) from score where cno='6-166';
select avg(degree) from score where cno='9-888';--我能不能在一个sql 语句中写呢?
--group by 分组
select cno,avg(degree) from score group by cno;mysql> select cno,avg(degree) from score group by cno;
+-------+-------------+
| cno | avg(degree) |
+-------+-------------+
| 3-105 | 85.3333 |
| 3-245 | 76.3333 |
| 6-166 | 81.6667 |
+-------+-------------+
3 rows in set (0.00 sec) --12、查询score表中至少有2名学生选修的并以3开头的课程的平均分数select cno,avg(degree),count(*) from score
group by cno
having count(cno)>=2
and cno like '3%';mysql> select cno,avg(degree),count(*) from score group by cno having count(cno)>=2 and cno like '3%';
+-------+-------------+----------+
| cno | avg(degree) | count(*) |
+-------+-------------+----------+
| 3-105 | 85.3333 | 3 |
| 3-245 | 76.3333 | 3 |
+-------+-------------+----------+
2 rows in set (0.00 sec)-- 13、查询分数大于70,小于90的sno列
select sno,degree from score where degree between 70 and 90;
--where degree>70 and degree<90;mysql> select sno,degree from score where degree between 70 and 90;
+-----+--------+
| sno | degree |
+-----+--------+
| 103 | 86 |
| 103 | 85 |
| 105 | 88 |
| 105 | 75 |
| 105 | 79 |
| 109 | 76 |
| 109 | 81 |
+-----+--------+
7 rows in set (0.00 sec)mysql> select sno,degree from score where degree>70 and degree<90;
+-----+--------+
| sno | degree |
+-----+--------+
| 103 | 86 |
| 103 | 85 |
| 105 | 88 |
| 105 | 75 |
| 105 | 79 |
| 109 | 76 |
| 109 | 81 |
+-----+--------+
7 rows in set (0.00 sec)--14、查询所有学生的 sname、cno 和degree 列
--等号=表存在的 共同字段
select sno,sname from student;mysql> select sno,sname from student;
+-----+-----------+
| sno | sname |
+-----+-----------+
| 101 | 曾华 |
| 102 | 匡明 |
| 103 | 王丽 |
| 104 | 李军 |
| 105 | 王芳 |
| 106 | 陆君 |
| 107 | 王尼玛 |
| 108 | 张全蛋 |
| 109 | 赵铁柱 |
+-----+-----------+
9 rows in set (0.00 sec)select sno,cno,degree from score;mysql> select sno,cno,degree from score;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-----+-------+--------+
9 rows in set (0.00 sec)select sname,cno,degree from student,score
where student.sno=score.sno;
mysql> select sname,cno,degree from student,score-> where student.sno=score.sno;
+-----------+-------+--------+
| sname | cno | degree |
+-----------+-------+--------+
| 王丽 | 3-105 | 92 |
| 王丽 | 3-245 | 86 |
| 王丽 | 6-166 | 85 |
| 王芳 | 3-105 | 88 |
| 王芳 | 3-245 | 75 |
| 王芳 | 6-166 | 79 |
| 赵铁柱 | 3-105 | 76 |
| 赵铁柱 | 3-245 | 68 |
| 赵铁柱 | 6-166 | 81 |
+-----------+-------+--------+
9 rows in set (0.00 sec)--15、查询所有学生的sno、cname 和degree列
select cno,cname from course;mysql> select cno,cname from course;
+-------+-----------------+
| cno | cname |
+-------+-----------------+
| 3-105 | 计算机导论 |
| 3-245 | 操作系统 |
| 6-166 | 数字电路 |
| 9-888 | 高等数学 |
+-------+-----------------+
4 rows in set (0.01 sec)select cno,sno,degree from score;
mysql> select cno,sno,degree from score;
+-------+-----+--------+
| cno | sno | degree |
+-------+-----+--------+
| 3-105 | 103 | 92 |
| 3-245 | 103 | 86 |
| 6-166 | 103 | 85 |
| 3-105 | 105 | 88 |
| 3-245 | 105 | 75 |
| 6-166 | 105 | 79 |
| 3-105 | 109 | 76 |
| 3-245 | 109 | 68 |
| 6-166 | 109 | 81 |
+-------+-----+--------+
9 rows in set (0.00 sec)select sno,cname,degree from course,score
where course.cno=score.cno;mysql> select sno,cname,degree from course,score-> where course.cno=score.cno;
+-----+-----------------+--------+
| sno | cname | degree |
+-----+-----------------+--------+
| 103 | 计算机导论 | 92 |
| 103 | 操作系统 | 86 |
| 103 | 数字电路 | 85 |
| 105 | 计算机导论 | 88 |
| 105 | 操作系统 | 75 |
| 105 | 数字电路 | 79 |
| 109 | 计算机导论 | 76 |
| 109 | 操作系统 | 68 |
| 109 | 数字电路 | 81 |
+-----+-----------------+--------+
9 rows in set (0.00 sec)--16、查询所有学生的 sname、cname 和degree 列
--sname -> student
--cname ->course
--degree ->score select sname,cname,degree,student.sno as stu_sno,score.sno,course.cno as cou_cno,score.cno from student,course,score
where student.sno=score.sno
and course.cno=score.cno;mysql> select sname,cname,degree from student,course,score-> where student.sno=score.sno and course.cno=score.cno;
+-----------+-----------------+--------+
| sname | cname | degree |
+-----------+-----------------+--------+
| 王丽 | 计算机导论 | 92 |
| 王丽 | 操作系统 | 86 |
| 王丽 | 数字电路 | 85 |
| 王芳 | 计算机导论 | 88 |
| 王芳 | 操作系统 | 75 |
| 王芳 | 数字电路 | 79 |
| 赵铁柱 | 计算机导论 | 76 |
| 赵铁柱 | 操作系统 | 68 |
| 赵铁柱 | 数字电路 | 81 |
+-----------+-----------------+--------+
9 rows in set (0.00 sec)--17、查询“95031”班学生每门课的平均分
select * from student where class='95031';
select sno from student where class='95031';mysql> select * from score where sno in (select sno from student where class='95031');
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-105 | 88 |
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-----+-------+--------+
6 rows in set (0.00 sec)select cno,avg(degree)
from score
where sno in (select sno from student where class='95031')
group by cno;mysql> select cno,avg(degree)-> from score-> where sno in (select sno from student where class='95031')-> group by cno;
+-------+-------------+
| cno | avg(degree) |
+-------+-------------+
| 3-105 | 82.0000 |
| 3-245 | 71.5000 |
| 6-166 | 80.0000 |
+-------+-------------+
3 rows in set (0.00 sec)--18、查询选修“3-105”课程的成绩高于“109”号同学“3-105”成绩的所有同学的记录select degree from score where sno='109' and cno='3-105';select * from score where cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105');mysql> select * from score where cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105');
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
| 105 | 3-105 | 88 |
+-----+-------+--------+
2 rows in set (0.00 sec)--19、查询成绩高于选修“3-105”课程的成绩高于“109”号同学“3-105”成绩的所有同学的记录
select * from score where degree>(select degree from score where sno='109' and cno='3-105');mysql> select * from score where degree>(select degree from score where sno='109' and cno='3-105');
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 103 | 6-166 | 85 |
| 105 | 3-105 | 88 |
| 105 | 6-166 | 79 |
| 109 | 6-166 | 81 |
+-----+-------+--------+--20、查询所有学号为108.101的同学同年出生的所有学生的sno,sname和sbirthday
select * from student where YEAR(sbirthday) in (select YEAR(sbirthday) from student where sno in('101','108'));mysql> select * from student where YEAR(sbirthday) in (select YEAR(sbirthday) from student where sno in('101','108'));
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
3 rows in set (0.00 sec)--21、查询 张勋 教师任课的学生的成绩
select * from student
where sno IN (SELECT sno FROM scoreWHERE cno = (SELECT cno FROM course WHERE tno = (SELECT tno FROM teacher WHERE tname='张勋')));mysql> select * from student-> where sno IN (SELECT sno FROM score-> WHERE cno = (SELECT cno FROM course-> WHERE tno = (SELECT tno FROM teacher WHERE tname='张勋')));
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
3 rows in set (0.00 sec)-- 22.查询选修课程的同学人数多余 5 人的教师姓名
SELECT * FROM teacher
WHERE tno IN(SELECT tno FROM course
WHERE cno IN (SELECT cno FROM score GROUP BY cno HAVING COUNT(sno) > 5));--为能查到数据,向score中添加三条数据
INSERT INTO score VALUES('101','3-105','90');
INSERT INTO score VALUES('102','3-105','91');
INSERT INTO score VALUES('104','3-105','89');mysql> SELECT * FROM teacher-> WHERE tno IN(SELECT tno FROM course-> WHERE cno IN (SELECT cno FROM score GROUP BY cno HAVING COUNT(sno) > 5));
+-----+--------+------+---------------------+--------+--------------+
| tno | tname | tsex | sbirthday | prof | depart |
+-----+--------+------+---------------------+--------+--------------+
| 825 | 王萍 | 女 | 1972-06-13 00:00:00 | 助教 | 计算机系 |
+-----+--------+------+---------------------+--------+--------------+
1 row in set (0.00 sec)-- 23.查询95033班和95031班全体学生的记录
SELECT * FROM student WHERE class IN('95031','95033') ORDER BY class ;mysql> SELECT * FROM student WHERE class IN('95031','95033') ORDER BY class ;
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1975-09-01 00:00:00 | 95033 |
+-----+-----------+------+---------------------+-------+
9 rows in set (0.00 sec)-- 24.查询存在85分以上成绩的课程cno
SELECT * FROM score where degree > 85;mysql> SELECT * FROM score where degree > 85;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 103 | 3-245 | 86 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+-----+-------+--------+
6 rows in set (0.00 sec)-- 25.查出所有'计算机系' 教师所教课程的成绩表
SELECT * FROM score WHERE cno IN (SELECT cno FROM course
WHERE tno IN (SELECT tno FROM teacher
WHERE depart = '计算机系'));mysql> SELECT * FROM score WHERE cno IN (SELECT cno FROM course-> WHERE tno IN (SELECT tno FROM teacher-> WHERE depart = '计算机系'));
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-245 | 86 |
| 105 | 3-245 | 75 |
| 109 | 3-245 | 68 |
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
+-----+-------+--------+
9 rows in set (0.00 sec)-- 26.查询'计算机系'与'电子工程系' 不同职称的教师的name和prof
-- UNION 求并集
SELECT * FROM teacher WHERE depart = '计算机系' AND prof NOT IN (SELECT prof FROM teacher WHERE depart = '电子工程系')
UNION
SELECT * FROM teacher WHERE depart = '电子工程系' AND prof NOT IN (SELECT prof FROM teacher WHERE depart = '计算机系');mysql> SELECT * FROM teacher WHERE depart = '计算机系' AND prof NOT IN (SELECT prof FROM teacher WHERE depart = '电子工 程系')-> UNION-> SELECT * FROM teacher WHERE depart = '电子工程系' AND prof NOT IN (SELECT prof FROM teacher WHERE depart = '计算 机系');
+-----+--------+------+---------------------+-----------+-----------------+
| tno | tname | tsex | sbirthday | prof | depart |
+-----+--------+------+---------------------+-----------+-----------------+
| 804 | 李成 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 856 | 张勋 | 男 | 1969-09-18 00:00:00 | 讲师 | 电子工程系 |
+-----+--------+------+---------------------+-----------+-----------------+
2 rows in set (0.00 sec)-- 27, 查询选修编号为"3-105"课程且成绩至少高于选修编号为'3-245'同学的cno,sno和degree,并且按照degree从高到地次序排序
-- 至少表示大于其中 至少一个,any
select * from score where cno = '3-105'
AND degree > ANY(SELECT degree FROM score WHERE cno = '3-245' )
ORDER BY degree desc ;mysql> select * from score where cno = '3-105' AND degree > ANY(SELECT degree FROM score WHERE cno = '3-245' ) ORDER BY degree desc ;
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
| 102 | 3-105 | 91 |
| 101 | 3-105 | 90 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
| 109 | 3-105 | 76 |
+-----+-------+--------+
6 rows in set (0.00 sec)-- 28.查询选修编号为"3-105"且成绩高于选修编号为"3-245"课程的同学cno,sno和degree
-- 且?
SELECT * FROM score WHERE degree > ALL (select degree from score WHERE cno = '3-245') AND cno = '3-105';mysql> SELECT * FROM score WHERE degree > ALL (select degree from score WHERE cno = '3-245') AND cno = '3-105';
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 103 | 3-105 | 92 |
| 104 | 3-105 | 89 |
| 105 | 3-105 | 88 |
+-----+-------+--------+
5 rows in set (0.00 sec)-- 29. 查询所有教师和同学的 name ,sex, birthday
-- 别名? as,后面的数据默认使用别名为列名
SELECT sname AS name, ssex AS sex, sbirthday AS birthday FROM student
UNION
SELECT tname , tsex , tbirthday FROM teacher;mysql> SELECT sname AS name, ssex AS sex, sbirthday AS birthday FROM student-> UNION-> SELECT tname , tsex , tbirthday FROM teacher;
+-----------+-----+---------------------+
| name | sex | birthday |
+-----------+-----+---------------------+
| 曾华 | 男 | 1977-09-01 00:00:00 |
| 匡明 | 男 | 1972-09-01 00:00:00 |
| 王丽 | 女 | 1974-09-01 00:00:00 |
| 李军 | 男 | 1974-09-01 00:00:00 |
| 王芳 | 女 | 1976-09-01 00:00:00 |
| 陆君 | 男 | 1978-09-01 00:00:00 |
| 王尼玛 | 男 | 1975-09-01 00:00:00 |
| 张全蛋 | 男 | 1976-09-01 00:00:00 |
| 赵铁柱 | 男 | 1974-09-01 00:00:00 |
| 李成 | 男 | 1958-12-02 00:00:00 |
| 王萍 | 女 | 1972-06-13 00:00:00 |
| 刘冰 | 女 | 1986-10-10 00:00:00 |
| 张勋 | 男 | 1969-09-18 00:00:00 |
+-----------+-----+---------------------+
13 rows in set (0.00 sec)-- 30.查询所有'女'教师和'女'学生的name,sex,birthday
SELECT sname AS name, ssex AS sex, sbirthday AS birthday FROM student WHERE ssex = '女'
UNION
SELECT tname AS name, tsex AS sex, tbirthday AS birthday FROM teacher WHERE tsex = '女';mysql> SELECT sname AS name, ssex AS sex, sbirthday AS birthday FROM student WHERE ssex = '女'-> UNION-> SELECT tname AS name, tsex AS sex, tbirthday AS birthday FROM teacher WHERE tsex = '女';
+--------+-----+---------------------+
| name | sex | birthday |
+--------+-----+---------------------+
| 王丽 | 女 | 1974-09-01 00:00:00 |
| 王芳 | 女 | 1976-09-01 00:00:00 |
| 王萍 | 女 | 1972-06-13 00:00:00 |
| 刘冰 | 女 | 1986-10-10 00:00:00 |
+--------+-----+---------------------+
4 rows in set (0.00 sec)-- 31.查询成绩比该课程平均成绩低的同学的成绩表
select * from score;
a(sc1) b(sc2)
+-----+-------+--------+ +-----+-------+--------+
| sno | cno | degree | | sno | cno | degree |
+-----+-------+--------+ +-----+-------+--------+
| 101 | 3-105 | 90 | | 101 | 3-105 | 90 |
| 102 | 3-105 | 91 | | 102 | 3-105 | 91 |
| 103 | 3-105 | 92 | | 103 | 3-105 | 92 |
| 103 | 3-245 | 86 | | 103 | 3-245 | 86 |
| 103 | 6-166 | 85 | | 103 | 6-166 | 85 |
| 104 | 3-105 | 89 | | 104 | 3-105 | 89 |
| 105 | 3-105 | 88 | | 105 | 3-105 | 88 |
| 105 | 3-245 | 75 | | 105 | 3-245 | 75 |
| 105 | 6-166 | 79 | | 105 | 6-166 | 79 |
| 109 | 3-105 | 76 | | 109 | 3-105 | 76 |
| 109 | 3-245 | 68 | | 109 | 3-245 | 68 |
| 109 | 6-166 | 81 | | 109 | 6-166 | 81 |
+-----+-------+--------+ +-----+-------+--------+
12 rows in set (0.00 sec)
SELECT * FROM score AS sc1 WHERE sc1.degree < (SELECT AVG(degree) FROM score AS sc2 WHERE sc1.cno = sc2.cno);mysql> SELECT * FROM score AS sc1 WHERE sc1.degree < (SELECT AVG(degree) FROM score AS sc2 WHERE sc1.cno = sc2.cno);
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-245 | 75 |
| 105 | 6-166 | 79 |
| 109 | 3-105 | 76 |
| 109 | 3-245 | 68 |
| 109 | 6-166 | 81 |
+-----+-------+--------+
5 rows in set (0.00 sec)-- 32.查询所有任课教师的tname 和 depart(要在分数表中可以查得到,排了课)-- 课程表中安排了课程
SELECT * FROM teacher WHERE tno IN(SELECT tno FROM course);mysql> SELECT * FROM teacher WHERE tno IN(SELECT tno FROM course);
+-----+--------+------+---------------------+-----------+-----------------+
| tno | tname | tsex | tbirthday | prof | depart |
+-----+--------+------+---------------------+-----------+-----------------+
| 804 | 李成 | 男 | 1958-12-02 00:00:00 | 副教授 | 计算机系 |
| 825 | 王萍 | 女 | 1972-06-13 00:00:00 | 助教 | 计算机系 |
| 831 | 刘冰 | 女 | 1986-10-10 00:00:00 | 助教 | 电子工程系 |
| 856 | 张勋 | 男 | 1969-09-18 00:00:00 | 讲师 | 电子工程系 |
+-----+--------+------+---------------------+-----------+-----------------+
4 rows in set (0.00 sec)-- 33.查出至少有2名男生的班号
-- 为更好看出向学生表 添加一条数据
insert into student values('110','张飞','男','1977-01-29','95038');
SELECT class FROM student WHERE ssex = '男' GROUP BY class HAVING COUNT(*) > 1; --或者COUNT(sno) > 1mysql> SELECT class FROM student WHERE ssex = '男' GROUP BY class HAVING COUNT(*) > 1;
+-------+
| class |
+-------+
| 95031 |
| 95033 |
+-------+
2 rows in set (0.00 sec)-- 34.查询student 表中 不姓"王"的同学的记录
-- 模糊查询筛选 not like
SELECT * FROM student WHERE sname NOT LIKE '王%'; mysql> SELECT * FROM student WHERE sname NOT LIKE '王%';
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
6 rows in set (0.00 sec)-- 35. 查询student 中每个学生的姓名和年龄(当前时间 - 出生年份)
SELECT sname, YEAR(NOW()) - YEAR(sbirthday) AS '年龄' FROM student;mysql> SELECT sname, YEAR(NOW()) - YEAR(sbirthday) AS '年龄' FROM student;
+-----------+--------+
| sname | 年龄 |
+-----------+--------+
| 曾华 | 43 |
| 匡明 | 48 |
| 王丽 | 46 |
| 李军 | 46 |
| 王芳 | 44 |
| 陆君 | 42 |
| 王尼玛 | 45 |
| 张全蛋 | 44 |
| 赵铁柱 | 46 |
| 张飞 | 43 |
+-----------+--------+
10 rows in set (0.00 sec)-- 36. 查询student中最大和最小的 sbirthday的值
-- max min
SELECT MAX(sbirthday) as '最大',MIN(sbirthday) as '最小' FROM student;mysql> SELECT MAX(sbirthday) as '最大',MIN(sbirthday) as '最小' FROM student;
+---------------------+---------------------+
| 最大 | 最小 |
+---------------------+---------------------+
| 1978-09-01 00:00:00 | 1972-09-01 00:00:00 |
+---------------------+---------------------+
1 row in set (0.00 sec)-- 37.以班级号和年龄从大到小的顺序查询student表中的全部记录
SELECt * FROM student ORDER BY class DESC, sbirthday; mysql> SELECt * FROM student ORDER BY class DESC, sbirthday;
+-----+-----------+------+---------------------+-------+
| sno | sname | ssex | sbirthday | class |
+-----+-----------+------+---------------------+-------+
| 103 | 王丽 | 女 | 1974-09-01 00:00:00 | 95033 |
| 104 | 李军 | 男 | 1974-09-01 00:00:00 | 95033 |
| 107 | 王尼玛 | 男 | 1975-09-01 00:00:00 | 95033 |
| 101 | 曾华 | 男 | 1977-09-01 00:00:00 | 95033 |
| 102 | 匡明 | 男 | 1972-09-01 00:00:00 | 95031 |
| 109 | 赵铁柱 | 男 | 1974-09-01 00:00:00 | 95031 |
| 105 | 王芳 | 女 | 1976-09-01 00:00:00 | 95031 |
| 108 | 张全蛋 | 男 | 1976-09-01 00:00:00 | 95031 |
| 106 | 陆君 | 男 | 1978-09-01 00:00:00 | 95031 |
+-----+-----------+------+---------------------+-------+
9 rows in set (0.00 sec)-- 38.查询"男"教师 及其所上的课
SELECT * FROM course WHERE tno IN (SELECT tno FROM teacher WHERE tsex = '男');mysql> SELECT * FROM course WHERE tno IN (SELECT tno FROM teacher WHERE tsex = '男');
+-------+--------------+-----+
| cno | cname | tno |
+-------+--------------+-----+
| 3-245 | 操作系统 | 804 |
| 6-166 | 数字电路 | 856 |
+-------+--------------+-----+
2 rows in set (0.00 sec)-- 39.查询最高分同学的sno ,cno 和 degree;
SELECT * FROM score WHERE degree = (select MAX(degree) AS degree FROM score);mysql> SELECT * FROM score WHERE degree = (select MAX(degree) AS degree FROM score);
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 103 | 3-105 | 92 |
+-----+-------+--------+
1 row in set (0.00 sec)-- 40. 查询和"李军"同性别的所有同学的sname
SELECT sname, ssex FROM student WHERE sSEX = (SELECT ssex FROM student WHERE sname = '李军');mysql> SELECT sname, ssex FROM student WHERE sSEX = (SELECT ssex FROM student WHERE sname = '李军');
+-----------+------+
| sname | ssex |
+-----------+------+
| 曾华 | 男 |
| 匡明 | 男 |
| 李军 | 男 |
| 陆君 | 男 |
| 王尼玛 | 男 |
| 张全蛋 | 男 |
| 赵铁柱 | 男 |
+-----------+------+
7 rows in set (0.00 sec)-- 41.查询和"李军"同性别并且同班的所有同学的sname
SELECT sname, ssex FROM student
WHERE ssex = (SELECT ssex FROM student WHERE sname = '李军')
AND class = (SELECT class FROM student WHERE sname = '李军');mysql> SELECT sname, ssex FROM student WHERE ssex = (SELECT ssex FROM student WHERE sname = '李军') AND class = (SELECT class FROM student WHERE sname = '李军');
+-----------+------+
| sname | ssex |
+-----------+------+
| 曾华 | 男 |
| 李军 | 男 |
| 王尼玛 | 男 |
+-----------+------+
3 rows in set (0.00 sec)-- 42. 查询所有选修'计算机导论'课程的'男'同学的成绩表
SELECT * FROM score
WHERE cno = (SELECT cno FROM course WHERE cname = '计算机导论' )
AND sno IN(SELECT sno FROM student WHERE ssex = '男');mysql> SELECT * FROM score WHERE cno = (SELECT cno FROM course WHERE cname = '计算机导论' ) AND sno IN(SELECT sno FROM student WHERE ssex = '男');
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 101 | 3-105 | 90 |
| 102 | 3-105 | 91 |
| 104 | 3-105 | 89 |
| 109 | 3-105 | 76 |
+-----+-------+--------+
4 rows in set (0.00 sec)-- 43. 假设使用了以下命令建立了一个grade表:
CREATE TABLE grade(low INT(3),upp INT(3),grade CHAR(1)
);INSERT INTO grade VALUES(90,100,'A');
INSERT INTO grade VALUES(80,89,'B');
INSERT INTO grade VALUES(70,79,'c');
INSERT INTO grade VALUES(60,69,'D');
INSERT INTO grade VALUES(0,59,'E');-- 现查询所有同学的sno , cno 和grade列
SELECT sno, cno , grade FROM score, grade WHERE degree BETWEEN low and upp; mysql> SELECT sno, cno , grade FROM score, grade WHERE degree BETWEEN low and upp;
+-----+-------+-------+
| sno | cno | grade |
+-----+-------+-------+
| 101 | 3-105 | A |
| 102 | 3-105 | A |
| 103 | 3-105 | A |
| 103 | 3-245 | B |
| 103 | 6-166 | B |
| 104 | 3-105 | B |
| 105 | 3-105 | B |
| 105 | 3-245 | c |
| 105 | 6-166 | c |
| 109 | 3-105 | c |
| 109 | 3-245 | D |
| 109 | 6-166 | B |
+-----+-------+-------+
12 rows in set (0.00 sec)
select * from grade;-- 将某行的c换为C
UPDATE grade SET grade = REPLACE (grade, 'c', 'C');
第四章 mysql连接查询
SQL 的四种连接查询内连接
inner join或join外连接
1.左连接 left join 或者 left outer join2.右连接 right join 或者 right outer join3.完全外连接 full join 或者 full outer join-- 创建两张表-- person 表
id,
name,
cardId create table person(id int,name varchar(20),cardId int
);-- card表
id,
namecreate table card(id int,name varchar(20)
);insert into card values(1,'饭卡');
insert into card values(2,'建行卡');
insert into card values(3,'工商卡');
insert into card values(4,'邮政卡');
insert into card values(5,'农行卡');insert into person values(1,'张三',1);
insert into person values(2,'李四',3);
insert into person values(3,'王五',6);-- 并没有创建外键-- 1、inner join 查询(内连接)select * from person inner join card on person.cardId=card.id;mysql> select * from person inner join card on person.cardId=card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 工商卡 |
+------+--------+--------+------+-----------+
2 rows in set (0.00 sec)-- 内连查询,其实就是两表数据 ,通过某个字段相等, 查询出相关记录数据。-- 2、left join(左外连接)
select * from person left join card on person.cardId=card.id;mysql> select * from person left join card on person.cardId=card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 工商卡 |
| 3 | 王五 | 6 | NULL | NULL |
+------+--------+--------+------+-----------+
3 rows in set (0.00 sec)-- 左外连接, 会把左边表里面的所有数据取出来, 而右边表中的数据 ,如果由相等的, 就显示出来。
-- 如果没有, 就会补 NULL
select * from person left OUTER join card on person.cardId=card.id;mysql> select * from person left OUTER join card on person.cardId=card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 工商卡 |
| 3 | 王五 | 6 | NULL | NULL |
+------+--------+--------+------+-----------+
3 rows in set (0.00 sec)-- 3、right join(右外连接)
select * from person right join card on person.cardId=card.id;mysql> select * from person right join card on person.cardId=card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 工商卡 |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 邮政卡 |
| NULL | NULL | NULL | 5 | 农行卡 |
+------+--------+--------+------+-----------+
5 rows in set (0.00 sec)-- 右外连接, 会把右边表里面的所有数据取出来, 而左边表中的数据 ,如果由相等的, 就显示出来。
-- 如果没有, 就会补 NULLselect * from person right OUTER join card on person.cardId=card.id;mysql> select * from person right OUTER join card on person.cardId=card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 张三 | 1 | 1 | 饭卡 |
| 2 | 李四 | 3 | 3 | 工商卡 |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 邮政卡 |
| NULL | NULL | NULL | 5 | 农行卡 |
+------+--------+--------+------+-----------+
5 rows in set (0.00 sec)-- 4、全外连接
select * from person full join card on person.cardId=card.id;-- mysql 不支持 full joinselect * from person left join card on person.cardId=card.id
union
select * from person right join card on person.cardId=card.id;
第五章 mysql事务
--mysql 事务mysql 中,事务其实是一个最小的不可分割的工作单元 。事务能保证一个业务的完整性。比如我们的 银行转账:a-> -100update user set money=money-100 where name = 'a';b-> +100update user set money=money-100 where name = 'b';-- 实际程序中,如果只有一条语句执行成功了,而另一条没有执行成功?
-- 出现数据前后不一致。update user set money=money-100 where name = 'a';update user set money=money-100 where name = 'b';-- 多条sql语句,可能会有同时成功的要求, 要么就同时失败。-- mysql 中如何控制事务?1、mysql 默认是开启事务的。(视频有误,自动提交关闭才是事务开启) mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.01 sec)-- 默认事务开启的作用是什么?
-- 当我们去执行一个sql 语句的时候,效果会立马体现出来,且不能回滚。create database bank;create table user(id int primary key,name varchar(20),money int
);insert into user values(1,'a',1000);-- 事务回滚: 撤销mysql语句执行效果
rollback;mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
1 row in set (0.00 sec)-- 设置mysql 自动提交为 false
set autocommit =0;mysql> set autocommit =0;
Query OK, 0 rows affected (0.01 sec)mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
1 row in set (0.00 sec)--上面的操作 ,关闭了mysql 的自动提交(commit)insert into user values(2,'b',1000);mysql> insert into user values(2,'b',1000);
Query OK, 1 row affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
+----+------+-------+
1 row in set (0.00 sec)-- 再一次插入数据
mysql> insert into user values(2,'b',1000);
Query OK, 1 row affected (0.00 sec)-- 手动提交数据
mysql> commit;
Query OK, 0 rows affected (0.01 sec)-- 再撤销,是不可撤销的(持久性)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)-- 自动提交? @@autocommit=1;
-- 手动提交? commit;
-- 事务回滚? rollback;-- 如果说这个时候转账:update user set money=money-100 where name = 'a';
update user set money=money+100 where name = 'b';rollback;mysql> update user set money=money-100 where name = 'a';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set money=money+100 where name = 'b';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.01 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 1000 |
| 2 | b | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)-- 事务给我们提供一个返回的机会。set autocommit =1;mysql> set autocommit =1;
Query OK, 0 rows affected (0.00 sec)mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)begin;
-- 或者
start transaction;
-- 都可以帮我们手动开启一个事务mysql> update user set money=money-100 where name = 'a';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set money=money+100 where name = 'b';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)-- 事务回滚:
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)-- 没有被撤销
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)-- 手动开启事务(1)
begin;
update user set money=money-100 where name = 'a';
update user set money=money+100 where name = 'b';mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update user set money=money-100 where name = 'a';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set money=money+100 where name = 'b';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 800 |
| 2 | b | 1200 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)-- 手动开启事务(2)
-- 事务开启之后 ,一旦 commit提交,就不可以回滚 (也就是当前的事务在提交的时候就结束了)
start transaction;
update user set money=money-100 where name = 'a';
update user set money=money+100 where name = 'b';mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update user set money=money-100 where name = 'a';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set money=money+100 where name = 'b';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 800 |
| 2 | b | 1200 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> rollback;
Query OK, 0 rows affected (0.00 sec)mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
+----+------+-------+
2 rows in set (0.00 sec)事务的四大特征
A 原子性:事务是最小的
C 一致性:事务要求,同一事物中的sql语句,必须保证同时成功或同时失败
I 隔离性:事务1和事务2 之间是具有隔离性
D 持久性:事务一旦结束(commit ,rollback),就不可能返回事务的开启:1.修改默认提交 set autocommit=02. begin;3. start transaction;事务手动提交:commit;事务手动回滚: rollback;-- 事务的隔离性:1、read uncommitted; 读未提交
2、read committed; 读已经提交的
3、repeatable read; 可以重复读
4、serializable; 串行化1-read uncommitted如果有事务a, 事务b
a 事务对事务进行操作, 在操作过程中, 事务没有被提交, 但是b可以看见a 操作的结果bank数据库 user表
insert into user values(3,'小明',1000);
insert into user values(4,'淘宝店',1000);mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
+----+-----------+-------+
4 rows in set (0.00 sec)-- 如何查看数据库的隔离级别?
mysql 8.0:
-- 系统级别的
select @@global.transaction_isolation;
-- 会话级别的
select @@transaction_isolation;-- mysql 默认隔离级别 REPEATABLE-READ
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ |
+--------------------------------+
1 row in set (0.01 sec)mysql 5.x:
select @@global.tx_isolation;
select @@tx_isolation;-- 如何修改隔离级别?set global transaction isolation level read uncommitted;mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.02 sec)mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-UNCOMMITTED |
+--------------------------------+
1 row in set (0.00 sec)-- 转账:小明在淘宝店买鞋子:800块钱,小明-》成都 ATM淘宝店-》广州 ATMstart transaction;
update user set money=money-800 where name='小明';
update user set money=money+800 where name='淘宝店';mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update user set money=money-800 where name='小明';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set money=money+800 where name='淘宝店';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0-- 给淘宝店打电话,说你查一下,是不是到账了-- 淘宝店在广州查账
mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 200 |
| 4 | 淘宝店 | 1800 |
+----+-----------+-------+
4 rows in set (0.00 sec)-- 发货
-- 晚上请女朋友吃好吃的
--1800-- 小明-》成都
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
+----+-----------+-------+
4 rows in set (0.00 sec)-- 结账的时候发现钱不够
mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
+----+-----------+-------+
4 rows in set (0.00 sec)-- 如果两个不同的地方,都在进行操作,如果事务a 开启之后,他的数据可以被其他事务读取到。
-- 这样会出现(脏读)
-- 脏读:一个事务读到了另外一个事务没有提交的数据,就叫做脏读。
-- 实际开发是不允许脏读出现的。2-read committed; 读已经提交的set global transaction isolation level read committed;select @@global.transaction_isolation;-- 修改隔离级别为read committed
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-COMMITTED |
+--------------------------------+
1 row in set (0.00 sec)bank 数据库 user表小张:银行的会计
start transaction;
select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
+----+-----------+-------+
4 rows in set (0.00 sec)小张出去上厕所去了。。。抽烟小王:
start transaction;
insert into user values(5,'c',100);
commit;+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
+----+-----------+-------+
5 rows in set (0.00 sec)-- 小张上完厕所, 抽完烟回来了
select avg(money) from user;
+------------+
| avg(money) |
+------------+
| 820.0000 |
+------------+
1 row in set (0.01 sec)-- money 的平均值不是1000,变少了?-- 虽然我只能读到另一个事务提交的数据,但还是会出现问题,就是
-- 读取同一个表的数据, 发现前后不一致
-- 不可重复读现象:read committed3、repeatable read; 可以重复读set global transaction isolation level repeatable read;select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ |
+--------------------------------+
1 row in set (0.00 sec)-- 在REPEATABLE-READ 隔离级别下又会出现什么问题?
select * from user;-- 张全蛋-成都
start transaction;-- 王尼玛-北京
start transaction;-- 张全蛋-成都
mysql> insert into user values(6,'d',1000);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.01 sec)mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
| 6 | d | 1000 |
+----+-----------+-------+
6 rows in set (0.00 sec)-- 王尼玛-北京
mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
+----+-----------+-------+
5 rows in set (0.00 sec)mysql> insert into user values(6,'d',1000);
ERROR 1062 (23000): Duplicate entry '6' for key 'PRIMARY'-- 这种现象就叫做幻读!!
-- 事务a 和 事务b 同时操作一张表,事务a提交的数据,也不能被事务b 读到,就可造成幻读。4、serializable; 串行化
-- 修改隔离级别为serializable串行化
set global transaction isolation level serializable;select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| SERIALIZABLE |
+--------------------------------+
1 row in set (0.00 sec)mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
| 6 | d | 1000 |
+----+-----------+-------+
6 rows in set (0.00 sec)
-- 张全蛋-成都
start transaction;insert into user values(7,'赵英俊',1000);mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
| 6 | d | 1000 |
| 7 | 赵英俊 | 1000 |
+----+-----------+-------+
7 rows in set (0.01 sec)-- 王尼玛-北京
start transaction;
mysql> select * from user;
+----+-----------+-------+
| id | name | money |
+----+-----------+-------+
| 1 | a | 900 |
| 2 | b | 1100 |
| 3 | 小明 | 1000 |
| 4 | 淘宝店 | 1000 |
| 5 | c | 100 |
| 6 | d | 1000 |
| 7 | 赵英俊 | 1000 |
+----+-----------+-------+
7 rows in set (0.01 sec)-- 张全蛋-成都
start transaction;insert into user values(7,'王小花',1000);-- sql语句被卡住了?
insert into user values(8,'王小花',1000);-- 当user 表被另外一个事务操作时,其他事务里面的写操作,是不可以进行的。
-- 进入排队状态(串行化),直到王尼玛那边事务结束之后,张全蛋这个的写入操作才会执行。
--在没有等待超时的情况下。-- 王尼玛-北京
mysql> commit;
Query OK, 0 rows affected (0.00 sec)-- 张全蛋-成都
mysql> insert into user values(8,'王小花',1000);
Query OK, 1 row affected (39.52 sec)-- 串行化的问题是,性能特差!!READ-UNCOMMITTED > READ-COMMITTED > REPEATABLE-READ > SERIALIZABLE
-- 隔离级别越高,性能越差mysql 默认隔离级别是 REPEATABLE-READ
一天学会MYSQL数据库_笔记相关推荐
- B站《一天学会 MySQL 数据库》学习笔记
B站<一天学会 MySQL 数据库>学习笔记 老司机带我飞 职场十字诀:思考.计划.行动.总结.反思 关注他 4 人赞同了该文章 登录和退出MySQL服务器 # 登录MySQL $ my ...
- 一个小时学会MySQL数据库
致谢:一个小时学会MySQL数据库 一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库 ...
- 【转载】一个小时学会MySQL数据库
一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库技术品牌.服务与架构 1.3.数据库 ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- 组态王6.55连接MySql数据库(笔记)
组态王6.55连接MySql数据库(笔记) 1. 安装Mysql数据库 此步骤注意设置用户名和密码 比如设置:root用户的密码为123 2. 安装Navicat图形界面 安装Navicat 8 fo ...
- 研一寒假MySQL数据库学习笔记(三)
研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...
- 组态王读mysql数据库_组态王6.55连接MySql数据库(笔记)
组态王6.55连接MySql数据库(笔记) 1. 安装Mysql数据库 此步骤注意设置用户名和密码 比如设置:root用户的密码为123 2. 安装Navicat图形界面 安装Navicat 8 fo ...
最新文章
- 一个关于native sql的程序
- 【NLP】NLP提效,除了选择合适的模型,就是数据增强了
- UVC协议USB视频捕获设备定义
- 正则表达式应用:实现一个简单的计算器
- python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些
- 【快速入门Linux】8_Linux命令—系统信息相关命令(时间、磁盘、进程)
- Android非常好用的组件或者框架
- python统计及格不及格人数_Python一次输入多个值(列出存储信息),python,一次性,数值,列表...
- winform自定义用户控件
- *min_element 神器第二弹 牛逼的找最大值 最小值
- MySQL数据库如何建立视图
- 莫烦python博客_莫烦Python 4
- 计算机网络学习 - 网卡
- 代理服务器与反向代理服务器
- 使用阿里云OSS对象存储搭建个人图床
- xp系统计算机无线开关在哪,xp怎么设置无线网络?xp系统设置无线网络的方法
- java统计英文单词_java单词统计
- Minecraft基岩版电脑端游戏按键整合
- 计算机专业的在职考研,2019年深造北京航空航天大学在职研究生计算机专业在职考研科目是什么...
- java获取时间并进行计算
热门文章
- android仿qq折叠,android列表收缩与展开仿QQ好友列表(非常详细,附源码)
- DIAGNOSTICS
- 单位网站老是被劫持跳转到菠菜网站怎么办
- 对接塔吉特Target DVS EDI流程
- 做题记(4)P1080 国王游戏
- 基于QEMU-aarch64学习UEFI(EDK2)-1环境搭建
- ELASTICSEARCH 搜索的评分机制
- python维度互换_python – 有效地改变scipy.spare.csr_matrix的维度[复制]
- Sweet Butter 香甜的黄油
- 微前端之 qiankun 入门、上手、实战(构建大型 web 应用)