初识-MySQL基础知识点

目录

  • 第一章 MySQL基础知识
    • SQL语言特点
    • SQL语言组成
    • 启动
    • 登陆
      • 设置密码
    • 字符集
      • 字符集的设置
    • 字符序
    • 存储引擎
      • 概念
      • InnoDB
      • MyISAM
      • MEMORY
  • 第二章 数据库系统概论
    • 数据库基本概念
    • 数据库的发展
    • MySQL数据库
  • 第三章 数据库的创建和管理
    • 创建 CREATE DATABASE
    • 显示 SHOW DATABASES
    • 选择 USE
    • 修改 ALTER DATABASES
    • 删除 DROP DATABASES
  • 第四章 MySQL数据库表
    • MySQL数据类型
      • 整数类型
      • 小数类型
      • 字符串类型
      • 日期和时间类型
      • 二进制类型
    • 数据完整性约束
      • 约束分类
    • 数据库表的创建
      • 创建表的语法格式
      • 创建数据库表
      • 创建数据库表-带外码约束
      • 创建数据库表-复合主码
    • 数据库表结构的修改
      • 表名的修改
      • 字段的修改
        • 增加字段 ADD
        • 删除字段 DROP
        • 修改字段名及字段类型CHANGE 、MODIFY
      • 查看约束名
      • 约束的修改
        • 删除约束 DROP
        • 添加约束 ADD
      • 选项的修改
    • 数据库表的其他操作
      • 查看当前数据库中的所有表
      • 查看指定表的表结构
      • 查看指定表的详细信息
      • 复制表
      • 删除表
  • 第五章 数据更新
    • 插入数据INSERT
      • 插入单条数据记录
      • 插入多条数据记录
      • 插入查询结果
      • 采用REPACE语句插入数据记录
    • 修改数据UPDATE
    • 删除数据SELETE、TRUNCATE
  • 第六章 数据查询
    • SELECT 语句查询
    • 简单查询
      • 时间函数
      • 设置别名 AS
      • 获取不重复的行 DISTINCT
      • 限制显示记录数 LIMIT
      • 查询条件 WHERE
        • 比较条件查询
        • 范围查询
        • 集合查询
        • 模糊查询
          • 通配符
        • 空值查询
        • 多重条件查询
        • 排序
    • 聚合函数
    • 分组查询
      • CASE子句
        • 简单 CASE
        • 搜索 CASE
    • 连接查询
      • 内连接查询
        • 语法
      • 外连接查询
        • 语法
      • 交叉连接
        • 语法
    • 联合查询
      • 语法
    • 子查询
      • 根据 是否依赖 分类
      • 语法
      • 根据 运算符 分类
      • FROM 子句中的子查询
  • 视图
    • 视图的概述
      • 视图的作用
    • 视图的创建与查询
    • 视图的修改和删除
    • 视图的更新
    • 检查视图
    • 视图的查看

第一章 MySQL基础知识

SQL语言特点

 1. 类似于自然语言,主要有7个动词,`CREATE`、`ALTER`、`DROP`、`INSERT`、`UPDATE`、`DELETE`、`SELECT`。
 2. 非过程语言
 3. 面向集合语言
 4. 既是自含式语言,又是嵌入式语言
 5. 集数据定义、数据操纵、数据管理的功能于一体。

SQL语言组成

 1. 数据定义语言(DDL),包括`CREATE`、`DROP`、`ALTER`语句
 2. 数据操作语言(DML),包括`INSERT`、`UPDATE`、`DELETE`语句
 3. 数据查询语言(DQL),`SELECT`语句
 4. 数据控制语言(DCL),包括`GRANT`、`REVOKE`、`COMMIT`、`ROLLBACK`等语句

启动

  • 初始化MySQLmysqld -initialize
  • 安装MySQLmysqld -install
  • 移除MySQLmysqld - remove
  • 启动MySQL net start mysql
  • 关闭MySQL net stop mysql

登陆

mysql -h 主机名 -p 端口号 -u 用户名 -p密码
/*
用法说明:
mysql是登陆mysql的命令;
-h表示需要登陆的mysql服务器端的IP地址,如果客户机和服务器是同一主机时,主机可以用127.0.0.1或者localhost表示,这时-h参数可以省略;
-p表示登陆端口号,mysql默认端口号为3306,如果采用默认端口,则-p参数可以省略;
-u表示登陆mysql服务器的用户名,mysql默认超级用户为root;
-p表示密码,-p和密码之间没有空格,由于-p参数后跟密码的登陆方式会泄露密码,所以采用mysql -u root -p进行登陆;
*/

设置密码

set password for root@localhost=password('abc');
/*
第一次登陆时通过mysql命令:	mysql -u root  
运行set password for命令设置密码
*/

字符集

MySQL由瑞典MySQL AB公司开发,默认情况下MySQL使用的是latin1字符集。
目前MySQL支持41种字符集。
MySQL命令:show character set;
功能:查看当前MySQL服务实例支持的字符集、字符集对应的字符集以及字符集占用的最大字节长度等信息。

latin1支持西欧字符、希腊字符等
gbk支持中文简体字符
big5支持中文繁体字符
utf8几乎支持世界所有国家的字符

MySQL命令:show variables like 'character%';
功能:查看当前MySQL 会话使用的字符集,共8种。

character_set_client     //mysql客户机的字符集
character_set_connection //数据通信链路的字符集
character_set_database   //数据库字符集
character_set_filesystem //mysql服务器文件系统的字符集
character_set_results    //结果集的字符集
character_set_server     //mysql服务实例字符集
character_set_system     //元数据(字段名、表名、数据库名等)的字符集
character_set_dir        //指明mysql字符集文件的保存路径
/*
注:character_set_filesystem和character_set_system字符集是固定的。
默认情况下,character_set_database和character_set_server字符集都为latin1。
为了能支持简体中文,应当将character_set_database和character_set_server字符集设置为utf8或者gbk,为了避免空间的浪费,尽量将两种字符集设置为gbk。
*/

字符集的设置

方法一:通过MySQL命令,临时设置MySQL当前会话的字符集为gbk。

set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_database = gbk;
set character_set_results = gbk;
set character_set_server = gbk;

方法二:使用MySQL命令设置多处字符集。
MySQL命令:set name 字符集;
注:临时的一次性将character_set_client、character_set_connection和character_set_results字符集在客户端进行设置。
如:set name gbk;
方法三:运行脚本文件,临时地设置MySQL当前会话的字符集。

source 脚本文件所在文件夹的完整路径/脚本文件名/.sql;
/*
路径中的分隔符用/,不用\,原因在于\有时会被当成转义字符。
*/

字符序

字符序是指在同一字符集内字符之间的比较规则。一个字符集包含多种字符序,每个字符序唯一对应一种字符集。
MySQL命令:show collation;
功能:查看当前MySQL服务实例支持的字符序。
MySQL命令:show variables like 'collation%';
功能:查看当前MySQL会话使用的字符序。

MySQL字符序的命令规则是以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci、cs或bin结尾。其中,ci表示大小写不敏感,cs表示大小写敏感,bin表示按二进制编码值比较。默认情况下,MySQL会话使用的字符序以ci结尾,因此,在MySQL客户端输入命令时,命令中关键字不分大小写。
当修改字符集时,字符集会自动转化为与字符集对应的字符序,因此,通常情况下不需要对字符序进行修改。

存储引擎

概念

存储引擎就是如何存储数据、如何为存储的数据建立索引以及如何更新、查询数据等技术的实现方法。
存储引擎有:InnoDBMyISAMMEMORY等。
MySQL5.5开始的默认的存储引擎是InnoDB。

InnoDB

特点
支持事务、支持外键、支持行级锁定、支持全文检索(MySQL5.6后);
存在表空间概念,分为共享表空间和独享空间。表空间类型由系统变量innodb_file_per_table 决定。
MySQL命令set @@global.innodb_file_per_table=on 设置独享表空间,独享表空间会产生两个文件,扩展名分别是ibd和frm。.ibd文件存放该表对应的数据和索引,因此也称为独享表空间数据文件。.frm是表结构文件。
MySQL命令set @@global.innodb_file_per_table=off 设置共享表空间,共享表空间会产生一个文件,扩展名是frm。对应的数据信息、索引信息、各种元数据信息以及事务的回滚(UNDO)信息全部存放在共享表空间文件(ibdatal)中。
选择:主要应用于联机事务处理(OLTP),即大量的增、删、改操作,或者事务安全方面的考虑。

MyISAM

特点
不支持事务、不支持外键、不支持行级锁定
最大的优点是高速存储和检索,以及全文搜索能力。可以压缩数据库表,节省存储空间,但是内存的使用效率低
MyISAM存储引擎创建表时会产生三个文件,分别是.frm表结构文件、.myd数据文件和.myi索引文件。
选择:主要应用于联机分析处理(OLAP),执行大量的查询操作和插入新记录

MEMORY

特点:提供“内存中”表,即采用MEMORY存储引擎的表将表中所有数据都存放在内存中数据的处理速度快但是安全性不高,并且对内存的要求高
选择:需要很快的读写速度,并对数据的安全性要求低

  • 操作

MySQL命令:show engines;
功能:查看MySQL所支持的存储引擎。
MySQL命令:show variables like '%storage_engine%';
注:命令中LIKE表示模糊查询,%为通配符,表示任意多个字符。
MySQL命令:set default_storage_engine=存储引擎名;
功能:可以将MySQL当前会话的默认存储引擎进行修改。

第二章 数据库系统概论

数据库基本概念

  • 数据
    Data是用于描述事物的记录符号,是数据库中存储的基本对象。是数据库的核心。

  • 信息
    信息通常指被加工过的数据,是行为、决策的基础。数据库软件不仅仅保存数据,而且具有加工数据产生信息的能力。

  • 数据库
    数据库(DataBase简称DB)是长期储存在计算机内、有组织的、可共享的相关数据的集合。数据库不仅包括数据本身,而且还包括数据间的联系,而且能被不同用户和程序访问。数据库的作用:高效的存储和管理数据,为编程语言提供数据支撑。

  • 数据库管理系统
    DataBase Management System(DBMS)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库。如:MySQL, Oracle, Microsoft SQL Server, Microsoft Access等。对数据的增加、删除、修改和检索由系统软件数据库管理系统(DBMS)统一进行数据库管理系统是数据库系统的核心,是管理数据库的软件

  • 数据库管理人员
    DataBase Administrator(DBA)是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称。DBA的主要职责是运维和管理数据库管理系统,侧重于运维管理。

  • 数据库系统
    DataBase System(DBS),包括数据库、硬件、软件和人员的集合。DBS = DB + DBMS + DBAP + DBA + User。

  • 关系

包含
包含
包含
数据库系统
数据库管理系统
数据库
数据

数据库的发展

  • 人工管理阶段
    特点:数据不保存、没有专门管理数据的软件、数据不能共享,冗余很大、数据不具有独立性。
  • 文件管理阶段
    特点:数据可以长期保持在外存,可以反复使用、由文件管理系统管理数据,文件多样化,便于存储和查找数据、数据具有一定的共享性,可以反复使用,但一个文件基本上对应于一个应用程序,数据共享性差,冗余度大、数据与程序有了一定的独立性,但独立性差。
  • 数据库管理阶段
    特点:数据的结构化、数据共享性高、冗余度低、数据独立性高、数据由DBMS统一管理和控制,有统一的数据管理和控制功能。
  1. 层次模型
  2. 网状模型
  3. 关系模型

MySQL数据库

  • 系统数据库
    具体包括:information_schema、mysql、performance_schema和sys。
  • 用户数据库
    用户可以创建多个用户数据库。
    数据库是存放数据库对象的容器。
    数据库的对象是指存储、管理和使用数据的不同结构形式,主要有表、视图、函数、存储过程和触发器等。

第三章 数据库的创建和管理

创建 CREATE DATABASE

MySQL命令:CREATE DATABASE

create database if not exists Student default character set gbk;
/*
if not exists 进行判断,该数据库名不存在才创建,可忽略。
default character set gbk 设置该数据库使用gbk字符集,不指定则默认。
创建数据库后,data文件夹中会自动创建一个以数据库名字命令的文件夹,文件夹中会自动创建一个db.opt文件,用于存储当前数据库的默认字符集和字符集。
*/ 

显示 SHOW DATABASES

MySQLM命令:show databases;
可以查看当前MySQL服务实例上的所有数据库。
MySQL命令:show create database 可以查看指定数据库的相关信息。

show create database Student;
//查看Student数据库的相关信息。

选择 USE

MySQL命令:use 对数据库对象操作前,先指定哪个数据库为当前数据库。

use Student;
//将Student指定为当前数据库

修改 ALTER DATABASES

MySQL命令:alter database

alter database Student default character set utf8;
//修改Student数据库的字符集为utf8

删除 DROP DATABASES

MySQL命令:drop database

drop database if exists Student;
//删除Student数据库,if exists可忽略。

第四章 MySQL数据库表

MySQL数据类型

整数类型

名称 存储需求
tinyint 1字节
smallint 2字节
mediumint 3字节
int 4字节
bigint 8字节

可以使用无符号关键字unsigned 进行修饰,只表示零和正整数。

小数类型

类型名称 存储需求 说明
float 4字节 单精度浮点小数
double 8字节 双精度浮点小数
decimal M+2字节 定点小数

浮点类型和定点类型都可以用(M,D)来表示,M称为精度,表示总共的位数;D称为标度,表示小数的位数。decimal的默认D值为0,M值为10。

字符串类型

名称 说明
char 定长字符串类型
varchar 变长字符串类型
text 文本类型
tinytext 文本类型
mediumtext 文本类型
longtext 文本类型
enum 枚举类型
set 集合类型

字符串类型的数据需要用单引号或双引号括起来。

char(n)定长字符串类型是会用空格补齐到固定字符串长度,范围是0~255个字符。
varchar(n)变长字符串类型用n表示字符串允许的最大长度,实际占用的空间为实际长度加1个字节。文本类型属于变长字符串类型。

字符串对象enum 值为表创建时列规定中的枚举值。语法格式如下:

<字段名> enum('值1',...,'值n')
//enum类型的字段在取值时,在指定的枚举列表中获取,而且一次只能取一个,类似于单选按钮的功能。

字符串对象set 值为表创建时列规定中的值。与enum 不同的是,可以取多个值。语法如下:

<字段名> set('值1',...,'值n')

interest set('打篮球','下围棋','听英语')
//插入数据时,可以只取打篮球其中一个,或者取打篮球和下围棋多个。

日期和时间类型

MySQL日期和时间类型的数据需要用单引号或者双引号括起来。

类型名称 日期格式 日期范围 存储需求
year YYYY 1901~2155 1个字节
time HH:MM:SS -838:59:59~838:59:59 3个字节
date YYYY-MM-DD 1000-01-01~9999-12-31 3个字节
datetime YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59 8个字节
timestamp YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC 4个字节

二进制类型

类型名称 存储需求 说明
bit(n) 约(n+7)/8字节 位字段类型
binary(n) n字节 固定长度二进制字符串
varbinary(n) L+1字节,(L<2¹⁶) 可变长度二进制字符串
tinyblob(n) L+1字节,(L<2⁸) 非常小的blob,存放较短的二进制数
blob(n) L+2字节,(L<2¹⁶) 小blob,存放图片、声音等文件
mediumblob(n) L+3字节,(L<2²⁴) 中等大小的blob,存放图片、声音、视频等文件
longblob(n) L+4字节,(L<2³²) 非常大的blob,存放图片、声音、视频等文件

数据完整性约束

  • 概述
    数据完整性约束是指为了防止不符合约束的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容
  • 分类
    关系数据库有四类完整性约束:实体完整性参照完整性域完整性用户自定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称为是关系的两个不变性,应该由关系数据库管理系统自动支持。

约束分类

约束又分为列级约束和表级约束。两者约束效果相同,形式不同。列级约束是指直接跟在字段定义后面,表级约束是指所有字段定义结束后,用逗号与字段定义分开,作为独立项定义的约束。

列级约束:字段名 数据类型 约束类型
  字段名 数据类型 [其他的列级约束] unique

表级约束:(constraint 约束名) 约束类型 (字段1,字段2,...,字段n)
  [constraint 约束名] unique (字段名1,...)

注:关键字constraint 指定约束名,不使用关键字constraint 时系统自动分配约束名。主键约束primary key 定义为表级约束时不需要指定约束名,即不需要关键字constraint ,因为在MySQL中主码约束的名字统一为primary。

既可以为列级约束又可以为表级约束的约束有: 主键约束primary key 、唯一性约束unique
只可以为列级约束的约束有: 允许为空null 、不允许为空not null 、自增auto_increment 、设置默认值default
只可以为表级约束的约束有: 外码foreign key

注意:null 可以不写,默认情况就是允许为空。auto_increment 必须定义为键(主键或者唯一键或者外键都可)且自增字段必须是数值类型,每张表只能有一个自增字段。default 'QQ' 即将数据QQ设置为默认值,因为是字符串所以加单引号。

数据库表的创建

创建表的语法格式

数据库表又叫关系,由行和列构成,创建表是创建表中的列,即定义表结构。
SQL语句create table 创建数据库表。具体如下:

create table (if not exists) 表名(
字段名1 数据类型 (列级约束条件),
...
字段名n 数据类型 (列级约束条件),
(表级约束条件),
...
(表级约束条件)
)其他选项(存储引擎、字符集等选项)

/*
建表语法分为三部分:指定表名、定义字段、指定选项。
其中字段名和数据类型必不可少。
多个字段间用逗号隔开。
*/

创建数据库表

步骤一:创建数据库create databese
步骤二:选择数据库use
步骤三:使用create table 创建数据库表

create database registration default character set gbk;
use registration;
create table Course(
Cld char(3) primary key not null,
CName char(20) not null,
CCredit int,
CLimit int default 60
)engine=innodb default charset=gbk comment='课程表';

//comment 作用是取别名
//default charset 设置默认字符集

创建数据库表-带外码约束

步骤一:创建数据库create databese
步骤二:选择数据库use
步骤三:取消外键约束检查set foreign_key_checks=0;
步骤四:使用create table 创建数据库表
步骤五:设置外键约束检查set foreign_key_checks=1;

create table Department(
Dld cahr(3),
DName varchar(10) not null unique,
DHeader char(4),
primary key(Dld),
constraint fk_dheader foreign key(DHeader) references teacher(Tld)
)engine=innodb default charset=gbk;
/*e
这里使用constraint关键字给该约束指定约束名fk_dheader。
*/e

创建数据库表-复合主码

在MySQL中,除外码约束必须定义为表级约束以外,如果主码约束条件涉及到该表的多个属性列,也必须定义到表级上
如:primary key(Sld,Dld);

数据库表结构的修改

SQL语句:alter table 可以对表结构进行修改,其中包括:表名的修改字段的修改约束的修改选项的修改

alter table 表名 修改选项
//修改选项是指表名、字段、约束或者选项的修改。

表名的修改

alter table 旧表名 rename to 新表名;
//也可以使用 rename table 旧表名 to 新表名。

字段的修改

在MySQL中,字段的修改包括:增加字段删除字段修改字段名及字段类型修改字段的排列位置

增加字段 ADD
alter table 表名
add [column] 字段名 数据类型 [列级约束][first|after 字段名]
/*
add 是指向表中添加字段。
字段的添加和字段的定义语法相同,包括:字段名、数据类型和约束,约束可选。
column可选。
first表示将新字段添加在第一列。after表示将新字段添加在指定字段后。
*/
删除字段 DROP
alter table 表名
drop [column] 字段名
修改字段名及字段类型CHANGE 、MODIFY

change可以同时修改字段名及字段类型。
modify仅修改字段的数据类型。

alter table 表名
change [column] 原字段名 新字段名 新数据类型

alter table 表名
modify [column] 字段名 新数据类型

查看约束名

方法一:MySQL命令`show create table 表名;`
方法二:SQL语句
select constraint_name,constraint_type
from information_schema.table_constraints
where table_schema='数据库名' and table_name='表名';

约束的修改

约束的修改包括:删除约束添加约束

删除约束 DROP

根据需要可以删除表中的主码约束外码约束唯一性约束以及默认值约束使用MySQL语句alter table 进行删除。

主码约束alter table 表名 drop primary key;

外码约束alter table 表名 drop foreign key 外键约束名; 外码约束删除后将解除两表之间的父子关系。

唯一约束alter table 表名 drop index 唯一约束名;

默认值约束alter table 表名 change [column] 原字段名 原字段名 原数据类型 default null; 删除默认值约束也可以使用modify 子句。

非空约束alter table 表名 change [column] 原字段名 原字段名 原数据类型 null; 删除非空约束也可以使用modify 子句。

添加约束 ADD
使用SQL语句`alter table` 为字段添加主码约束、外码约束、唯一性约束以及默认值约束。

添加主键约束alter table 表名 add primary key (列名); 可以同时添加多个主键约束。

添加外码约束alter table 表名 add [constraint 约束名] foreign key (字段名) references 父表 (主码字段名);

添加唯一性约束alter table 表名 add [constraint 约束名] unique(列名)

默认值约束alter table 表名 change [column] 原字段名 原字段名 原数据类型 default 默认值; 添加默认值也可以用modify 子句。

非空约束alter table 表名 change [column] 原字段名 原字段名 原数据类型 not null; 添加默认值也可以用modify 子句。

选项的修改

选项的修改是指对**存储引擎**、**默认字符集**、**索引关键字是否压缩**以及**自增字段的初始值**等进行设置。

修改存储引擎alter table 表名 engine=新的存储类型;
修改默认字符集alter table 表名 default charset=新的字符集;
修改索引关键字压缩方式alter table 表名 pack_keys=新的压缩类型;
设置自增字段初始值alter table 表名 auto_increment=新的初始值;

数据库表的其他操作

查看当前数据库中的所有表

MySQL命令show tables; 查看当前数据库表的所有表。
注:应该先使用use 数据库名; 选定数据库。

查看指定表的表结构

MySQL命令describe 表名; 查看指定表的表结构。
注:describe 可以简写为desc

查看指定表的详细信息

MySQL命令show create table 表名; 查看指定表的详细信息。

复制表

方法一:create table 新表名 like 源表名; 只能复制表结构,不复制记录。
方法二:create table 新表名 select * from 源表名 [where 条件表达式]; 复制表结构和记录。

删除表

MySQL命令drop table [IF EXISTS] 表名;
注:删除表时,对于存在外键约束关系的innodb表而言,若想删除父表,需要先在子表中删除与父表的外键约束

第五章 数据更新

完整的数据库包括:表结构表数据。数据操作包括:插入数据、修改数据和删除数据,这些操作也叫数据更新
在MySQL中,使用SQL语言中的DML语言实现数据更新,主要是insert数据插入update数据修改delete数据删除

插入数据INSERT

创建数据库是创建列,即定义表结构,而插入数据是指向数据库表中插入行,即添加新纪录。

插入单条数据记录

insert into 表名[(字段名1,字段名2,...)]
values (值1,值2,...);
/*
如果插入完整的数据记录则可以省略字段名,
字段名与值的顺序需要一一对应。
注意数据要满足表的约束。
*/

注意
有外键约束的时候需要先向父表插入数据再向子表插入数据。先使用set foreign_key_checks=0;取消外键约束,成功插入数据后,再使用set foreign_key_checks=1;将外键约束还原。
插入字符串类型日期时间类型的数据时,字段值需要用单引号

插入多条数据记录

insert into 表名[(字段名1,字段名2,...)] values 
(值表1),
...
(值表n);
/*
(值表1)表示插入的第一条记录,(值表n)表示插入的第n条记录
每个值表必须用括号,并用逗号分隔。
*/

插入查询结果

使用insert语句将一个表的查询结果插入到另一个表中,从而实现表记录的复制功能。

insert into 目标表名[(字段1,...,字段名n)]
select (字段名1,...,字段名n)
from 源表名
[where 条件表达式]
/*
select子句返回的是一个结果集。
insert语句表示将这个结果集插入到目标表中。
目标表的字段名列表与select后的字段名列表必须相同,且对应的数据类型应该保持一致。
如果插入的是完整记录,则可以省略目标表的字段名列表,select后的字段名列表用*表示。
*/

采用REPACE语句插入数据记录

replace语句与insert语句同样可以插入数据
功能方面,replace语句与insert语句基本相同,不同之处在于:使用replace语句向表插入新纪录时,如果新纪录的主键值或者唯一性约束的字段值与已有记录相同,则先删除已有记录(已有记录删除时也不能违背外键约束条件),然后再插入新纪录。
好处:使用replace语句时是将deleteinsert合二为一,形成一个原子操作,这样就无需将deleteinsert置于事物之中了。
格式1 replace into 表名[(字段名1,...,字段名n)] values(值1,...,值n);
格式2

replace into 目标表名[(字段名1,...,字段名n)]
select (字段名1,...,字段名n)
from 源表名
[where 条件表达式];

格式3

replace into 表名
set 字段名1=值1,...,字段名n=值n;

修改数据UPDATE

修改数据是指对数据库表中已存在的数据进行修改。步骤为:第一,对哪张进行数据修改update;第二,对哪些字段进行修改set;第三,对哪些记录进行修改where

update 表名
set 字段名1=值1,...,字段名n=值n
where 条件表达式;
/*
set子句是将字段1的值修改成值1。该列值可以是表达式也可以是对应的默认值。默认值则用关键字default表示列值。
where子句用于指定修改满足条件的特定行记录。修改所有记录时,则不使用where。
*/

删除数据SELETE、TRUNCATE

功能方面,truncatedelete from 表名作用相同。物理方面,truncate语句不支持事物的回滚,也就是说数据清空后不能恢复,而delete from 表名语句删除的数据可以恢复。并且,truncate语句不能激活触发器程序的运行,而delete from 表名语句可以激活触发器的运行。

删除父表中的表记录时,如果子表中的外码引用了要删除记录的主码时,删除不会成功。需要先解除两表的父子关系。

delete from 表名
where 条件表达式;

//若要删除所有记录,则不写where
truncate [table] 表名;
/*
truncate 是清空表中的所有数据
table 可以省略
*/

第六章 数据查询

SELECT 语句查询

在MySQL中,使用SQL语言中的DQL语言进行数据查询,具体采用select语句实现数据查询,select语句是所有数据库操作中使用频率最高的SQL语句。该语句可以从一个或多个表查询数据

select [all|distinct] 字段列表//返回列,返回所有列时用*
from 表名1或视图名1[,...表名n或视图名n]//指定查询对象
[where 条件表达式]//指定返回行必须满足的查询条件,不能有聚合函数
[group by 字段名 [having 条件表达式]]//group by是对查询结果按照指定列的值分组,列值相等的为一个组。通常会在每组中作用集函数。having与group by组合使用,筛选出满足指定条件的组
[order by 字段名 [ASC|DESC]]//ASC升序,DESC降序。默认为升序
[limit [初始记录位移偏移量,]记录数]//限制显示查询出的记录行数

简单查询

时间函数

时间函数详细

设置别名 AS

select 字段名1 [as] 别名1,...,字段名n [as] 别名n
from 表名;
//as 可以省略

获取不重复的行 DISTINCT

关键字distinct筛选结果集,能去掉重复的行,重复行只显示一行。重复行指结果集数据行的每个字段值都一样。
关键字all表示不去掉重复行,默认为all。

限制显示记录数 LIMIT

limit子句可以限制查询结果返回的记录数。

limit [起始记录位置偏移量,] 记录数
/*
limit子句后的两个参数都必须是整数常量。
起始记录位移偏移量,指定查询结果集从哪一条记录开始,第一条记录是0。
记录数,指定返回的记录条数。
*/

查询条件 WHERE

where子句用来指定返回的记录必须满足的查询条件,位于from子句的后面。
条件查询可以是比较条件查询范围查询集合查询模糊查询空值查询多重条件查询

查询条件 运算符
比较条件 =、<、>、>=、<=、<>、NOT+…
确定范围 BETWEEN AND 、NOT+…
确定集合 IN、NOT+…
模糊查询 LIKE、NOT+…
空值查询 IS NULL、IS NOT NULL
多重条件 AND (&&)、OR(||)、XOR
比较条件查询

比较条件是指带比较运算符的条件。

范围查询
where 字段名 [not] betweeen 值1 and 值2
//满足值1到值2的记录将会被返回。
集合查询
where 字段名 [not] in(值1,...,值n)
/*
in 关键字后是一个值表(集合),当字段取值与值表中的任意一个值匹配时,则满足查询条件。
*/
模糊查询

like关键字用于查询数值不能确定的时候。

where 字段名 [not] like '匹配字符串'
/*
模糊查询采用字符串匹配的模式
使用运算符like设置过滤条件
过滤条件使用通配符进行匹配运算(字段取值与匹配字符串进行匹配),而不是按判断是否相等进行比较
*/
通配符

匹配字符串中的任意位置使用通配符,并且可以使用多个通配符。

通配符 说明
% 有零个或更多个字符组成的任意字符串
_ 任意单个字符
[ ] 用于指定范围,例如[A ~ F],表示A ~ F范围内的任何单个字符
[ ^ ] 表示指定范围之外的,例如[ ^A ~ F ],表示A ~ F 范围以外的任何单个字符

在通配符前加\转义字符,可以转换成普通字符。

空值查询

null是一个不确定的值,不能太用=,>,<进行比较。

where 字段名 is [not] null
多重条件查询

如果条件之间同时满足,则用and连接;如果条件之间只需要满足其中一个,则用or连接。

where 条件1 and|or 条件2 ...and|or 条件n
//and 的优先级高于 or
排序

select语句中,用order by子句将结果集中的数据按照一定的顺序进行排序。

order by 字段名|表达式|位置 [ASC|DESC]
/*
ASC 表示升序
DESC 表示降序
空值将会作为最小值来对待
*/

聚合函数

函数 功能
count( [ distinct|all ] * ) 返回行数
count( [ distinct|all ] 列名) 返回指定列中非nulll值的个数
sum( [ distinct|all ] 列名) 返回指定列中非null值之和
avg( [ distinct|all ] 列名) 返回指定列中非null值的平均值
max( [ distinct|all ] 列名) 返回指定列中非null值的最大值
min( [ distinct|all ] 列名) 返回指定列中非null值的最小值

除count(*)函数外,其他聚合函数忽略null值。
聚合函数通常用在select之后,不能出现在where条件的所有记录。
在没有分组的情况下,聚合函数作用于整张表满足where条件的所有记录,在查询结果中一个聚合函数只返回单一的值。

分组查询

分组查询通过select语句中的group by 子句来实现,在分组查询,配合group by子句使用的还有having子句。

select [all|distinct] 字段1,...[,group_concat(字段名)]
from 表名1或视图1,...,表名n或视图名n
[where 条件表达式]
group by 字段名|位置 [ASC|DESC]
[having 条件表达式]

注意:
分组将细化聚合函数,即对查询结果分组后,聚合函数将分别作用于每个组,每组返回一个值。
除聚合函数之外,select语句中的每一个字段都必须是group by子句中的分组字段。
若用于分组的列中包含有null值,则null将作为一个单独的分组返回。
having子句用来过滤分组,where子句用来过滤数据行。且having子句中可以使用聚合函数,where子句不能。
group by 子句与group _concat()函数联合使用的功能是按照一个字段分组,将另一个字段的值使用逗号连接起来(null除外)。

CASE子句

查询中需要将结果以另一种形式显示出来可以使用case子句指定数据的转换。
case子句不是完整的SQL语句,不能被单独执行,而是作为表达式使用。
case子句分为简单CASE搜索CASE

简单 CASE

简单CASE函数只能做数据匹配,不进行比较运算逻辑运算

case 列名
when 值1 then 转换值1
when 值2 then 转换值2
else 转换值n
end
搜索 CASE

搜索CASE函数可以完成更为复杂的数据转换。

case 
when 布尔表达式1 then 转换值1
when 布尔表达式2 then 转换值2
else 转换值n
end

连接查询

连接查询是关系数据库中最主要的查询,通过连接可以实现多表查询
连接是关系数据库模型的主要特点,也是区别其他类型数据库管理系统的一个标志
由于数据库中有多张表,表与表之间通过外码约束相互关联。因此,检索数据时通过连接操作就可以查询出存放在多个表中的数据。

连接查询分为内连接(INNER JOIN)外连接(OUTER JOIN)交叉连接(CROSS JOIN)三类。内连接分为等值连接非等值连接自然连接自连接。外连接分为左外连接(LEFT OUTER JOIN)右外连接(RIGHT OUTER JOIN)全外连接(FULL OUTER JOIN,MySQL不支持)

内连接查询

最常用的连接查询。
内连接查询是指通过在查询中设置连接条件的方式,如果两个表的相关字段满足连接条件,就从两个表中提取数据并组合成新的记录。
内连接查询的结果集中仅包含满足连接条件的元组。
内连接分为等值连接非等值连接自然连接自连接四种。

名字 说明
等值连接 在连接条件中使用等于运算符比较连接字段上的取值,其查询结果包括其中的重复列
非等值连接 在连接条件使用除等于运算符以外的其他运算符比较连接字段上的取值。这些运算符包括>、<、>=、<=和<>
自然连接 是一种特殊的等值连接,在查询结果中去掉重复的列
自连接 自己和自己进行连接,即一个表与其自身进行连接
语法

在MySQL中,内连接通过select语句中的inner join ... on子句来实现,也可通过将连接条件写在where子句中实现。

//格式1
select [all|distinct] 字段列表
from 表名1 [inner] join 表名2 on 连接条件
//格式2
select [all|distinct] 字段列表
from 表名1,表名2
where 连接条件
/*
连接字段为同名属性时,必须加表名前缀。
*/

当使用自然连接natural join ... on时,查询结果会自动去除重复列。

外连接查询

外连接查询的结果集不仅包含满足连接条件的行,还包括不满足连接条件的元组

名字 说明
左外连接left outer join 查询结果集除了包括满足连接条件的元组外,还包括左表不满足连接条件的元组
右外连接right outer join 查询结果集除了包括满足连接条件的元组外,还包括右表不满足连接条件的元组
全外连接full outer join 查询结果集中除了包括满足连接条件的元组外,还包括两个表不满足连接条件的元组。(MySQL并不支持全外连接)
语法

在MySQL中,外连接通过select语句中的outer join ... on子句来实现。

select [all|distinct] 字段列表
from 表名1 left|right|full [outer] join 表名2
on 连接条件
/*
表名1是左表,表名2是右表
表中没有的值将会填上null值
*/

交叉连接

交叉连接就是不带连接条件的查询,返回被连接的两个表所有数据行的笛卡尔积。即用左表中的每一行与右表的每一行分别进行连接。结果集中的行数就是左表的行数乘以右表的行数。
交叉连接没有实际意思,通常用于测试所有可能的情况

语法

在MySQL中,交叉连接通过select语句中的cross join子句来实现。

//格式1
select [all|distinct] 字段列表
from 表名1 [cross] join 表名2
//格式2
select [all|distinct] 字段列表
from 表名1,表名2

联合查询

查询时,将两个或多个查询结果集合并成一个查询结果集进行显示,这就是联合查询,联合查询采用union实现。
union联合查询对应集合中的并操作,集合中的交操作和差操作在SQL语言中也有相应的关键字与之对应。intersect对应集合中的交操作,except(SQL Server)或minus(Oracle)对应集合中的差操作。但是MySQL中交操作和差操作都不支持

语法

在MySQL中,union关键字用来将两个或更多个查询结果合并到一起组成一个查询结果。

select [all|distinct] 字段列表 from 表名 [where 条件表达式]
union [all]
select [all|distinct] 字段列表 from 表名 [where 条件表达式]
...
select [all|distinct] 字段列表 from 表名 [where 条件表达式]
/*
所有select子句中的列数和列的顺序必须相同、对应数据类型必须兼容。
关键字all表示合并的结果中包括所有行,不去除重复行。
*/

子查询

子查询就是在一个查询里嵌套了其他的若干查询,即在一个select语句的wherefrom子句中包含另一个select查询语句。
在子查询中,外层select查询语句称为外层查询(或父查询),内层select查询语句称为内层查询(或子查询)。

根据 是否依赖 分类

根据内层查询的条件是否依赖于外层查询,子查询分为不相关子查询相关子查询两类。

名字 说明
不相关子查询 内层查询的条件不依赖于外层查询。执行的时候由内向外逐层处理,即先执行内层查询只执行一次),然后将内层查询的结果用于建立其外层查询的查询条件进行逐层查询
相关子查询 内层查询的查询条件依赖于外层查询。执行的时候由外向内再向外进行处理,即首先取出外层查询中表的第一元组,根据它与内层查询相关的属性值处理内层查询,执行内层查询将查询结果代入外层查询进行查询,就能得到结果。内层查询将会被执行多次,执行的次数取决于父查询中的元组数

语法

select 字段列表 from 表名 //外层查询(父查询)
where 字段名 in (select 字段列表 from 表名) //内层查询(子查询)

根据 运算符 分类

子查询必须用小括号括起来,并且子查询与父查询嵌套时需要相应的运算符。运算符的选择取决于子查询的返回结果。
根据连接子查询采用的运算符,将子查询分为:比较运算符子查询、in子查询、any(some)子查询、all子查询和exists子查询。

运算符 语法格式 说明 适用情况
比较运算符 <表达式> {=|<|>|>=|<=|<>} (子查询) 主要用于对表达式的值和子查询返回的值进行比较运算 子查询返回单行(单行单列单行多列)时使用
in/not in <表达式> [not] in (子查询) 主要用于判断表达式的值是否存在于子查询的结果集中 子查询返回多值(多行单列包括单行)时使用
any(some) <表达式> {=|<|>|>=|<=|<>} {some|any} (子查询) 关键字someany是同义的,用于表示表达式只要与子查询结果集中的某个值满足比较关系,子查询就返回true,否则返回false 子查询返回多值(多行单列)时使用,使用时必须同时使用比较运算符
all <表达式> {=|<|>|>=|<=|<>} all (子查询) 用于表示表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回true,否则返回false 子查询返回多值(多行单列)时使用,使用时必须同时使用比较运算符
exists/not exists exist(子查询) 主要用于判断子查询的结果集是否为空,若子查询的结果集不为空,则返回true,否则返回falsenot exist与之相反 子查询返回逻辑值时使用

FROM 子句中的子查询

子查询通常包含在where子句中,有时包含在having子句。除此之外,子查询还可以嵌入到from子句中。
当子查询包含在from子句中时,子查询的返回结果通常为多行多列的数据记录,别当作一张临时表来处理。

select 字段列表
from (子查询)
//子查询前不需要任何运算符

视图

视图的概述

视图是一种数据库对象,是从一个或几个基本表(或视图)导出的表。
通常将视图称为虚拟表(Virtual Table),因为存储一个视图,只需要存储它的定义,而不存储视图所包含的数据,数据仍存放在原来的基本表中。
基本表发生数据变化,从视图中查询出的数据也随之改变。

对用户而言,对视图的操作方法是和对数据表的操作方法一样的。
对DBMS(数据库管理系统)而言,对视图的操作最终都会转化为对基本表的操作。
视图的建立和删除只影响视图本身,不影响对应的基本表。

视图的作用

  1. 简化查询
  2. 多种角度看待同一数据
  3. 保障安全
  4. 保障逻辑独立
  5. 避免数据冗余

视图的创建与查询

create view 视图名[视图字段列表]
as 
select 语句
[with [local |cascaded]check option]

with check option 是检查视图,没有的为普通视图。

视图的修改和删除

视图的更新

检查视图

视图的查看

你可能感兴趣的:(mysql,mysql)