数据库MySQL学习笔记

1.概念了解
MySQL(本地mysql 用户名为root 无密码)
MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database

RDBMS的相关术语
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

2.常用操作
1)对数据库操作
创建数据库
CREATE DATABASE 数据库名;
选择数据库
use 数据名;

2)对表操作
创建表
CREATE TABLE 表名 (列名 column_type);
修改表名
alter table test rename test1
显示查看表
show table_name
删除表
DROP TABLE table_name;

3)列增删改操作
新增列
alter table 表名 add column 列名 after/first(执行列位置)
修改列名
alter table 表名 change column address address1 varchar(30)
删除列
alter table table_name drop column column_name

4)数据增删改操作
插入数据
INSERT INTO table_name
VALUES (value1,value2,value3,…);

mysql> use RUNOOB;
Database changed
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> (“学习 PHP”, “菜鸟教程”, NOW());

删除数据
DELETE FROM table_name WHERE some_column=some_value;
修改更新数据
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]

5)查询操作
查询数据
SELECT column_name,column_name
FROM table_name
[WHERE Clause] 查询条件
[LIMIT N][ OFFSET M] 限定数量
分组group by 后面接条件使用having
排序order by 默认升序 asc desc降序

连表查询
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称; (无重复)
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称; (有重复)
order by 排序,默认升序,ASC升序,DESC降序

表连接JOIN
JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,遍历左表每条记录对应右表保留对应内容
RIGHT JOIN(右连接): 与 LEFT JOIN 相反
连接的对应条件用on衔接

模糊查询
like %%表示任意部分

子查询
先通过查询语句得到虚表,然后再从虚表中查询要查的内容

not in 整条数据不存在与表中,整条数据对应
not exsist 某列不存在于表中

3.练习
例:找出表中每科成绩都大于80分的同学
创建表
DROP table if EXISTS tb_lemon_score;
CREATE table tb_lemon_score(
sname varchar(20),
course varchar(20),
score tinyint
);

插入数据
insert tb_lemon_score VALUES
(‘张三’,‘语文’,81),
(‘张三’,‘数学’,75),
(‘李四’,‘语文’,76),
(‘李四’,‘数学’,90),
(‘王五’,‘语文’,81),
(‘王五’,‘数学’,100),
(‘王五’,‘英语’,90);

– 1.1以姓名分组得出最低的分数大于80
select sname from tb_lemon_score
GROUP BY sname HAVING min(score)>80;

– 1.2.求出每个同学的最低分,从中查找最低分大于80分的同学(涉及虚表)
select * from (select sname,min(score) as minscore from tb_lemon_score GROUP BY sname) as t
where t.minscore>80;

– 2.1求表中分数小于80分的同学的反集(not in)
select * from tb_lemon_score where sname not in
(select sname from tb_lemon_score where score <= 80);

– 2.1求表中分数小于80分的同学的反集(not exists)
select distinct sname from tb_lemon_score as t1 where not EXISTS
(select * from tb_lemon_score as t2 where t2.score <=80 and t1.sname=t2.sname);

– not in 后面语句数据集只能有一个字段
– not exists 遍历not exists前面的语句的每条记录再判断后面的语句有无结果集,有就去除。

– 3.1大于80分的成绩记录数与该同学所有的成绩记录数相等(虚表联查)
select t1.sname from (
select sname,count(1) as totalnum from tb_lemon_score GROUP BY sname) as t1,
(select sname,count(1) as above80num from tb_lemon_score where score>80 GROUP BY sname) as t2
where t1.totalnum = t2.above80num;

– 3.2大于80分的成绩记录数与该同学所有的成绩记录数相等(if语句实现)
select sname from tb_lemon_score group by sname having count(1)=sum(if(score>80 ,1,0));

– 4.使用连接过滤小于80分的同学
select * from tb_lemon_score as t1
left join (select * from tb_lemon_score where score <= 80) as t2
on t1.sname=t2.sname where t2.sname is null;
– 左连接:列出左表的所有内容,用左表的数据去右表对照匹配,右表有记录就列出该记录,没有就记录为空;

– 求出最高分(子查询)
select * from tb_lemon_score where score=(select max(score) from tb_lemon_score) ;

– 求出每个同学的最高分信息
select * from tb_lemon_score as t1 where t1.sname=‘张三’
and t1.score=(select max(score) from tb_lemon_score where sname=‘张三’);

select * from tb_lemon_score as t1 where
t1.score=(select max(score) from tb_lemon_score where sname=t1.sname);

你可能感兴趣的:(软件测试)