一什么是数据库
数据库:(DB,DataBase)
概念:是数据仓库软件 在操作系统之上的应用 sql可以存储大量数据
作用:存储数据,管理数据
1.1、数据库的三大范式
1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。
二为什么要学习数据库
1:岗位需求
2:被迫需求存数据
3:数据库是所有软件体系中最核心的存在
三数据库的分类
3.1关系型数据库(SQL)
- Mysql ,sql server Oracle
- 通过表与表之间,列与列之间,行与行之间的关系进行数据存储的
3.2SQL的分类
1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT
3.3非关系型数据库(NoSQL)
- Redis ,MongDB
- 通过自身属性来存储的
四DBMS(数据库管理系统)
- 数据库管理软件可以有效的对数据库进行管理 也可以维护和获取数据
- Mysql(关系型数据库管理系统)
五Mysql
mysql是一个关系型数据库管理系统
5.1mysql的安装
进入MySQL官方网站(https://www.mysql.com/downloads/),按下图顺序点击进入下载页面。
5.2配置环境变量
打开我们的安装目录, 来到 MySQL Server 8.0\bin 目录下,
- 1. 此电脑右键属性
- 2. 打开高级系统设置(我是win11, win10 应该在左边或右边)
- 3.环境变量
- 4.找到系统变量的PATH, 双击进入编辑
- 5.新建, 把你刚刚复制的那个路径粘贴即可
5.3连接数库
-
键盘 win + s 搜索cmd 或者powershell, 右键用管理员启动
- 输入 mysql -uroot -p
5.4mysql的基本操作命令
- mysql -urppt -p --连接数据库
- flush privileges; --刷新权限
- 所有语句都用;结尾---------------
- show databases --查看所有数据库
- mysql> use 数据库名称 --切换数据库
- show tables; --查看这个数据库下的所有表
- describe student; --查看数据库所有表信息
- create database 数据库名称; --创建一个数据库
- exit; --退出连接
六mysql中的数据类型
使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。
1.整数类型
根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是tinyint、smalunt、mediumint、int和 bigint。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围而最常用的为int类型的,
数据类型 | 字节 | 无符号取值范围 | 有符号 |
tinyint | 1 | 0~255 =2的8次方 | 0为中间值 -128~127 |
smalunt | 2 | 0~65535 =2的16次方 | 同理 |
mediumint | 3 | 0~16777215=2的24次方 | 同理 |
int | 4 | 0~4294967295=2的32次方 | 同理 |
bigint | 8 | 0~18446744073709551615=2的34次方 | 同理 |
2.浮点数类型和定点数类型
在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(float)和双精度浮点数类型(double)。而定点数类型只有一种即decimal类型。下图列举了 MySQL中浮点数和定点数类型所对应的字节大小及其取值范围:
数据类型 | 字节 | 有符号取值范围 |
float | 4 | -3.402823466E+38~-1.175494351E-38 |
double | 8 | -1.7976931348623157E+308~2.2250738585072014E-308 |
decimal | M+2 | -1.7976931348623157E+308~2.2250738585072014E-308 |
从上图中可以看出:DECIMAL类型的取值范围与DOUBLE类型相同。但是,请注意:DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为decimal(6,2)的数据6.5243 插入数据库后显示的结果为6.52
3.字符串类型
在MySQL中常用char和 varchar表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。
当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1
插入值 | char(3) | 存储需求 | varchar(3) | 存储需求 |
---|---|---|---|---|
‘’ | ‘’ | 3个字节 | ‘’ | 1个字节 |
‘a’ | ‘a’ | 3个字节 | ‘a’ | 2个字节 |
‘ab’ | ‘ab’ | 3个字节 | ‘ab’ | 3个字节 |
‘abc’ | ‘ab’ | 3个字节 | ‘abc’ | 4个字节 |
‘abcd’ | ‘ab’ | 3个字节 | ‘abc’ | 4字节 |
4.文本类型
文本类型用于表示大文本数据,例如,文章内容、评论、详情等,它的类型分为如下4种:
数据类型 | 字节 | 储存范围 |
---|---|---|
tinytext | 1 | 0~255字节 |
text | 2 | 0~65535字节 |
mediumtext | 3 | 0~16777215字节 |
longtext | 4 | 0~4294967295字节 |
5.日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :year、date、time、datetime和 timestamp。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:数据类型 | 字节 | 取值范围 | 日期格式 | 零值 |
year | 1 | 1901~2155 | YYYY | 0000 |
date | 4 | 1000-01-01~9999-12-31 | YYYY-MM-DD | 0000-00-00 |
time | 3 | -838:59:59~ 838:59:59 | HH-MM-SS | 00:00:00 |
datetime | 8 | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
timestamp | 4 | 1970-01-01 00:00:01~2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 0000-00-00 00:00:00 |
6.二进制类型
在MySQL中常用BLOB存储二进制类型的数据,例如:图片、PDF文档等。BLOB类型分为如下四种:
数据类型 | 字节 | 存储范围 |
tinyblob | 1 | 0~255字节 |
blob | 2 | 0~65535字节 |
mediumblob | 3 | 0~16777215字节 |
longblob | 4 | 0~4294967295字节 |
七操作语句
操作数据库>操作数据库的表>操作表中的数据
注意mysql中的关键字不分大小写
7.1 操作数据库
7.1.1 创建 create database 数据库名称;
6.1.2 删除 drop database 数据库名称;
7.1.3 修改 --有修改语句但是不能用会丢数据 可重建一个数据库把原来的数据导入这个库
7.1.4 使用 use 数据库名称; --进入这个数据库
7.1.5 查看 show database;--查看所有数据库 后面加数据库名称就是查看指定数据库
7.2 操作数据库中的表
7.2.1 创建表 create table 表名( 字段1 字段类型, 字段2 字段类型, … 字段n 字段类型 );
7.2.2 创建字段 alter table 表名 add 字段名varchar(50);
7.2.3 删除表 drop table 表名;
7.2.4 删除字段 alter table 表名 drop 字段明;
7.2.5 修改表 alter table 表名 rename to 改表名;
7.2.6 修改字段类型 alter table 表名 modify 字段名 字段类型;
7.2.7 查看表数据 desc 表名; --查看表的字段信息
7.2.8 查看所有的表 show tables; --查看数据库中所有的表 后面加表名查看指定表
7.2.9 查看表结构 show create table 表名; --查看这表的表结构
7.3 操作表中的数据
7.3.1 插入数据 INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);
7.3.1 插入多条数据
insert into 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;
7.3.2 删除指定数据 delect from 表名 where 条件;
7.3.3 删除全部数据 delect from 表名;
7.3.4 更新数据 update 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 条件表达式];
7.3.5 更新全部数据 update 表名 set 字段名=值;
注意. truncate和delect的区别
TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句
八数据表的约束
1.主键约束
主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:
字段名 数据类型 primary key;
设置主键约束(primary key)的第一种方式:在创建表的时候在字段后面定义主键
1 create table student( 2 id int primary key, 3 name varchar(20) 4 );
设置主键约束(primary key)的第二种方式:在创建完字段的时候在加主键 一般用这个
1 create table student01( 2 id int 3 name varchar(20), 4 primary key(id) 5 );
2.非空约束
非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:
1 字段名 数据类型 NOT NULL;
例子
1 create table user( 2 id int not null, 3 name varchar(10) 4 );
3.默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插入默认值;其基本的语法格式如下所示:
字段名 数据类型 DEFAULT 默认值;
例子
1 create table user ( 2 id int not null default 0, 3 name varchar(20) 4 );
5.唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
字段名 数据类型 UNIQUE;
例子
1 create table user ( 2 id int uniqe, 3 name varchar(10) 4 );
6.外键约束
外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:
-- 在创建数据表时语法如下: CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段) -- 将创建数据表创号后语法如下: ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
例子
1 --创建学生表 2 create table student( 3 id int primary key, 4 name varchar(20) 5 ); 6 --创建班级表 7 create table class( 8 classid primary key, 9 classname carchar(10) 10 ); 11 --学生表作为主表,班级表作为副表设置外键 12 alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);
6.1 数据一致性概念
大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。
6.2 删除外键
语法如下:
alter table 从表名 drop foreign key 外键名;
例
alter table class drop foreign key fk_class_studentid;
6.3 关于外键约束需要注意的细节
1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题
九、MySQL数据表简单查询
创建一个表然后插入数据
-- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb; -- 创建student表 CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT 'male' ); -- 向student表插入数据 INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
1.简单查询
简单查询即不含where的select语句。在此,我们讲解简单查询中最常用的两种查询:查询所有字段和查询指定字段。
1.1查询所有字段
--格式 silect * from 表名; --例子 silect * from student;
1.2查询指定字段
select 指定字段名 feom 表名; select sid, sname from student;
1.3.常数的查询
--在SELECT中除了书写列名,还可以书写常数。可以用于标记 select sid,sname,'2021-03-02' from student;
结果:这个日期没在数据库只是在显示见面的标记
1.4.从查询结果中过滤重复数据
在使用distinct 时需要注意:
在SELECT查询语句中distinct 关键字只能用在第一个所查列名之前。
select distinct gender from student;
结果
1.5.算术运算符(举例加运算符)
在SELECT查询语句中还可以使用加减乘除运算符。
--查询同学们十年后的年龄 select sname,age+10 from student;
十,函数
在此,先准备测试数据,代码如下:
-- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb; -- 创建student表 CREATE TABLE student ( sid CHAR(6), sname VARCHAR(50), age INT, gender VARCHAR(50) DEFAULT 'male' ); -- 向student表插入数据 INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
1.聚合函数
在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。
聚合函数使用规则:
只有select子句和having子句、order by子句中能够使用聚合函数。例如,在WHERE子句中使用聚合函数是错误的。
接下来,我们学习常用聚合函数。
1.1、count()
统计表中数据的行数或者统计指定列其值不为NULL的数据个数
查询有多少该表中有多少人
select count(*) from student;
1.2、max()
计算指定列的最大值,如果指定列是字符串类型则使用字符串排序运算
查询该学生表中年纪最大的学生
select max(age) from student;
1.3、min()
计算指定列的最小值,如果指定列是字符串类型则使用字符串排序运算
查询该学生表中年纪最小的学生
select sname,min(age) from student;
1.4、sum()
计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0
查询该学生表中年纪的总和
select sum(age) from student;
1.5、avg()
计算指定列的平均值,如果指定列类型不是数值类型则计算结果为
查询该学生表中年纪的平均数
select avg(age) from student;
2.其他常用函数
2.1、时间函数
SELECT NOW(); SELECT DAY (NOW()); SELECT DATE (NOW()); SELECT TIME (NOW()); SELECT YEAR (NOW()); SELECT MONTH (NOW()); SELECT CURRENT_DATE(); SELECT CURRENT_TIME(); SELECT CURRENT_TIMESTAMP(); SELECT ADDTIME('14:23:12','01:02:01'); SELECT DATE_ADD(NOW(),INTERVAL 1 DAY); SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH); SELECT DATE_SUB(NOW(),INTERVAL 1 DAY); SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH); SELECT DATEDIFF('2019-07-22','2019-05-05');
2.2、字符串函数
--连接函数 SELECT CONCAT () -- SELECT INSTR (); --统计长度 SELECT LENGTH();
2.3、数学函数
-- 绝对值 SELECT ABS(-136); -- 向下取整 SELECT FLOOR(3.14); -- 向上取整 SELECT CEILING(3.14);
十一,条件查询
1.使用关系运算符查询
在WHERE中可使用关系运算符进行条件查询,常用的关系运算符如下所示:
关系运算符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
--格式 select * from 表名 where 查询条件; --例子查询年龄等于10的同学 select * from student where age=10; --查询年龄大于17的 select * from student where age>=17;
2.使用IN关键字查询
IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。
--查询sid为S_1002和S_1003的学生信息 select * from student where sid in ('S_1002','S_1003'); --查询sid为S_1001以外的学生的信息 select * from student where sid not in ('S_1001');
3.使用BETWEEN AND关键字查询
between and用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来
--查询15到18岁的学生信息 select * from student where age between 15 and 18;
--查询不是15到18岁的学生信息 select * from student where age not between 15 and 18;
4.使用空值查询
在MySQL中,使用is null关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串
由于student表没有空值就不演示查询空值的了
--查询sname不为空值的学生信息 select * from student where sname is not null; --查询sname为空值的学生信息 select * from student where sname is null;
5.使用AND关键字查询
在MySQL中可使用AND关键字可以连接两个或者多个查询条件。
--查询年纪大于15且性别为male的学生信息 select * from student where age>15 and gender='male';
6.使用OR关键字查询
在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来
--查询年纪大于15或者性别为male的学生信息 select * from student where age>15 or gender='male';
十二.模糊查询
MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配
1 普通字符串
--查询sname中与wang匹配的学生信息 MySQL命令: select * from student where sname like 'wgang'
2 含有%通配的字符串
%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串
--查询学生姓名以li开始的记录 select * from student where sname like 'li%'
--查询学生姓名以g结尾的记录 select * from student where sname like '%g';
--查询学生姓名包含s的记录 select * from student where sname like '%s%';
3 含有_通配的字符串
下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。
--查询学生姓名以zx开头且长度为4的记录 select * from student where sname like 'zx__'; --查询学生姓名以g结尾且长度为4的记录 select * from student where sname like '___g';
十三,特殊查询
1.使用limit限制查询结果的数量
当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条
--查询学生表中年纪最小的3位同学 select * from student order by age asc limit 3; --order by 排序语法 --ASC:表示按升序排序。 --DESC:表示按降序排序。
2.使用grupd by进行分组查询
GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。
接下来,我们通过一个例子开始学习GROUP BY,代码如下
-- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb; -- 创建员工表 CREATE TABLE employee ( id int, name varchar(50), salary int, departmentnumber int ); -- 向员工表中插入数据 INSERT INTO employee values(1,'tome',2000,1001); INSERT INTO employee values(2,'lucy',9000,1002); INSERT INTO employee values(3,'joke',5000,1003); INSERT INTO employee values(4,'wang',3000,1004); INSERT INTO employee values(5,'chen',3000,1001); INSERT INTO employee values(6,'yukt',7000,1002); INSERT INTO employee values(7,'rett',6000,1003); INSERT INTO employee values(8,'mujk',4000,1004); INSERT INTO employee values(9,'poik',3000,1001);
2.1 GROUP BY和聚合函数一起使用
--统计各部门员工个数 select count(*), departmentnumber from employee group by departmentnumber;
结果:
--统计部门编号大于1001的各部门员工个数 select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;
结果
2.2 GROUP BY和聚合函数以及HAVING一起使用
--统计工资总和大于8000的部门 select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;
3.使用ORDER BY对查询结果排序
从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此,我们可以使用ORDER BY对查询结果进行排序
其语法格式如下所示:
--格式 SELECT 字段名1,字段名2,… FROM 表名 ORDER BY 字段名1 [ASC 丨 DESC],字段名2 [ASC | DESC]; --
在该语法中:字段名1、字段名2是查询结果排序的依据;参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。
--查询所有学生并按照年纪大小升序排列 select * from student order by age asc;
order by 默认是升序
--查询所有学生并按照年纪大小降序排列 select * from student order by age desc;
十四,别名
在査询数据时可为表和字段取別名,该别名代替表和字段的原名参与查询操作。
操作的表事先已准备
1.为表取别名
在查询操作时,假若表名很长使用起来就不太方便,此时可为表取一个別名,用该别名来代替表的名称。语法格式如下所示:
SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;
2.为字段取别名
在查询操作时,假若字段名很长使用起来就不太方便,此时可该字段取一个別名,用该别名来代替字段的名称。语法格式如下所示:
SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;
十五、表的关联关系
在实际开发中数据表之间存在着各种关联关系。在此,介绍MySQL中数据表的三种关联关系。
多对一
多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系 中,应将外键建在多的一方否则会造成数据的冗余。
多对多
多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。
一对一
在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。
接下来,我们来学习在一对多的关联关系中如果添加和删除数据。先准备一些测试数据,代码如下:
DROP TABLE IF EXISTS student; DROP TABLE IF EXISTS class; -- 创建班级表 CREATE TABLE class( cid int(4) NOT NULL PRIMARY KEY, cname varchar(30) ); -- 创建学生表 CREATE TABLE student( sid int(8) NOT NULL PRIMARY KEY, sname varchar(30), classid int(8) NOT NULL ); -- 为学生表添加外键约束 ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid); -- 向班级表插入数据 INSERT INTO class(cid,cname)VALUES(1,'Java'); INSERT INTO class(cid,cname)VALUES(2,'Python'); -- 向学生表插入数据 INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1); INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1); INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2); INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);
1.关联查询
--查询Java班的所有学生 select * from student where classid=(select cid from class where cname='Java');
2.关于关联关系的删除数据
请从班级表中删除Java班级。在此,请注意:班级表和学生表之间存在关联关系;要删除Java班级,应该先删除学生表中与该班相关联的学生。否则,假若先删除Java班那么学生表中的cid就失去了关联
--删除Java班 delete from student where classid=(select cid from class where cname='Java'); delete from class where cname='Java';
十五、多表连接查询
1.交叉连接查询
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:
--格式1 SELECT * FROM 表1 CROSS JOIN 表2;
在该语法中:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
由于这个交叉连接查询在实际运用中没有任何意义,所以只做为了解即可
2.内连接查询
内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的 记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。其语法格式如下
--格式一隐形内连接 select * from 表1,表2 where 条件; --格式二先行内连接 select * from 表1 inner join 表2 where 条件;
准备数据:
-- 若存在数据库mydb则删除 DROP DATABASE IF EXISTS mydb; -- 创建数据库mydb CREATE DATABASE mydb; -- 选择数据库mydb USE mydb; -- 创建部门表 CREATE TABLE department( did int (4) NOT NULL PRIMARY KEY, dname varchar(20) ); -- 创建员工表 CREATE TABLE employee ( eid int (4) NOT NULL PRIMARY KEY, ename varchar (20), eage int (2), departmentid int (4) NOT NULL ); -- 向部门表插入数据 INSERT INTO department VALUES(1001,'财务部'); INSERT INTO department VALUES(1002,'技术部'); INSERT INTO department VALUES(1003,'行政部'); INSERT INTO department VALUES(1004,'生活部'); -- 向员工表插入数据 INSERT INTO employee VALUES(1,'张三',19,1003); INSERT INTO employee VALUES(2,'李四',18,1002); INSERT INTO employee VALUES(3,'王五',20,1001); INSERT INTO employee VALUES(4,'赵六',20,1004);
--查询员工姓名及其所属部门名称 select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;
3.外连接查询
在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。外连接又分为左(外)连接和右(外)连接。其语法格式如下:
SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件
由此可见,外连接的语法格式和内连接非常相似,只不过使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN关键字。其中,关键字左边的表被称为左表,关键字右边的表被称为右表;OUTER可以省略。
在使用左(外)连接和右(外)连接查询时,查询结果是不一致的,具体如下:
1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。
准备数据
-- 若存在数据库mydb则删除 DROP DATABASE IF EXISTS mydb; -- 创建数据库mydb CREATE DATABASE mydb; -- 选择数据库mydb USE mydb; -- 创建班级表 CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20) ); -- 创建学生表 CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL ); -- 向班级表插入数据 INSERT INTO class VALUES(1001,'Java'); INSERT INTO class VALUES(1002,'C++'); INSERT INTO class VALUES(1003,'Python'); INSERT INTO class VALUES(1004,'PHP'); -- 向学生表插入数据 INSERT INTO student VALUES(1,'张三',20,1001); INSERT INTO student VALUES(2,'李四',21,1002); INSERT INTO student VALUES(3,'王五',24,1002); INSERT INTO student VALUES(4,'赵六',23,1003); INSERT INTO student VALUES(5,'Jack',22,1009);
准备这组数据有一定的特点,为的是让大家直观的看出左连接与右连接的不同之处
1、班级编号为1004的PHP班级没有学生
2、学号为5的学生Jack班级编号为1009,该班级编号并不在班级表中
3.1 左(外)连接查询
左(外)连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在则在右表中显示为空。
--查询每个班的班级ID、班级名称及该班的所有学生的名字 select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;
3.2 右(外)连接查询
右(外)连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
--查询每个班的班级ID、班级名称及该班的所有学生的名字 select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;
十六、子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。
准备数据:
DROP TABLE IF EXISTS student; DROP TABLE IF EXISTS class; -- 创建班级表 CREATE TABLE class( cid int (4) NOT NULL PRIMARY KEY, cname varchar(20) ); -- 创建学生表 CREATE TABLE student ( sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL ); -- 向班级表插入数据 INSERT INTO class VALUES(1001,'Java'); INSERT INTO class VALUES(1002,'C++'); INSERT INTO class VALUES(1003,'Python'); INSERT INTO class VALUES(1004,'PHP'); INSERT INTO class VALUES(1005,'Android'); -- 向学生表插入数据 INSERT INTO student VALUES(1,'张三',20,1001); INSERT INTO student VALUES(2,'李四',21,1002); INSERT INTO student VALUES(3,'王五',24,1003); INSERT INTO student VALUES(4,'赵六',23,1004); INSERT INTO student VALUES(5,'小明',21,1001); INSERT INTO student VALUES(6,'小红',26,1001); INSERT INTO student VALUES(7,'小亮',27,1002);
1.带比较运算符的子查询
比较运算符前面我们提到过得,就是>、<、=、>=、<=、!=等
--查询张三同学所在班级的信息 select * from class where cid=(select classid from student where sname='张三');
2.带EXISTS关键字的子查询
EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会
当子查询可以查到东西 外面的查询才会查询
--假如王五同学在学生表中则从班级表查询所有班级信息 select * from class where exists (select * from student where sname='王五');
3.带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。
--查询比任一学生所属班级号还大的班级编号 select * from class where cid > any (select classid from student);
4.带ALL关键字的子查询
ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。
--查询比所有学生所属班级号还大的班级编号 select * from class where cid > all (select classid from student);
总结
重要(从关键字分析):
查询语句的书写顺序和执行顺序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查询语句的执行顺序
from ===> where ===> group by ===> having ===> select ===> order by ===> limi
十七进阶
标签:INSERT,--,INTO,查询,VALUES,student,Mysql From: https://www.cnblogs.com/zhao-ke-ming/p/18357912