#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用来过滤需要查询的内容。
运算符 | 说明 |
---|---|
> | 大于 |
>= | 大于或等于 |
= | 等于 |
!= 或 <> | 不等于 |
< | 小于 |
<= | 小于或等于 |
SELECT 字段名 FROM 表名 WHERE 字段名 IN (n1,n2,n3,...);
SELECT 字段名 FROM 表名 WHERE 字段名 NOT IN (n1,n2,n3,...);
IN用来过滤需要查询的内容;括号内如果是数字,必须为INT
格式。其实IN的内容少时可用用where 字段名=n1 or 字段名=n1 替代,
SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN n1 AND n2;
SELECT 字段名 FROM 表名 WHERE 字段名 NOT BETWEEN n1 AND n2;
闭区间:过滤范围包含n1、n2。
使用通配符%
或_
模糊匹配数据内容
百分号通配符%
可以匹配任意长度的字符,甚至包括零字符;下划线通配符_
只能模糊匹配1个
字符(空格也算一个字符),两者可相互搭配,位置灵活。
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符%';·
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE '字符_';
过滤结果中某个字段是/不为空值NULL
的结果。
SELECT 字段名 FROM 表名 WHERE 字段名 IS [NOT] NULL;
在选出的结果里去除重复的行
SELECT DISTINCT 字段名 FROM 表名;
SELECT 字段名 FROM 表名 WHERE 表达式1 AND 表达式2 [AND/OR] 表达式3 ;
利用逻辑关系对不同字段使用多重过滤条件过滤结果(比如查找身高170以上体重140以下的我)。如果是相同字段多个条件的话用or更好。
用来限制查询结果的数量。
SELECT 字段名 FROM 表名 LIMIT [OFFSET,] 记录数;
参数说明:
OFFSET
,可选参数,表示偏移量,如果不指定默认值为0
,表示从查询结果的第一条记录开始,若偏移量为1
,则从查询结果中的第二条记录开始,以此类推。SELECT 字段名 FROM 表名 ORDER BY 字段名1 [ASC[DESC]];
按照字段名1进行升序(ASE)或降序(DESC)显示,只用ORDER BY 字段名1
而不指明顺序默认采用升序排列。
查询的是每个分组中 首次出现的一条记录。
SELECT 字段名 FROM 表名 GROUP BY 字段名;
用来给查询结果中的表或列另起别名
[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.字段
如:查询大学生对应课程的名称,没选课的课程结果为NULL或者某课没人选的学生为NULL。
把上面的各种结合起来。。。一同操作猛如虎。
把SELECT选出的结果作为另一个SELECT的数据源
SELECT * FROM t1 WHERE col1=(SELECT col2 FROM t2);
子查询指嵌套在查询内部,且必须始终出现在圆括号内,子查询可以分为四类:
N
行一列;N
列;N
行 N
列。ALL必须接在一个比较运算符的后面,表示与子查询返回的所有值比较都为 TRUE
则返回TRUE
.常用于找比最大的还大、比最小的还小
ANY
与比较操作符联合使用,表示与子查询返回的任何值比较为TRUE
,则返回TRUE
。 SOME
是ANY
的别名,一般用的比较少。常用于查找比最小的大
IN
的意思就是指定的一个值是否在这个集合中,如果在就返回TRUE
;否则就返回FALSE
了,同IN
(项1
,项2
,…);IN
是 = ANY
的别名,二者相同,但 NOT IN
的别名却不是 <> ANY
而是 <> SOME
。SELECT AVG(列名) FROM 表明;
ERROR 1046 (3D000): No database sleected
没有选中数据库, use 数据库名称