MySql基础及约束

review #数据库 #MySQL

数据库

数据库基础知识

  1. 存储数据的仓库,数据是有组织的存储的
  2. 英文:database,简称DB

数据库管理系统是管理数据库的大型软件,英文为DataBase Managerment System 简称DBMS

关系表数据库

SQl是结构化查询语言,用来操作关系型数据库,定义了操作所有关系型数据库的统一标准。常见的关系型数据库有:Oracle、MySQL、SQL Server、SQLite(常用于嵌入式系统,轻量化数据库)、DB2、MariaDB

关系表数据库是建立在关系模型基础上的数据库,简单说关系数据库是由多张能相互连接的二维表组成的数据库

  • 优点:

    1. 使用表结构,格式一致便于维护
    2. 使用通用SQL语言操作,使用方便,便于复杂查询
    3. 数据存储在磁盘,安全
  1. ctrl+q            打开查询窗口
  2. ctrl+/            注释sql语句
  3. ctrl+shift +/     解除注释
  4. ctrl+r            运行查询窗口的sql语句
  5. ctrl+shift+r      只运行选中的sql语句
  6. F6                打开一个mysql命令行窗口
  7. ctrl+d           (1):查看表结构详情,包括索引 触发器,存储过程,外键,唯一键;(2):复制一行
  8. ctrl+l            删除一行
  9. ctrl+n            打开一个新的查询窗口
  10. ctrl+w            关闭一个查询窗口
  11. ctrl+tab          多窗口切换
  12. Navicat for MySQL 快捷键(cnblogs.com)

通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. MySQL数据库的 SQL 语句不区分大小写,关键字建议使用大写。
  3. 注释
    • 单行注释: 一 注释内容 或#注释内容(MySQL 特有)
    • 多行注释: /* */
  4. SQL分类
    • DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等
    • DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
    • DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
    • DCL(Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户

DDL数据定义语言

库操作

  • 查看数据库:
SHOW DATABASES;
  • 创建数据库db1:
CREATE DATABASE DB1;
  • 判断数据库是否存在并创建数据库:
CREATE DATABASE IF NOT EXISTS DB2;
  • 删除数据库:
DROP DATABASE IF EXISTS DB2;
  • 使用数据库:
USE DB1;
  • 查看当前用的数据库:
SELECT DATABASE();

表操作

  • 查看表:
SHOW TABLES;
#查看表详细信息
SHOW CREATE TABLE 表名;
  • 查看表结构:
DESC 表名;
  • 创建表:
CREATE TABLE FIRSTTABLE(
        ID INT(4),#字段1 字段类型(长度) [完整性约束],
        SNAME VARCHAR(20),                                          
        AGE INT(3)
        )#创建表  

数据类型:

数据类型 大小 描述 分类
TINYINT 1 byte 小整数值 数值类型
SMALLINT 2 bytes 大整数值
MEDIUMINT 3 bytes 大整数值
INT或INTEGER 4 bytes 大整数值
BIGINT 8 bytes 极大整数值
FLOAT 4 bytes 单精度浮点数值
DOUBLE 8 bytes 双精度浮点数值(score double(总长度,小数点后保留的位数) 如( 0~100, 2)
DECIMAL 小数值
DATE 3 日期值 日期和时间类型
TIME 3 时间值或持续时间
YEAR 1 年份值
DATETIME 8 混合日期和时间值
TIMESTAMP 4 混合日期和时间值,时间戳
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 极大文本数据
CREATE TABLE STUDENT(
	ID INT,
	NAME VARCHAR(10),
	GENDER CHAR(1),
	BIRTHDAY DATE,
	SCORE DOUBLE(5,2),
	EMEAL VARCHAR(64),
	TEL VARCHAR(15),
	STATUS TINYINT
);
删除表:
DROP TABLE 表名; # DROP TABLE if exists 表名;
修改表:
  • 改表名
ALTER TABLE 表名 RENAME 新表名;
  • 添加列:
ALTER TABLE 表名 ADD 列名 数据类型;
  • 修改表数据类型:
-- 方法1
ALTER TABLE 表名 MODIFY 列名 新数据类型;
-- 方法2
ALTER TABLE FIRSTTABLE ADD ctctInfo INT ( 20 ) AFTER AGES;
#添加字段联系方式到first首位,after尾;after 字段名添加到某字段后
  • 改表名和数据类型:
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
  • 删除列:
ALTER TABLE 表名 DROP 列名;

DML数据操作语言

  • 给指定列添加数据:插入全部列时可省略列表(不建议)
INSERT INTO 表名(列名1,列名2....) VALUES (值1,值2....);
INSERT INTO
表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…;
-- 批量插入数据
INSERT INTO0 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…

  • 查看表内数据:
UPDATE 表名  SET 字段1=值1[,字段2=值2…] [WHERE 条件]
# UPDATE student SET BIRTHDAY=19991206,SCORE=90 WHERE `NAME`='李四'; 

  • 删除表内数据:
DELETE FROM 表名 [WHEEE 条件];

注意如果update和delete没有加where条件会修改表中全部数据

DQL数据查询语言

查询分为:基础查询、条件查询(WHERE)、分组查询(GROUP BY)、排序查询(ORDER BY)、分页查询(LIMIT)

  • 查询语法格式
编写顺序 执行顺序
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定;
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
SELECT
字段列表
ORDER BY
排序字段列表
LIMIT
分页参数
编写顺序
	SELECT
字段列表
	FROM
表名列表(这个表可为Select查询得到的表,可为连接得到的表)
	WHERE
条件列表
	GROUP BY
分组字段
	HAVING
分组后条件
	ORDER BY
排序字段
	LIMIT
分页限定;

执行顺序
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
SELECT
字段列表
ORDER BY
排序字段列表
LIMIT
分页参数

基础查询

  • 查询格式
  • 注意:distinct 可去除重复数据,必须直接放在列名前。只能作用于当前查询所有列,不能部分使用
SELECT [ALL|DISTINCT] select_list
[INTO new table]
FROM table source
[WHERE search conditions]
[GROUP BY group_by_expressioni]
[HAVING search conditions]
[ ORDER BY order_expression [ASC |DESC]]
  • 查看表内数据:
SELECT column_name,column_name
FROM table_name;#查看部分列

SELECT * FROM table_name;#查看全部列

注意: 不建议使用select * 操作

  • AS别名: as也可省略换成空格
select `name`,math as '数学',english as '英语' FROM stu;#输出结果列名为 name 数学 英语

条件查询

  • 查看表内数据:
SELECT 字段列表 FROM 表名 WHERE 条件列表;
# SELECT * FROM Websites WHERE country='CN';

WHERE 子句用于提取那些满足指定条件的记录。

注意:null 是大于所有数值型还是小于所有数值型是由 DBMS 决定的

运算符 描述
= 等于
<> 不等于,注:\在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
&& || ! And or not 与或非(逻辑运算),and优先级大于or
Like Like常和通配符搭配模糊查询,搜索某种模式,如SELECT * FROM stu WHERE `NAME` LIKE '%德%';
< = > 安全等与,可判断null和普通数值
Between X And Y 在某个范围内(x到y之间)
IN 指定针对某个列的多个可能值

SQL 逻辑运算符:


这是在 SQL 所有的逻辑运算符的列表。SQL 运算符_w3cschool

运算符 描述
ALL ALL运算符用于将值与另一个值集中的所有值进行比较。
AND AND运算符允许在SQL语句的WHERE子句中指定多个条件。
ANY ANY运算符用于根据条件将值与列表中的任何适用值进行比较。
BETWEEN BETWEEN运算符用于搜索在给定最小值和最大值内的值。
EXISTS EXISTS运算符用于搜索指定表中是否存在满足特定条件的行。
IN IN运算符用于将值与已指定的文字值列表进行比较。例如:选择语句 where 列名 [NOT] IN(常量1, 常量2,…常量n)
LIKE LIKE运算符用于使用通配符运算符将值与类似值进行比较。
NOT NOT运算符反转使用它的逻辑运算符的含义。 例如:NOT EXISTS, NOT BETWEEN, NOT IN等等,这是一个否定运算符。
OR OR运算符用于组合SQL语句的WHERE子句中的多个条件。
IS NULL IS NULL运算符用于将值与NULL值进行比较。
UNIQUE UNIQUE运算符搜索指定表的每一行的唯一性(无重复项)。

通配符:

% 任意个字符
_ 单个字符
\ 转义符可转义通配符
escape '_$_%' escape '$' #转义$为转义符

排序查询

  • 语法: ASC升序, DESC降序,多排序条件前边值一样时才会根据第二条件排序
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2]...;

分组查询

  1. 分组查询语法
SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤];

注意: 分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

  • where和having 区别:

    • 执行时机不一样:where 是分前讲行限定where条件、 不满足having分组之后对结果进行过滤。
    • 可判断的条件不一样:where不能对聚合函数进行判断, having可以。
      执行顺序: where > 聚合函数 > having
  • 查看表内数据:

SELECT * FROM 表名;

聚合查询

聚集函数:

  1. Avg: 返回所给字段平均值

  2. Count:根据所给的关联字段返回被关联model的数量

  3. Max: 返回所给字段的最大值

  4. Min:返回所给字段的最小值

  5. Sum:计算所给字段值总和

SELECT AVG(math) FROM stu;

分页查询

  • 起始索引=(当前页码-1)X每页显示条数
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数;
  • 注意:分页查询Iimit 是MysQL数据库的方言
    Oracle分页查询使用rownumber
    SQL Server分页查询使用 top

DCL用户管理语言

查询用户

USE mysql;
SELECT * FROM user;

创建用户

image

约束

约束是作用在表中列上的规则,用于限制加入表中的数据,保证了数据库数据的正确性有效性完整性。

约束名 描述 关键字
非空约束 保证所有数据没有null值 NOT NULL
唯一约束 保证数据不重复 UNIQUE
主键约束 主键是一行数据的唯一标识要求非空且唯一 PRIMARY KEY
检查约束 保证表中数据满足某一条件 CHECK
默认约束 填充数据时未指定值则采用默认值 DEFAULT
外键约束 让两个表数据建立联系,保证数据一致性和完整性 FOREIGN KEY
自动增长约束 顾名思义 AUTO_INCREMENT

注意:MySQL不支持CHECK约束

主键约束

#字段级添加,不可多个
CTRATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        字段名2        字段类型(长度),
        字段名3        字段类型(长度),
        .....
        字段名n        字段类型(长度) PRIMARY KEY
        )
        
DESC 表名;#查看表结构
        
#表级添加,可添加多个或单个(可用来创建联合主键)
CTRATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        字段名2        字段类型(长度),
        字段名3        字段类型(长度),
        .....
        [CONTRAINT 约束名] PRIMARY KEY(字段名,字段名1,……)
        )
        
ALTER TABLE sqlconstraints ADD [CONSTRAINT 约束名] PRIMARY KEY(字段名);#添加主键约束
       
ALTER TABLE sqlconstraints ADD CONSTRAINT S_ID PRIMARY KEY(ID);#添加主键约束
ALTER TABLE sqlconstraints DROP PRIMARY KEY;#删除表内主键约束

唯一约束

#字段(列级)级添加,不可多个
CTRATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        字段名2        字段类型(长度),
        字段名3        字段类型(长度),
        .....
        字段名n        字段类型(长度) UNIQUE 
        )

#表级添加,可添加多个或单个
CTRATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        字段名2        字段类型(长度),
        字段名3        字段类型(长度),
        .....
        [CONTRAINT 约束名] UNIQUE(字段名,字段名1,……)
        )
        
ALTER TABLE sqlconstraints ADD [CONSTRAINT 约束名] PRIMARY KEY(字段名);#添加主键约束
       
ALTER TABLE sqlconstraints ADD CONSTRAINT  S_SNAME UNIQUE(SNAME);
DESC sqlconstraints;#展示表基本结构

#ALTER TABLE sqlconstraints DROP INDEX 唯一约束名;
#删除唯一约束
/*
        单子段没有指定唯一约束名时,默认名唯一约束名为字段名
        多字段默认为第一个字段名
        指定了约束名则删除写的约束名(尚学堂207集)
        */

非空约束 NOT NULL

  • 只能为列级添加 ''、0 都不是null
创建非空约束    not null

#字段(列级)级添加,不可多个

CTReATE TABLE 表名(
    字段名    字段类型(长度),
    字段名1    字段类型(长度),
    .....
    字段名n    字段类型(长度) NUT NULL
)


ALTER TABLE sqlconstraints MODIFY AGE INT(3) NOT NULL;#创建非空约束,MODIFY为修改列属性

ALTER TABLE sqlconstraints MODIFY  AGE INT(3);#删除非空约束  
DESC  sqlconstraints#展示表结构  

默认值约束 DEFAULT

/*指在没有对某字段插入具体值时会插入默认值
#字段(列级)级添加,不可多个
CTREATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        .....
        字段名n        字段类型(长度) DEFAULT 具体值
        )

*/
ALTER TABLE sqlconstraints MODIFY 字段名 字段类型(长度);#删除
ALTER TABLE sqlconstraints MODIFY CLASS INT(4)  DEFAULT 1907;#添加默认值
ALTER TABLE sqlconstraints MODIFY CLASS INT(4);#删除默认值

自动增长约束

是唯一的,多配合主键使用,只适用于整数,初值为1
CTREATE TABLE 表名(
        字段名        字段类型(长度),
        字段名1        字段类型(长度),
        字段名2        字段类型(长度),
        字段名3        字段类型(长度),
        .....
        字段名n        字段类型(长度) PRIMARY KEY AUTO_INCREMENT
        )
        
ALTER TABLE sqlconstraints MODIFY ID INT(3) AUTO_INCREMENT;#添加自动增长约束
DESC sqlconstraints;
ALTER TABLE sqlconstraints MODIFY 字段名 字段类型(长度);#删除自动增长约束

外键约束

类型 实现方式
一对多 在多的一方建立外键,指向一的一方的主键
多对多 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 ,中间表为它关联表的子表
一对一 在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
/*FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。
通常一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。常和主键联系起来
对某张表修改删除时要保证数据完整性

MySQL中外约束可列级添加但不会生效

#表级添加,可添加多个或单个
CTRATE TABLE 表名(
        字段名        字段类型(长度),
        .....
        [CONTRAINT 约束名] FOREIGN KEY(字段名) REFERENCES 表(字段名)
        )
        例如:班级表和学生表
*/
一对多
CREATE TABLE CLASS(
        C_CON INT(8) PRIMARY KEY AUTO_INCREMENT,
        #字段1 字段类型(长度) [完整性约束],
        CNAME VARCHAR(20)
        )#创建班级表        

CREATE TABLE STUDENTS(
        CON INT(8) PRIMARY KEY AUTO_INCREMENT,
        ID INT(4),#字段1 字段类型(长度) [完整性约束],
        SNAME VARCHAR(20),
        AGE INT(3),
        CONSTRAINT fk_STUDENT_CON FOREIGN KEY(CON) 
         REFERENCES CLASS(C_CON)#fk_STUDENT_CON外键名不可重复
        )#创建表 
       
DESC STUDENTS;
SHOW CREATE TABLE STUDENTS;
ALTER TABLE STUDENTS ADD CONSTRAINT fk_STUDENT_CON FOREIGN KEY(CON)
	REFERENCES CLASS(C_CON)#创表后添加外界约束

ALTER TABLE STUDENTS DROP FOREIGN KEY fk_STUDENT#删除外界约束              
   ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名

一对一

create table tb_user_desc (
	id int primary key auto_increment,
	city varchar(20),
	edu varchar(10),
	income int,
	status char(2),
	des varchar(100)
);

create table tb_user (
	id int primary key auto_increment,
	photo varchar(100),
	nickname varchar(50),
	age int,
	gender char(1),
	desc_id int unique,
	-- 添加外键
	CONSTRAINT fk_user_desc FOREIGN KEY(desc_id) REFERENCES tb_user_desc(id)	
);

查看表结构模型图
image

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。myql不支持

建表后添加

  1. 添加一个

    ALTER TABLE 表名 ADD CHECK (P_Id>0)

  2. 添加多个

ALTER TABLE 表名
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
  1. 删除check约束
ALTER TABLE Persons DROP Check chk_Person

删除有关系的表

  1. 先删除有外键约束的表再删表,先students,后class
  2. 先删外界约束,后删表

E-R图转换为对应的关系模型

实体 不可再分割的名词,方框表示
实体的属性 椭圆表示
实体间关系 菱形表示
关系 表 ,二维表
元组 表中一行
属性 表中一列的列名,域名
表中某关系组可唯一确定一个元组(表中一行)也就为本关系的码 ,
相同数据类型的集合,表中一列
分量 元组的一个属性值,列值
关系模式 例: 关系名(属性1,属性2属性3....) 就是表头

实体间联系的转换

实体转换为一个关系模型(关系模型由一组关系构成(一个关系对应一张表))

1对1联系(a方b方) 在任意a方加入b主码为变更为b外键,并加入联系本身的属性
1对n联系 将1方主键加入n方作为n方的外键,联系的属性也加入n方
n对m联系 将联系本身转换为一个关系模型,模式名为联系名,主键为m和n的联合主键

例题:

某企业集团有若干工厂,每个工厂生产多种产品,且每一种产品可以在多个工厂生产,每个工厂按照固定的计划数量生产产品;每个工厂聘用多名职工,且每名职工只能在一个工厂工作,工厂聘用职工有聘期和工资。工厂的属性有工厂编号、厂名、地址,产品的属性有产品编号、产品名、规格,职工的属性有职工号、姓名。

image

2)将该E-R模型转换为关系模型;(5分)(要求:1:1和1:n的联系进行合并)

转化后的关系模式如下

工厂(工厂编号,厂名,地址)

产品(产品编号,产品名,规格)

职工(职工号,姓名,工产编号,聘期,工资)

生产(工产编号,产品编号,计划数量)

(3)指出转换结果中每个关系模式的主码和外码。(5分)

每个关系模式的主码、外码如下:

工厂:主码是工产编号;

产品:主码是产品编号;

职工:职工号,外码是工厂编号

生产:主码是(工产编号,产品编号),外码是工产编号、产品编号

posted @ 2023-08-04 11:16  KMP  阅读(34)  评论(0编辑  收藏  举报