一、数据库
数据库:存储、维护和管理数据的集合
数据库管理系统:指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
二、SQL
SQL:structure query language,结构化查询语句。主要有以下分类:
1、DDL
DDL:Data Definition Language,数据库定义语言,用来定义数据库、表、列
使用关键字:create , alter, drop
1.1、操作数据库
创建:create database testdb character set utf8;
删除:drop database testdb;
修改:alter database testdb character set gbk;
查询:show databases;
查看当前选中的数据库:show database();
选择数据:use testdb;
1.2、操作表
创建:create table tb_user(
id int,
name varchar(50)
);
数据类型:
int 整型
double 浮点型,double(4,2),最多4位,2位小数
char 固定长度字符串
varchar 可变长度字符串
text:字符串类型
blob:字节类型,二进制文件
date:日志类型,yyyy-MM-dd
time:时间类型 hh:mm:ss
timestamp: 时间戳类型
datetime:完整日期时间 yyyy-MM-dd hh:mm:ss
删除:drop table tb_user;
修改:
alter table tb_user add phone varchar(20);#添加字段
alter table tb_user modify name varchar(100);#修改字段长度
alter table tb_user drop phone;
查看表的字段信息:DESC tb_user;
2、DML
DML:Data Manipulation Language, 数据库操作语言,用来操作数据库表中的记录。
2.1 插入 insert
#插入字符串和日期,需要使用引号。
insert into tb_user(id, name) values(1, '张三');
2.2 修改 update
update tb_user set name = '王武';
2.3 删除 delete
#删除指定条件数据
delete from tb_user where name = '王武';
#删除所有数据, 表结构还在。
delete from tb_user;
#truncate 删除 是显出表,再创建一个同样表结构的新表
truncate table tb_user;
3、DQL
DQL:Data Query Language, 数据库查询语言。
语法:
SELECT selection_list /*要查询的列名称*/
FROM table_list /*要查询的表名称*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果分组*/
LIMIT offset_start, row_count /*结果限定*/
查询条件:
- =、!=、<、<=、>、>=
- BETWEEN…AND;
- IN(set);
- IS NULL;
- AND;
- OR;
- NOT;
模糊查询:
通配符
- _ 任意字母
- % 任意0~n 个字母
字段控制查询:
1、去重 select distinct name from tb_user;
2、IFNULL : 任何数据和NULL相加还是NULL,IFNULL(count,0),如果count字段为NULL,自动转化为0;
排序
#ASC 升序 , DESC 降序
select * from tb_user order by age asc;
函数
count():指定列不为NULL的行数
max() :最大值
min() :最小值
sum():和
avg():平均值
分组
select age ,count(*) from tb_user group by age;
HAVING语句
having 对分组过后的数据进行过滤,并且可以使用聚合函数
select age ,count(*) from tb_user group by age having sum(money) > 1000;
三、数据完整性
为了让用户输入的数据是正确的。
1、实体完整性
- 1、主键约束: primary key 数据唯一且不为空
- 2、唯一约束: unique ,数据不重复
- 3、自动增长列:auto_increment
2、域完整
- 非空约束 (not null)
- 默认值约束 (default)
create table tb_user(
id int primary key auto_increment,
name varchar(50) not null,
phone varchar(20) unique,
sex varchar(10) default 'male'
);
3、引用完整性
外键约束
create table tb_card(
id int,
number int,
uid int, #外键,关联到tb_user的主键
constraint fk_card_user foreign key(uid) reference tb_user(id)
);
四、多表查询
分类:
合并结果集:UNION(去重), UNION ALL
连接查询:
内连接:INNER JOIN ON
外连接:OUTER JOIN ON
左外连接:LEFT OUTER JOIN ON
右外连接:RIGHT OUTER JOIN ON
子查询:嵌套查询,一个查询语句中包含另一个完整的select语句
子查询出现的位置:
where后:作为条件
from后:作为表
子查询结果集的形式:
单行单列(用于条件)
单行多列(用于条件)
多行单列(用于条件)
多行多列(用于表)
CREATE TABLE tb_class( cid int PRIMARY KEY auto_increment, name varchar(20) );
INSERT INTO tb_class(name) VALUES('一班');
INSERT INTO tb_class(name) VALUES('二班'); INSERT INTO tb_class(name) VALUES('三班'); INSERT INTO tb_class(name) VALUES('四班'); INSERT INTO tb_class(name) VALUES('五班'); INSERT INTO tb_class(name) VALUES('六班');
CREATE TABLE tb_student( sid int PRIMARY KEY auto_increment, sname varchar(50), age int, gender varchar(20), score float(5,2), cid int); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lisi', 16, 'female', 86.5, 2); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('wangwu', 15, 'female', 75.5, 3); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lijing', 14, 'male', 65.5, 4); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('zhangrong', 13, 'male', 65.5, 5); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('zuoyi', 15, 'female', 95.5, 6); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('shiyi', 14, 'male', 35.5, 2); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('liuhai', 14, 'female', 45.5, 2); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('guomimg', 14, 'female', 45.5, 3); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('dasan', 13, 'male', 25.5, 4); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('lvyi', 13, 'male', 65.5, 5); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('qianwen', 15, 'female', 55.5, 6); INSERT INTO tb_student(sname, age, gender, score, cid) VALUES('haoli', 16, 'male', 45.5, 1);
1、合并结果集
将两个select语句的查询结果合并到一起,被合并的两个结果列数和列类型必须相同。
SELECT s.sid, s.sname FROM tb_student s UNION SELECT c.cid, c.name FROM tb_class c;
2、内连接
SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s, tb_class c WHERE s.cid = c.cid;
SQL标准内连接:
SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s INNER JOIN tb_class c ON s.cid = c.cid;
查询结果必须满足查询条件。
3、外连接
3.1 、左连接
以左表为主,查询右表,满足条件的显示出来,不满足的显示为NULL
SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s LEFT JOIN tb_class c ON s.cid = c.cid;
3.2、右连接
以右表为主,查询左表,满足条件的显示出来,不满足的显示为NULL
SELECT s.sid, s.sname, c.cid, c.name FROM tb_student s RIGHT JOIN tb_class c ON s.cid = c.cid;
4、子查询
子查询结果集的形式
4.1、 单行单列
例如:分数比‘lijing’高的同学
lijing的分数
SELECT score FROM tb_student WHERE sname = 'lijing';
单行单列
SELECT * FROM tb_student WHERE score > (SELECT score FROM tb_student WHERE sname = 'lijing');
4.2、多行单列
分数高于二班所有人的学生
二班的id
SELECT cid FROM tb_class WHERE name = '二班';
二班学生的分数
SELECT score FROM tb_student WHERE cid = (SELECT cid FROM tb_class WHERE name = '二班');
多行单列
高于二班所有人的学生
SELECT * FROM tb_student WHERE score > ALL(SELECT score FROM tb_student WHERE cid = (SELECT cid FROM tb_class WHERE name = '二班'));
4.3、单行多列
分数和班次与lijing相同的学生
lijing的分数和班次
SELECT score, cid FROM tb_student WHERE sname = 'lijing';
单行多列
分数和班次与lijing相同
SELECT * FROM tb_student WHERE (score, cid) IN(SELECT score, cid FROM tb_student WHERE sname = 'lijing');
4.4、多行多列
查询lijing的年龄,性别,分数,部门
SELECT s.age, s.gender, s.score, c.name FROM tb_student s, tb_class c WHERE sname = 'lijing' AND s.cid = c.cid;
上面这样查也能查询出来,但是 tb_class 是一张完整的表,里面字段是用不到的,所以我们可以使用子查询,找到我们所需要的字段,部门名称和部门ID
SELECT s.age, s.gender, s.score, c.name FROM tb_student s, (SELECT cid, name FROM tb_class) c WHERE sname = 'lijing' AND s.cid = c.cid;