数据库原理与应用-MySQL数据定义与操作实战-学习笔记

#Author: Kearney
#Contents: DataBase System Theory
#Time: 2020

全文3704字,没有点耐心怎么学习呢。奥力给!

简介

数据库的安装与连接不在本文描述范围:请搜索掌握数据库的安装方式和连接方式。

本文以MyQSL为案例。SQL语句示例中部分相关语句也列在其中,作为了解。不是主要功能语句。

MySQL 中的 SQL 语句对关键字的大小写不敏感,但是许多开发者更喜欢将关键字大写,表名和字段名使用小写,养成这种习惯,以后写出来的脚本就更容易阅读和维护了。

数据库原理与应用

创建数据库

sql语句用分号作为结束标志,大小写不敏感

mysql -u root -p	#以root账户登录数据库,井号“#”后面的内容为注释
					
create database TestDb;		#创建数据库,数据库名为 TestDb

show databases;	#查看MySQL中已存在的数据库,参考语句

创建表

use TestDb;		#选中数据库 TestDb,表示接下来的操作在 TestDb中进行
#若不提前选中数据库而直接建表,则会报错ERROR 1046

create table user(		#在 TestDb中创建表,表名为 user
    id INT,					#每个字段之间用英文逗号隔开
    username VARCHAR(32),
    password VARCHAR(32),
    phone VARCHAR(11)		#!!!这里是没有逗号的哟
);

#下面的内容仅供学习,不是建表必备操作
show tables;	#查看当前数据库中存在的表
DESCRIBE user;	#查看表user的结构,可以简写为 DESC user;
drop table user;	#删除表,仅供参考,不得已不使用的命令

创建好之后的表的结构如下(很像Excel表格吧):

字段名称 数据类型 备注
id INT 用户ID
username VARCHAR(32) 用户名
password VARCHAR(32) 密码
phone VARCHAR(11) 手机号码

INT类型存储数字,VARCHAR()则是字符类型,括号中表示字符的最大长度

添加主键约束

主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空,主键能够唯一的标识表中的每一条记录,就好像我们人的身份证一样。

一个表的主键可以多个,也可以单个。

在建表的时候指定主键

定义列的同时指定主键

create table user(		
    id INT primary key,		#指定id为主键
    username VARCHAR(32),
    password VARCHAR(32),
    phone VARCHAR(11)
);

定义完所有列之后指定主键

create table user(		
    id INT ,		
    username VARCHAR(32),
    password VARCHAR(32),
    phone VARCHAR(11)primary key(id)#指定id为主键
#    primary key(id,username)#指定id和username为主键,不同字段之间用逗号隔开
);

修改表的结构指定主键

alter table user add primary key (id);  	#此时id在表里面必须是第一列

外键约束

外键(外部关键字)就是另一张表中的主键。用来保持数据的一致性,完整性。

外键类型必须和对应主键类型一置。

如果要删除的字段里含有外键,则删除失败报错,必须先删除外键约束。

CONSTRAINT 外键名 FOREIGN KEY 字段名 REFERENCES 主表名(主键名)
CREATE table t_class(
id INT PRIMARY KEY,	#主键,班级id
NAME VARCHAR(22)
);

CREATE table t_student(
id INT PRIMARY KEY,
NAME VARCHAR(22),
classId INT,	#为班级id添加外键
CONSTRAINT fk_stu_class1 FOREIGN KEY (classId) REFERENCES t_class(id)
);	#外键名是任意的,外键在另一个表中必须是主键!!!

常用约束

create table t_user(
id int primary key auto_increment,
username varchar(32) not null unique,
sex varchar(4) DEFAULT '男' 
);

若要给字段添加两个或者两个以上的约束,约束之间以空格隔开即可。

唯一约束

唯一约束(Unique Constraint)要求该列中的数据唯一,允许为空,但是只能有一个空值。当在有唯一约束的列输入数据就会报错。

添加该约束时只需要在字段名后加关键词 UNIQUE

主键自带唯一约束光环,常用在其它非主键上,比如邮箱、手机号啊(某些注册页面不言而喻)

非空约束

对某一字段添加该非空约束后,使得向表中插入数据时数据库会检验该字段的输入是否为空,若为空,则插入数据失败,报错。常用在一些必填字段,如实名认证中的手机号

添加该约束时只需要在字段名后加关键词NOT NULL

默认约束

有的时候我们希望某些数据本身为默认值,比如学生成绩表中的二级成绩默认为P(手动狗头),这样只要修改少数挂科学生的成绩即可。

添加该约束时只需要在字段名后加关键词 DEFAULT

  • 如果是添加字符串型默认值要使用英文单引号
  • 如果要添加的是中文默认值,则需要加上DEFAULT CHARSET=utf8;

自动增加

这个比较好理解,学号、工号这种连续性的数据。

添加该约束时只需要在字段名后加关键词AUTO_INCREMENT,默认情况下初始值和增量都为1

查看表结构

DESCRIBE可以查看表的字段信息,包括:字段名、字段数据类型、是否为主键、是否有默认值等。

  • NULL:表示该列是否能存储 NULL 值;
  • Key:表示该列是否已编制索引;
  • PRI:表示该列是此表主键的一部分;
  • UNI:表示该列是 UNIQUE 索引的一部分;
  • MUL:表示在列中某个给定值允许出现多次;
  • Default:表示该列是否有默认值,如果有的话值是多少;
  • Extra:表示可以获取的与给定列有关的附加信息。

查看数据表详细结构:除了返回给我们建表时所写的详细语句,还可以查看存储引擎和字符编码。

SHOW CREATE TABLE 表名;

觉得返回的结果排版有点乱。我们加上\G后效果就会有所改善 SHOW CREATE TABLE 表名 \G;

修改表的结构

修改表名

ALTER TABLE 旧表名 RENAME 新表名;

修改字段名

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

新数据类型不可以为空!!!可以和原来一样,也可以不一样。

修改字段数据类型

ALTER TABLE 表名 MODIFY 字段名 数据类型;

添加字段

ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER] 已存在字段名;

若不做[FIRST|AFTER]的位置说明,在添加字段时MySQL会默认把新字段加入到表的最后一列

如果我们想在第一列添加新的字段,只需做FIRST的位置说明。如果想指定在某一列的后面添加新的字段,只需做AFTER的位置说明。指定在某一列的前面的话就会报错!!!

删除字段

ALTER TABLE 表名 DROP 字段名;

修改字段的排列位置

ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2;

只做FIRST的位置说明时,字段1就会被调到在第一列。

删除表的外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

插入数据

为表的所有字段插入数据

INSERT INTO 表名 (字段名) VALUES (内容);

多个字段、内容之间用逗号分隔开,字符内容用一对单引号括起来。内容必须与指定的字段顺序相对应。不填字段名的话按照表的字段顺序插入相应数据。

为表同时插入多条记录

INSERT INTO 表名 (字段名) VALUES (内容1),(内容2),(内容3);

更新表中指定的内容

UPDATE 表名 SET 字段名1 = 内容1, 字段名2 = 内容2, 字段名3 = 内容3 WHERE 过滤条件;

字段多少看更新需求,更新多一个就写多少个

删除表中的指定行

DELETE FROM 表名 WHERE 条件语句;

条件语句指定了要删除那些内容,省略where 条件语句;的话则删除所有行。

TRUNCATE TABLE 表名; 也可以用来删除表中的所有记录。但是与 DELETE 不同的是,TRUNCATE TABLE 语句直接删除的是表,而不是表中的内容,删除结束后还会重新创建一个表。所以它的执行速度会比 DELETE 语句快。

查询

SELECT 字段名1,字段名2 FROM 表名;

SELECT 字段名1,字段名2 FROM 表名 WHERE 条件语句;

多个字段名之间有逗号隔开,查询所有字段则用*代替所有字段名。where用来过滤需要查询的内容。

比较运算符

运算符 说明
> 大于
>= 大于或等于
= 等于
!= 或 <> 不等于
< 小于
<= 小于或等于

in

SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);

SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);

IN用来过滤需要查询的内容;括号内如果是数字,必须为INT格式。其实IN的内容少时可用用where 字段名=n1 or 字段名=n1 替代,

BETWEEN AND

SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;

SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2;

闭区间:过滤范围包含n1、n2。

like

使用通配符%_模糊匹配数据内容

百分号通配符%可以匹配任意长度的字符,甚至包括零字符;下划线通配符_只能模糊匹配1个字符(空格也算一个字符),两者可相互搭配,位置灵活。

SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';·

SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';

IS NULL

过滤结果中某个字段是/不为空值NULL的结果。

SELECT 字段名 FROM 表名 WHERE 字段名 IS [NOT] NULL;

DISTINCT

在选出的结果里去除重复的行

SELECT DISTINCT 字段名 FROM 表名;

AND OR

SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2 [AND/OR] 表达式3 ;

利用逻辑关系对不同字段使用多重过滤条件过滤结果(比如查找身高170以上体重140以下的我)。如果是相同字段多个条件的话用or更好。

LIMIT

用来限制查询结果的数量。

SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;

参数说明:

  • 第一个参数,OFFSET,可选参数,表示偏移量,如果不指定默认值为0,表示从查询结果的第一条记录开始,若偏移量为1,则从查询结果中的第二条记录开始,以此类推。
  • 第二个参数,记录数,表示返回查询结果的条数。

排序 ORDER BY

SELECT 字段名 FROM 表名 ORDER BY 字段名1 [ASC[DESC]];

按照字段名1进行升序(ASE)或降序(DESC)显示,只用ORDER BY 字段名1而不指明顺序默认采用升序排列。

分组查询 GROUP BY

查询的是每个分组中 首次出现的一条记录

SELECT 字段名 FROM 表名 GROUP BY 字段名;

AS

用来给查询结果中的表或列另起别名

内连接查询

  • 仅将两个表中满足连接条件的行组合起来作为结果集,称为内连接;
  • 关键字:[inner] join ... on

表1 [inner] join 表2 on 表1.字段=表2.字段

从表1中取出每一条记录,去表2中与所有的记录进行匹配,匹配必须是某个条件在表1中与表2中相同,最终才会保留结果,否则不保留。inner 关键字可省略不写;on 表示连接条件:条件字段就是代表相同的业务含义,大多数情况下为两张表中的主外键关系。

如:查询学生对应班级的名称,没分班的查不出来。

外连接查询

  • 以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接,不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其它表的字段都置空(null),称为外连接。
  • 外连接查询分为左外连接查询和右外连接查询;
  • 表1 left/right [outer] join 表2 on 表1.字段=表2.字段
  • 左外连接:在内连接的基础上,还包含表1中所有不符合条件的数据行,并在其中的表2列填写 NULL;右外连接:在内连接的基础上,还包含表2中所有不符合条件的数据行,并在其中的表1列填写 NULL。

如:查询大学生对应课程的名称,没选课的课程结果为NULL或者某课没人选的学生为NULL。

复合查询

把上面的各种结合起来。。。一同操作猛如虎。

子查询

把SELECT选出的结果作为另一个SELECT的数据源

SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);

子查询指嵌套在查询内部,且必须始终出现在圆括号内,子查询可以分为四类:

  • 标量子查询:返回单一值的标量,最简单的形式;
  • 列子查询:返回的结果集是 N 行一列;
  • 行子查询:返回的结果集是一行 N 列;
  • 表子查询:返回的结果集是 NN 列。

关键字子查询 ALL ANY SOME IN

ALL

ALL必须接在一个比较运算符的后面,表示与子查询返回的所有值比较都为 TRUE则返回TRUE.常用于找比最大的还大、比最小的还小

ANY SOME

ANY与比较操作符联合使用,表示与子查询返回的任何值比较为TRUE,则返回TRUESOMEANY的别名,一般用的比较少。常用于查找比最小的大

IN

  • IN的意思就是指定的一个值是否在这个集合中,如果在就返回TRUE;否则就返回FALSE了,同IN(项1,项2,…);
  • IN= ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME

函数

AVG 平均值

SELECT AVG(列名) FROM 表明;

错误集锦

ERROR 1046 (3D000): No database sleected

没有选中数据库, use 数据库名称

猜你喜欢

转载自blog.csdn.net/weixin_43031092/article/details/106032052