目录
数据库相关概念
概念
- 数据库(DataBase)
储存数据的仓库,数据是有组织的储存
- 数据库管理系统(Database Management System)
操纵和管理数据库的大型软件
- SQL
操纵关系型数据库的编程语言,建立了一套操作关系型数据库的统一标准
主流的数据库管理系统
不管使用哪种关系型数据库,都需要使用SQL,它是一套标准。
MySQL数据库
版本:
- 社区版(MySQL Community Server)
- 商业版(MySQL Enterprise Edition)
下载:
启动与停止
- 通过 "服务" 管理工具: 打开"运行"对话框(Win + R),输入 services.msc,找到"MySQL"服务,右击选择"启动"。
-
通过命令提示符: 打开命令提示符(以管理员身份),输入以下命令:
net start mysql
- 通过 "服务" 管理工具: 打开"运行"对话框(Win + R),输入 services.msc,找到"MySQL"服务,右击选择"停止"。
-
通过命令提示符: 打开命令提示符(以管理员身份),输入以下命令:
net stop mysql
PS:以上命令中的mysql在安装时自己命名的。
客户端连接
- 使用MySQL自带的命令行工具
选择commond line,然后输入密码即可进入MySQL。
- 使用系统自带的命令行工具
使用这种方式,需要配置系统的环境变量:
- 找到MySQL Server的bin文件地址,一般默认的安装地址在C: Program Files中的MySQL文件夹。
- 然后将赋值bin的文件地址,将其添加到系统环境变量的PATH中。
- 然后后再系统管理员命令行中输入
mtsql -u root -p
数据模型
建立客户端联系后,可以通过DBMS来操作和管理数据库。
-
关系型数据库
概念:
是建立在关系型数据模型上的,有多张相互关联的二维表组成的数据库。
特点:
- 使用表来储存数据,格式统一,维护方便。
- 采用SQL语言,标准统一,操纵方便。
SQL语言
SQL语句的通用语法
- SQL语句支持单行或多行书写,并且使用分号结尾
- SQL语句可以使用空格,缩进来增强语句的可读性
- SQL语句不区分大小写(关键字最好使用大写)
- 注释:
- 单行注释:- -或者#(MySQL特有)
- 多行注释:/* */
SQL分类
-
DDL
数据定义语言,用来进行数据表,子段等数据的定义。
DDL数据库操作
查询:
查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE() ;
当执行了很多sql语句时,有可能忘记处于哪个数据库,使用查询当前数据库即可。
创建:
CREATE DATABASE 数据库名;
PS:如果创建的数据名称已经存在,系统会报错。
CREATE DATABASE IF NOT EXIST 数据库名;
多加一句 IF NOT EXIST 不存在就创建,存在就忽略这条命令。
CREATE DATABASE IF NOT EXIST 数据库名 DEFAULT CHARSET 字符类型;
多加一句 DEFAULT CHARSET 字符类型 可以指定所创建数据库的字符类型。
删除:
DROP DATABASE 数据库名;
DROP DATABASE 数据库名 IF NOT EXIST;
使用:
USE DATABASE 数据库名;
DDL表操作
查询:
查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询创建表的SQL语句
SHOW CREATE TABLE 表名;
创建:
CREATE TABLE 表名(
字段1 子段类型 COMMENT '注释内容' ,
字段2 子段类型 COMMENT '注释内容' ,
字段3 子段类型 COMMENT '注释内容'
)COMMENT ‘表注释’ ;
PS :每个字段的定义使用逗号隔开、最后一个字段的定义不用加逗号、注释使用单引号、表的定义完后要在最后加上分号。
数据类型:
参照文章数据类型。(后悔会补上)
修改:
添加字段
ALTER TABLE 表名 ADD 字段 字段类型 COMMENT '注释内容' ;
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段类型 COMMENT 约束;
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
删除:
DROP TABLE 表名;
TRUNCATE TABLE 表名;
PS:两者的区别在于前者会将表删除,而后者只是将表中的数据删除,而依然保留表结构。
-
DML
数据操作语言,对数据库中的表的数据记录进行增删改。
添加数据:
选择字段添加值
INSERT INTO 表名 (字段1,字段2,……) VALUES (值1,值2,……);
为表的所有字段添加值
INSERT INTO 表名 VALUES(值1,值2,……);
批量添加字段数据
INSERT INTO 表名 (字段1,字段2,……)VALUES(值1,值2,……),VALUES(值1,值2,……);
批量添加全部字段数据
INSERT INTO 表名 VALUES(值1,值2,……),VALUES(值1,值2,……);
PS:在添加字符串类型和日期类型的数据时应该使用引号、批量添加数据时每组数据使用逗号隔开。
修改数据:
UPDATE 表名 SET 字段名1 = 值1,字段名2 = 值2,……WHERE 条件;
PS:如果不加WHERE条件,则默认将表中所有数据的某字段改为同一值。
删除数据:
DELETE FROM 表名 WHERE 条件;
PS:如果不加WHERE条件,那么将会将整张的数据删除,要注意的是只是将数据删除,但是表的结构还在。
DELETE语句不能删除某一个字段的数据(可以使用UPDATE)。
-
DQL
数据查询语言,用于查询数据库中表中的记录。
基本查询:
查询指定字段值
SELECT 字段名1,字段名2,…… FROM 表名;
查询所有字段
SELECT * FROM 表名;
起别名
SELECT 字段名 AS 别名 FROM 表名;
去除重复记录
SELECT DISTINCT 字段名 FROM 表名;
条件查询:
语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;
常见运算符
聚合函数:
介绍
讲一列数据作为一个整体,进行纵向计算。
常见的聚合函数
注意:NULL不参与所有聚合函数的运算。
SELECT COUNT(id) FROM 表名;
SELECT MAX(age) FROM 表名;
命令是可以进行组合的,如下:
SELECT SUM(age) FROM 表名 WHERE WORKADDRESS = '西安';
分组查询:
语法
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段 [ 分组后的过滤条件 ] ;
where和having的区别
- 执行时机:where用于未分组字段的过滤,不满足where条件的不参与分组
- 判断对象不同:where不能用于聚合函数的筛选,having可以。
执行顺序:where > 聚合函数 > hanving
实例
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY, -- 用户ID,主键,自动递增
user_name VARCHAR(50) NOT NULL, -- 用户名称
user_gender ENUM('男', '女', '其他') NOT NULL, -- 用户性别
user_age INT CHECK (user_age > 0 AND user_age < 150), -- 用户年龄,范围限制
user_contact VARCHAR(20) NOT NULL, -- 用户联系方式
user_address VARCHAR(255) NOT NULL -- 用户地址
);
INSERT INTO users (user_name, user_gender, user_age, user_contact, user_address)
VALUES
('张三', '男', 28, '13800000000', '北京市海淀区'),
('李四', '女', 24, '13900000000', '上海市浦东新区'),
('王五', '男', 35, '13700000000', '广州市天河区'),
('赵六', '女', 22, '13600000000', '深圳市南山区'),
('孙七', '男', 40, '13500000000', '杭州市西湖区'),
('周八', '女', 27, '13400000000', '成都市武侯区'),
('吴九', '男', 30, '13300000000', '武汉市江汉区'),
('郑十', '女', 25, '13200000000', '重庆市渝中区'),
('王十一', '男', 32, '13100000000', '西安市雁塔区'),
('赵十二', '女', 29, '13000000000', '南京市鼓楼区'),
('钱十三', '男', 36, '12900000000', '苏州市姑苏区'),
('孙十四', '女', 23, '12800000000', '杭州市余杭区'),
('李十五', '男', 41, '12700000000', '青岛市市南区'),
('周十六', '女', 26, '12600000000', '天津市和平区'),
('吴十七', '男', 31, '12500000000', '沈阳市和平区'),
('郑十八', '女', 28, '12400000000', '大连市中山区'),
('王十九', '男', 33, '12300000000', '青岛市市北区'),
('赵二十', '女', 30, '12200000000', '宁波市鄞州区'),
('钱二十一', '男', 37, '12100000000', '厦门市思明区'),
('孙二十二', '女', 24, '12000000000', '福州市鼓楼区'),
('李二十三', '男', 42, '11900000000', '合肥市庐阳区'),
('周二十四', '女', 27, '11800000000', '郑州市金水区'),
('吴二十五', '男', 32, '11700000000', '长沙市岳麓区'),
('郑二十六', '女', 29, '11600000000', '南宁市青秀区'),
('王二十七', '男', 34, '11500000000', '昆明市五华区'),
('赵二十八', '女', 31, '11400000000', '拉萨市城关区'),
('钱二十九', '男', 38, '11300000000', '银川市兴庆区'),
('孙三十', '女', 25, '11200000000', '乌鲁木齐市天山区'),
('李三十一', '男', 43, '11100000000', '兰州市城关区'),
('周三十二', '女', 28, '11000000000', '西宁市城中区'),
('吴三十三', '男', 33, '10900000000', '银川市金凤区'),
('郑三十四', '女', 30, '10800000000', '呼和浩特市新城区'),
('王三十五', '男', 35, '10700000000', '哈尔滨市南岗区'),
('赵三十六', '女', 26, '10600000000', '长春市南关区'),
('钱三十七', '男', 39, '10500000000', '沈阳市沈河区'),
('孙三十八', '女', 27, '10400000000', '大连市西岗区'),
('李三十九', '男', 44, '10300000000', '青岛市李沧区'),
('周四十', '女', 29, '10200000000', '宁波市江北区'),
('吴四十一', '男', 34, '10100000000', '厦门市湖里区'),
('郑四十二', '女', 31, '10000000000', '福州市台江区'),
('王四十三', '男', 36, '9900000000', '合肥市蜀山区'),
('赵四十四', '女', 28, '9800000000', '郑州市二七区'),
('钱四十五', '男', 32, '9700000000', '长沙市开福区'),
('孙四十六', '女', 30, '9600000000', '南宁市西乡塘区'),
('李四十七', '男', 37, '9500000000', '昆明市盘龙区'),
('周四十八', '女', 29, '9400000000', '拉萨市堆龙德庆区'),
('吴四十九', '男', 33, '9300000000', '银川市西夏区'),
('郑五十', '女', 31, '9200000000', '乌鲁木齐市沙依巴克区'),
('张五十一', '男', 30, '9100000000', '北京市海淀区'),
('李五十二', '女', 27, '9000000000', '上海市浦东新区'),
('王五十三', '男', 32, '8900000000', '广州市天河区'),
('赵五十四', '女', 25, '8800000000', '深圳市南山区');
查询年龄大于等于30的员工,以地区为分组条件,获取员工数量大于等于2的地区。
select user_address from users where user_age>=30 group by user_address having count(*)>=2;
排序查询:
语法
SELSCT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 ,字段2 排序方式2 ;
- ASC(升序)
- DESC(降序)
只有当第一字段相同时,才会对第二字段进行排序。
实例
将员工按照年龄排序,当年年龄相同时,按照user_id升序排序。
select * from users order by user_age , user_id;
运行结果如下
+---------+-----------+-------------+----------+--------------+----------------------+
| user_id | user_name | user_gender | user_age | user_contact | user_address |
+---------+-----------+-------------+----------+--------------+----------------------+
| 4 | 赵六 | 女 | 22 | 13600000000 | 深圳市南山区 |
| 12 | 孙十四 | 女 | 23 | 12800000000 | 杭州市余杭区 |
| 2 | 李四 | 女 | 24 | 13900000000 | 上海市浦东新区 |
| 20 | 孙二十二 | 女 | 24 | 12000000000 | 福州市鼓楼区 |
| 8 | 郑十 | 女 | 25 | 13200000000 | 重庆市渝中区 |
| 28 | 孙三十 | 女 | 25 | 11200000000 | 乌鲁木齐市天山区 |
| 52 | 赵五十四 | 女 | 25 | 8800000000 | 深圳市南山区 |
| 14 | 周十六 | 女 | 26 | 12600000000 | 天津市和平区 |
| 34 | 赵三十六 | 女 | 26 | 10600000000 | 长春市南关区 |
| 6 | 周八 | 女 | 27 | 13400000000 | 成都市武侯区 |
| 22 | 周二十四 | 女 | 27 | 11800000000 | 郑州市金水区 |
| 36 | 孙三十八 | 女 | 27 | 10400000000 | 大连市西岗区 |
| 50 | 李五十二 | 女 | 27 | 9000000000 | 上海市浦东新区 |
| 1 | 张三 | 男 | 28 | 13800000000 | 北京市海淀区 |
| 16 | 郑十八 | 女 | 28 | 12400000000 | 大连市中山区 |
| 30 | 周三十二 | 女 | 28 | 11000000000 | 西宁市城中区 |
| 42 | 赵四十四 | 女 | 28 | 9800000000 | 郑州市二七区 |
| 10 | 赵十二 | 女 | 29 | 13000000000 | 南京市鼓楼区 |
| 24 | 郑二十六 | 女 | 29 | 11600000000 | 南宁市青秀区 |
| 38 | 周四十 | 女 | 29 | 10200000000 | 宁波市江北区 |
| 46 | 周四十八 | 女 | 29 | 9400000000 | 拉萨市堆龙德庆区 |
| 7 | 吴九 | 男 | 30 | 13300000000 | 武汉市江汉区 |
| 18 | 赵二十 | 女 | 30 | 12200000000 | 宁波市鄞州区 |
| 32 | 郑三十四 | 女 | 30 | 10800000000 | 呼和浩特市新城区 |
| 44 | 孙四十六 | 女 | 30 | 9600000000 | 南宁市西乡塘区 |
| 49 | 张五十一 | 男 | 30 | 9100000000 | 北京市海淀区 |
| 15 | 吴十七 | 男 | 31 | 12500000000 | 沈阳市和平区 |
| 26 | 赵二十八 | 女 | 31 | 11400000000 | 拉萨市城关区 |
| 40 | 郑四十二 | 女 | 31 | 10000000000 | 福州市台江区 |
| 48 | 郑五十 | 女 | 31 | 9200000000 | 乌鲁木齐市沙依巴克区 |
| 9 | 王十一 | 男 | 32 | 13100000000 | 西安市雁塔区 |
| 23 | 吴二十五 | 男 | 32 | 11700000000 | 长沙市岳麓区 |
| 43 | 钱四十五 | 男 | 32 | 9700000000 | 长沙市开福区 |
| 51 | 王五十三 | 男 | 32 | 8900000000 | 广州市天河区 |
| 17 | 王十九 | 男 | 33 | 12300000000 | 青岛市市北区 |
| 31 | 吴三十三 | 男 | 33 | 10900000000 | 银川市金凤区 |
| 47 | 吴四十九 | 男 | 33 | 9300000000 | 银川市西夏区 |
| 25 | 王二十七 | 男 | 34 | 11500000000 | 昆明市五华区 |
| 39 | 吴四十一 | 男 | 34 | 10100000000 | 厦门市湖里区 |
| 3 | 王五 | 男 | 35 | 13700000000 | 广州市天河区 |
| 33 | 王三十五 | 男 | 35 | 10700000000 | 哈尔滨市南岗区 |
| 11 | 钱十三 | 男 | 36 | 12900000000 | 苏州市姑苏区 |
| 41 | 王四十三 | 男 | 36 | 9900000000 | 合肥市蜀山区 |
| 19 | 钱二十一 | 男 | 37 | 12100000000 | 厦门市思明区 |
| 45 | 李四十七 | 男 | 37 | 9500000000 | 昆明市盘龙区 |
| 27 | 钱二十九 | 男 | 38 | 11300000000 | 银川市兴庆区 |
| 35 | 钱三十七 | 男 | 39 | 10500000000 | 沈阳市沈河区 |
| 5 | 孙七 | 男 | 40 | 13500000000 | 杭州市西湖区 |
| 13 | 李十五 | 男 | 41 | 12700000000 | 青岛市市南区 |
| 21 | 李二十三 | 男 | 42 | 11900000000 | 合肥市庐阳区 |
| 29 | 李三十一 | 男 | 43 | 11100000000 | 兰州市城关区 |
| 37 | 李三十九 | 男 | 44 | 10300000000 | 青岛市李沧区 |
+---------+-----------+-------------+----------+--------------+----------------------+
52 rows in set (0.00 sec)
分页查询:
语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意
- 起始索引从0开始
- 分页查询是数据库的方言,MySQL中是LIMIT
- 如果就是查询查第一页,起始索引可以不用写
mysql> select * from users limit 0,10;
+---------+-----------+-------------+----------+--------------+----------------+
| user_id | user_name | user_gender | user_age | user_contact | user_address |
+---------+-----------+-------------+----------+--------------+----------------+
| 1 | 张三 | 男 | 28 | 13800000000 | 北京市海淀区 |
| 2 | 李四 | 女 | 24 | 13900000000 | 上海市浦东新区 |
| 3 | 王五 | 男 | 35 | 13700000000 | 广州市天河区 |
| 4 | 赵六 | 女 | 22 | 13600000000 | 深圳市南山区 |
| 5 | 孙七 | 男 | 40 | 13500000000 | 杭州市西湖区 |
| 6 | 周八 | 女 | 27 | 13400000000 | 成都市武侯区 |
| 7 | 吴九 | 男 | 30 | 13300000000 | 武汉市江汉区 |
| 8 | 郑十 | 女 | 25 | 13200000000 | 重庆市渝中区 |
| 9 | 王十一 | 男 | 32 | 13100000000 | 西安市雁塔区 |
| 10 | 赵十二 | 女 | 29 | 13000000000 | 南京市鼓楼区 |
+---------+-----------+-------------+----------+--------------+----------------+
10 rows in set (0.00 sec)
执行顺序
注意执行顺序与编写顺序的区别,图一是编写顺序,图二是执行顺序。


所以这里就会有一个问题,SELECT中的字段别名,只有在执行顺序在SELECT之后语句的才能使用,否则会报错。
-
DCL
介绍
数据控制语言,用于管路数据库用户、控制数据库的访问权限。
用户管理
-
查询用户
use mysql;
select *from user ;
-
创建用户
CREATE USER '用户名 '@'localhost' identified by '密码' ;
CREATE USER '用户名'@'%' identified by '密码' ;
前者localhost只允许该用户从本主机访问,%允许创建的用户远程访问。
-
修改用户
ALTER USER '用户名'@‘主机名’ identified with mysql_native_password BY '密码';
-
删除用户
DROP USER '用户名'@‘主机名’;
注意:
- 主机名可以使用%符通配
- DCL的操作比较少,主要是DBA(数据库管理人员)使用
权限控制
常用权限:
可以参考官方文档MySQL提供的权限。
- 查询权限
SHOW GRANTS FOR '用户名'@‘主机名’;
- 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@‘主机名’;
- 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@‘主机名’;
总结
本文主要简单了解了一下数据库的相关概念,以及如何使用SQL语言对数据库管理语言进行操作,当然现在有许多图形化的SQL语言工具(DataGrip),习惯图形界面的可以使用。相关的命令一定要多联系,至于用于练习的数据库表单可以使用大模型生成。