[数据库]基础语法

数据模型

客户端想要去操作MYSQL数据库,首先客户端向数据库服务器发送对应的SQL语句,在服务器内部,会有一个软件叫DBMS数据库管理系统,它会去维护并且操作数据库,以及创建数据库,一个数据库里可以维护多张表,数据存储在表结构当中。

  • 关系型数据库(RDBMS)概念:建立在关系型基础上,由多张相互连接的二维表组成的数据库。
  • 非关系型数据库不通过表结构存储数据的数据库。

数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
create table student(
sno char(8),
sname varchar(8),
ssex char(2),
sage int,
sdept varchar(20)
);

create table course(
cno char(3),
cname varchar(20),
cpno char(3),
ccredit numeric(3,1)
);

create table sc(
sno char(8),
cno char(3),
grade numeric(4,1)
);


INSERT INTO STUDENT VALUES('08001','张三','男','18','CS');
INSERT INTO STUDENT VALUES('08002','李四','女','19','IS');
INSERT INTO STUDENT VALUES('08003','王五','男','20','MA');
INSERT INTO STUDENT VALUES('08004','李华','女','17','CS');
INSERT INTO STUDENT VALUES('08005','刘晨','男','18','IS');
INSERT INTO STUDENT VALUES('08006','刘丹丹','女','17','MA');
INSERT INTO STUDENT VALUES('08007','刘力','男','21','CS');
INSERT INTO STUDENT VALUES('08008','王江','男','19','CS');
INSERT INTO STUDENT VALUES('08009','高晓','男','20','IS');
INSERT INTO STUDENT VALUES('08010','张丽','女','19','CS');
INSERT INTO STUDENT VALUES('08011','胡天','女','20','MA');
INSERT INTO STUDENT VALUES('08012','叶子农','男','21','CS');
INSERT INTO STUDENT VALUES('08013','丁元英','男','19','IS');
INSERT INTO STUDENT VALUES('08014','欧阳雪','女','21','MA');


INSERT INTO COURSE VALUES('001','数据库','005','4');
INSERT INTO COURSE VALUES('002','高等数学','','2');
INSERT INTO COURSE VALUES('003','信息系统','001','4');
INSERT INTO COURSE VALUES('004','操作系统','006','3');
INSERT INTO COURSE VALUES('005','数据结构','007','4');
INSERT INTO COURSE VALUES('006','数据处理','','2');
INSERT INTO COURSE VALUES('007','C语言','006','4');
INSERT INTO COURSE VALUES('008','软件工程','001','4');
INSERT INTO COURSE VALUES('009','离散数学','002','4.5');
INSERT INTO COURSE VALUES('010','软件设计模式','008','3');


INSERT INTO SC VALUES('08001','002','100');
INSERT INTO SC VALUES('08001','003','95');
INSERT INTO SC VALUES('08001','004','90');
INSERT INTO SC VALUES('08001','006','100');
INSERT INTO SC VALUES('08002','002','98');
INSERT INTO SC VALUES('08002','003',NULL);
INSERT INTO SC VALUES('08003','001','99');
INSERT INTO SC VALUES('08003','002','80');
INSERT INTO SC VALUES('08003','003','98');
INSERT INTO SC VALUES('08003','004','95');
INSERT INTO SC VALUES('08003','005','90');
INSERT INTO SC VALUES('08003','006','100');
INSERT INTO SC VALUES('08003','007','98');
INSERT INTO SC VALUES('08003','008','96');
INSERT INTO SC VALUES('08003','009','99');
INSERT INTO SC VALUES('08003','010','95');
INSERT INTO SC VALUES('08004','001','90');
INSERT INTO SC VALUES('08004','002','95');
INSERT INTO SC VALUES('08004','003','90');
INSERT INTO SC VALUES('08004','004','100');
INSERT INTO SC VALUES('08004','005','98');
INSERT INTO SC VALUES('08004','006','96');
INSERT INTO SC VALUES('08004','007','99');
INSERT INTO SC VALUES('08004','008','90');
INSERT INTO SC VALUES('08004','009','98');
INSERT INTO SC VALUES('08004','010','98');
INSERT INTO SC VALUES('08005','001',NULL);
INSERT INTO SC VALUES('08005','002','37');
INSERT INTO SC VALUES('08005','003','86');
INSERT INTO SC VALUES('08005','004','94');
INSERT INTO SC VALUES('08005','005','50');
INSERT INTO SC VALUES('08013','001','30');
INSERT INTO SC VALUES('08013','003','40');
INSERT INTO SC VALUES('08013','004','23');
INSERT INTO SC VALUES('08013','006','45');
INSERT INTO SC VALUES('08005','006','95');
INSERT INTO SC VALUES('08005','007','97');
INSERT INTO SC VALUES('08005','009','87');
INSERT INTO SC VALUES('08006','003',null);
INSERT INTO SC VALUES('08008','001','50');
INSERT INTO SC VALUES('08008','003','80');
INSERT INTO SC VALUES('08009','001','89');
INSERT INTO SC VALUES('08009','004','90');
INSERT INTO SC VALUES('08010','001','99');
INSERT INTO SC VALUES('08010','002','80');
INSERT INTO SC VALUES('08010','003','98');
INSERT INTO SC VALUES('08010','004','95');
INSERT INTO SC VALUES('08010','005','100');
INSERT INTO SC VALUES('08010','006','96');
INSERT INTO SC VALUES('08010','007','99');
INSERT INTO SC VALUES('08010','008','50');
INSERT INTO SC VALUES('08010','009','86');
INSERT INTO SC VALUES('08010','010','88');
INSERT INTO SC VALUES('08011','001','89');
INSERT INTO SC VALUES('08011','004','58');
INSERT INTO SC VALUES('08011','005','97');
INSERT INTO SC VALUES('08011','008','86');
INSERT INTO SC VALUES('08011','010','94');
INSERT INTO SC VALUES('08012','001','37');
INSERT INTO SC VALUES('08012','002','86');
INSERT INTO SC VALUES('08012','003','94');
INSERT INTO SC VALUES('08012','004','50');
INSERT INTO SC VALUES('08012','006',null);
INSERT INTO SC VALUES('08012','007','46');
INSERT INTO SC VALUES('08012','009','90');
INSERT INTO SC VALUES('08012','010','98');
INSERT INTO SC VALUES('08014','005','20');
INSERT INTO SC VALUES('08014','006','46');
INSERT INTO SC VALUES('08014','009','51');

SQL语法

DDL

数据定义语言

数据库操作

查询
查询所有数据库

1
show databases;

查询当前数据库

1
select database();

创建数据库

1
create database [if not exist] 数据库名 [default charset 字符集] [collate 排序规则];

删除数据库

1
drop database [if exist] 数据库名;

使用数据库

1
use 数据库名;

查询当前数据库所有表

1
show tables;

查询表结构

1
desc 表名;

查询指定表的建表语句

1
show create table 表名;

创建
创建表

1
2
3
4
5
create table 表名(
字段1 字段1类型 [comment 字段1注释],
字段2 字段2类型 [comment 字段2注释],
字段3 字段3类型 [comment 字段3注释]
)[comment 表注释];

数据类型

分类 类型 大小 描述
数值类型 TINYINT 1 byte 小整数值
数值类型 SMALLINT 2 bytes 大整数值
数值类型 MEDIUMINT 3 bytes 大整数值
数值类型 INT或INTEGER 4 bytes 大整数值
数值类型 BIGINT 8 bytes 极大整数值
数值类型 FLOAT 4 bytes 单精度浮点数值
数值类型 DOUBLE 8 bytes 双精度浮点数值
数值类型 DECIMAL 小数值(精确定点数)
字符串类型 CHAR 0-255 bytes 定长字符串
字符串类型 VARCHAR 0-65535 bytes 变长字符串
字符串类型 TINYBLOB 0-255 bytes 不超过255个字符的二进制数据
字符串类型 TINYTEXT 0-255 bytes 短文本字符串
字符串类型 BLOB 0-65535 bytes 二进制形式的长文本数据
字符串类型 TEXT 0-65535 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 极大文本数据

日期类型

分类 类型 大小 范围 格式 描述
日期类型 DATE 3 1000-01-01~9999-12-31 YYYY-MM-DD 日期值
日期类型 TIME 3 -838:59:59~838:59:59 HH:MM:SS 时间值或持续时间
日期类型 YEAR 1 1901~2155 YYYY 年份值
日期类型 DATETIME 8 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
日期类型 TIMESTAMP 4 1970-01-01 00:00:01~2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

修改
添加字段

1
alter table 表名 add 字段名 类型 [comment 注释] [约束];

修改数据类型

1
alter table 表名 modify 字段名 新数据类型;

修改字段名和字段类型

1
alter table 表名 change 旧字段名 新字段名 类型 [comment 注释] [约束];

删除字段

1
alter table 表名 drop 字段名;

修改表名

1
alter table 表名 rename 新表名; 

删除表

1
drop table [if exist] 表名;

删除指定表,并重新创建该表

1
truncate table 表名;

根据需求创建表

1
2
3
4
5
6
7
8
设计一张员工信息表,要求如下:
1.编号(纯数字)
2.员工工号(字符串类型,长度不超过10位)
3.员工姓名(字符串类型,长度不超过10位)
4.性别(男/女,存储一个汉字)
5.年龄(正常人年龄,不可能存储负数)
6.身份证号(二代身份证号均为18位,身份证中有X这样的字符)
7.入职时间(取年月日即可)
1
2
3
4
5
6
7
8
9
create table emplee(
serialnumber int comment '编号',
workid varchar(10) comment "工号",
name varchar(10) comment "姓名",
gender char(1) comment "性别",
age int unsigned comment "年龄",
idcard char(18) comment "身份证号",
entrydate date comment "入职时间"
)comment "员工表";


查看表结构

DML

数据操作语言
添加数据
1.给指定字段添加数据

1
insert info 表名(字段名1,字段名2,...) values(值1,值2,...);

2.给全部字段添加数据

1
insert info 表名 value(值1,值2,...);

3.批量添加数据

1
2
insert info 表名(字段名1,字段名2,...) values(值1,值2,...),(值1,值2,...);
insert info 表名 values(值1,值2,...),(值1,值2,...);

指定字段顺序和值顺序要一致
字符串和日期类型数据应该包含在引号里
插入数据的大小要在字段指定的范围内
修改数据

1
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];

删除数据

1
delete from 表名 [where 条件]

DQL

数据查询语言

基本查询

1.查询多个字段

1
2
select 字段1,字段2,字段3,...from 表名;
select * from 表名;

2.设置别名

1
select 字段1 [as 别名],字段2 [as 别名2]... from 表名;

3.去除重复记录

1
select distinct 字段列表 from 表名;

条件查询

1
select 字段列表 from 表名 where 条件列表;
比较运算符 功能
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<>或!= 不等于
BETWEEN…AND… 在某个范围之内(含最小最大值)
IN(…) 在in之后的列表中的值,多选一
LIKE 占位符 模糊匹配(_匹配单个字符,%匹配任意个字符)
IS NULL 是NULL
逻辑运算符 功能
AND 或 &&
OR 或 ||
NOT 或 !

聚合函数

将一列数据作为一个整体,进行纵向运算。
null值不参与所有聚合函数运算。
常见聚合函数

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

使用格式

1
select 聚合函数(字段列表) from 表名;

分组查询

1
2
select 字段列表 from 表名 [where 条件] group by 分组字段名 
[having 分组过后的过滤条件];

where与having区别
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。

1
2
3
4
5
6
7
8
根据性别分组,统计男女生数量
select ssex as '性别',count(sno) as '数量' from student group by ssex;

根据性别分组,统计男女生平均年龄
select ssex as '性别',avg(student.sage) as '平均年龄' from student group by ssex;

查询年龄小于20的学生,并根据dept分组,获取数量大于5的dept
select sdept, count(sno) from student where student.sage<=20 group by sdept having count(sno)>2;

排序查询

1
select 字段列表 from 表名 order by 字段1 排序方式,字段2 排序方式;

排序方式
ASC: 升序(默认值)
DESC: 降序

1
2
3
4
5
6
根据年龄升序和降序排序
select * from student order by student.sage asc;
select * from student order by student.sage desc;

根据年龄升序排序,年龄相同,根据学生编号升序排序
select * from student order by student.sage asc,sno asc;

分页查询

1
select 字段列表 from 表名 limit 起始索引,查询记录数;

注意

  • 起始索引从0开始,起始索引 = (查询页码-1)*每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MYSQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10。
1
2
3
4
查询第一页学生数据,每页展示10条数据
select * from student limit 10;
查询第一页学生数据,每页展示10条数据
select * from student limit 1,10;

DQL执行顺序

  • select
  • from
  • where
  • group by
  • having
  • order by
  • limit

DCL

数据控制语言,用来管理数据库用户、控制数据库的访问权限

管理用户

1.查询用户

1
2
use mysql;
select * from user;

2.创建用户

1
create user '用户名'@'主机名' identified '密码'

3.修改用户密码

1
alter user '用户名'@'主机名' identified with MySQL_native_password by '新密码'

4.删除用户

1
drop user '用户名'@'主机名'

案例

1
2
3
4
5
6
7
8
9
10
11
创建用户 itcast , 只能在当前主机localhost访问,密码123456
create user 'itcast'@'localhost' identified '123456';

创建用户 heima , 可以在任意主机访问该数据库,密码123456
create user 'heima'@'%' identified '123456';

修改用户heima的访问密码为1234
alter user 'heima'@'%' identified by '1234';

删除用户itcast@localhost
drop user 'itcast'@'localhost';

主机名可以使用%通配

权限控制

Mysql中定义了很多权限,但常用的有

权限 说明
all,all privileges 所有权限
select 查询数据
inseret 插入数据
update 修改数据
delete 删除数据
alter 修改表
drop 删除数据库/表/视图
create 创建数据库/表

1.查询权限

1
show grants for '用户名'@'主机名';

2.授予权限

1
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';

3.撤销权限

1
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'

函数

字符串函数

1
2
3
4
5
6
7
select concat('Hello',' Mysql');
select lower('Hello');
select upper('Hello');
select lpad('01',5,'-')
select rpad('01',5,'-')
select trim(' Hello Mysql');
select substring('Hello Mysql',1,5);

substring中索引从1开始,没有0

1
2
将每个学生姓名的设置为3位,不足3位的,前面补空格
updata student set sname=lpad(sname,3,' ')

数值函数


通过数据库的函数生成一个六位数的随机验证码

1
select lpad(round((rand()*1000000),0),6,0);

日期函数

流程函数

实现条件筛选,提高语句的速率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
统计各个学员的成绩,展示的规则如下:
>=85 展示优秀
>=60 展示及格
否则 展示不及格

create table score(
id int comment 'ID',
name varchar(20) comment '姓名',
math int comment '数学',
english int comment '英语',
chinese int comment '语文'
)comment '成绩表'

insert into score(id,name,math,english,chinese) values (1,'Tom',67,88,95),(2,'Rose',23,66,90),(3,'Jack',56,98,76);

select
id,
name,
case when math>=85 then '优秀' when math >=60 then '及格' else '不及格' end,
case when english>=85 then '优秀' when english >=60 then '及格' else '不及格' end,
case when chinese>=85 then '优秀' when chinese >=60 then '及格' else '不及格' end,
from score;