数据库的概念和术语
按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合
抓住 长期存储 + 方便管理大量数据 (支持并发访问) 相比磁盘更加快速
数据库:数据库是一些关联表的集合;
数据表:表是数据的矩阵;
列:一列包含相同类型的数据;
行:或者称为记录是一组相关的数据;
主键:主键是唯一的;一个数据表只能包含一个主键; (primary key 非空去重唯一性)
外键:外键用来关联两个表,来保证参照完整性;MyISAM存储引擎本身并不支持外键,只起到注 释作用;而innodb完整支持外键; (foreign key 存储在从表, 从表和主表的关系列,关联列)
复合键:或称组合键;将多个列(字段) 指定为一个索引键;
索引:用于快速访问数据表的数据;索引是对表中的一列或者多列的值进行排序的一种结构; (抓住. 索引是为了方便排序的一列或多列数据)
SQL语言和组成
用于存取数据以及查询、更新和管理关系数据库系统。SQL是关系数据 库系统的标准语言
抓住一点, SQL就是用来操作数据库的一门语言就OK,关系型数据库标准语言
SQL 命令包含: DQL、DML、DDL、DCL以及TCL 本文仅介绍实操部分
DDL
Data Define Languge - 数据定义语言, 用于定义 数据库,数据表
show : 展示当前已有的数据库或者表
show databases; 显示所有数据库
show databases; # 显示所有数据库 +--------------------+ | Database | +--------------------+ | information_schema | | hello | | mysql | | performance_schema | | sys | | test | | xiaojie | +--------------------+ 7 rows in set (0.00 sec)
- show tables; 显示当前选择数据库的所有数据表
use tangyujie; Database changed show tables; Empty set (0.00 sec)
- use 数据库名称; 指定选择一个数据库, 选择具体的数据库操作
use test; # 指定选择一个数据库 Database changed
- create :创建一个数据库或者一个表
- create database 数据库名; 不安全的创建一个数据库 (如果表已经存在会报错)
- 加 if not exists 检测, 如果数据库已存在就不创建,否则创建 (不会报错, 只是提示)
create database if not exists tangyujie; # 创建tangyujie数据库如果不存在 Query OK, 1 row affected (0.00 sec) show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hello | | mysql | | performance_schema | | sys | | tangyujie | | test | | xiaojie | +--------------------+ 8 rows in set (0.00 sec)
- create table 表名; 不安全的创建一个表 (如果表已经存在会报错)
- 加 if not exists 检测, 如果数据表已存在就不创建,否则创建 (不会报错, 只是提示)
create table if not exists STU ( id int, name varchar(10), age tinyint ) engine = innodb default charset = utf8mb4; show tables; +---------------------+ | Tables_in_tangyujie | +---------------------+ | stu | +---------------------+ 1 row in set (0.00 sec)
- drop :删除表、数据库对象或者视图
- drop table 表名; 不安全的删除一个表 (如果表不存在会报错)
- 加上if exists 检测, 如果表不存在不会报错 (会提示waring)
drop table stu; Query OK, 0 rows affected (0.01 sec) show tables; Empty set (0.00 sec) drop table if exists stu; Query OK, 0 rows affected, 1 warning (0.00 sec)
- drop database 数据库名; 不安全的删除一个库 (如果库不存在会报错)
- 加上if exists 检测, 如果表不存在不会报错 (会提示waring)
- 注意:删库跑路不是吹出来的,不要轻易使用drop
drop database tangyujie; Query OK, 0 rows affected (0.01 sec) show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hello | | mysql | | performance_schema | | sys | | test | | xiaojie | +--------------------+ 7 rows in set (0.00 sec)
- alter :修改现有的数据库对象,例如 修改表的属性或者字段 (列)
- desc 数据表名; 展示数据表的表结构
desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
- alter table 指定表名 add 新列名 列类型(类型长度); 添加一列字段\
- 新增一列grade varchar(5); 等级列, 成绩等级
alter table stu add grade varchar(5); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | grade | varchar(5) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
- alter table 指定表名 modify 指定列名(字段) 新的类型(新的长度) -- 修改类型
- 将 grade 改为 int 类型的 成绩
alter table stu modify grade int(11); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | grade | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
- alter table 指定表名 change 旧的列名 新的列名 新类型(类型长度) --修改列名+类型
- 将 grade 列改成 addr 列 类型改成 varchar(10);
alter table stu change grade addr varchar(10); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | | addr | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
- alter table 指定表名 drop 指定列名; -- 将指定列删除
alter table stu drop addr; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 desc stu; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(10) | YES | | NULL | | | age | tinyint(4) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
DML
- Data Manipulate Language - 数据操作语言 (记录的增删改查)
- insert :插入记录
- insert into 指定表(指定列) values(指定值);
- 指定插入一条记录 id 1001 name = 孙悟空 age = 100
insert into stu(id, name, age) values(1001, '孙悟空', 100); Query OK, 1 row affected (0.01 sec) select * from stu; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | +------+-----------+------+ 1 row in set (0.00 sec)
- values 赋值顺序需要和指定列顺序保持一致
insert into stu(name, id, age) values('沙和尚', 1002, 100); Query OK, 1 row affected (0.00 sec) select * from stu; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | +------+-----------+------+ 2 rows in set (0.00 sec)
- 不指定列, 默认按照所有列顺序插入 values
insert into stu values(1003, '白龙马', 100); Query OK, 1 row affected (0.00 sec) select * from stu; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | | 1003 | 白龙马 | 100 | +------+-----------+------+ 3 rows in set (0.00 sec)
- update :更新记录
- update 表名 set 字段1 = 值1 字段2 = 值2 where 条件指定记录;
- 指定设置 id = 1003的 记录 name = 猪八戒 (跟新记录)
update stu set name = '猪八戒' where id = 1003; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 select * from stu; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | | 1003 | 猪八戒 | 100 | +------+-----------+------+ 3 rows in set (0.00 sec)
delete :删除记录 delete from 表名 where 条件指定记录; 指定删除id = 1003的记录
DQL
Data Query Language - 数据查询语言 select :从一个或者多个表中检索特定的记录 数据准备
select * from stu; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | | 1003 | 猪八戒 | 100 | | 1004 | 白龙马 | 100 | | 1006 | 哪吒 | 88 | | 1004 | 观音 | 99 | | 1009 | 白骨精 | 78 | +------+-----------+------+ 7 rows in set (0.00 sec)
- select 指定列查询
- select 指定列1, 指定列2, 指定列3... from 表名;
- 指定查询 stu 表中的name + age 列信息
select name, age from stu; +-----------+------+ | name | age | +-----------+------+ | 孙悟空 | 100 | | 沙和尚 | 100 | | 猪八戒 | 100 | | 白龙马 | 100 | | 哪吒 | 88 | | 观音 | 99 | | 白骨精 | 78 | +-----------+------+ 7 rows in set (0.00 sec)
- select 条件查询
- select * from 表名 where 条件指定查询记录
- 条件指定查询 id = 1003的记录
select * from stu where id = 1003; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1003 | 猪八戒 | 100 | +------+-----------+------+ 1 row in set (0.00 sec)
- select 去重查询
- select distinct 指定去重列 from 表名;
- 按照id号进行去重查询
select id from stu; +------+ | id | +------+ | 1001 | | 1002 | | 1003 | | 1004 | | 1006 | | 1004 | | 1009 | +------+ 7 rows in set (0.00 sec) select distinct id from stu; +------+ | id | +------+ | 1001 | | 1002 | | 1003 | | 1004 | | 1006 | | 1009 | +------+ 6 rows in set (0.00 sec)
select 排序查询 (查询后排序)
select * from stu order by 指定列1 排序规则, 指定列2 排序规则;
排序规则:默认升序, asc 指定升序 desc 指定降序
先按照 id 升序排序, id 相同再按照 age 降序排序
select * from stu order by id asc, age desc; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | | 1003 | 猪八戒 | 100 | | 1004 | 白龙马 | 100 | | 1004 | 观音 | 99 | | 1006 | 哪吒 | 88 | | 1009 | 白骨精 | 78 | +------+-----------+------+ 7 rows in set (0.00 sec)
- select 起别名
- select 指定列1 别名, 指定列2 别名... from stu;
- 将 age 取个别名为年龄
select age '年龄', name from stu; +--------+-----------+ | 年龄 | name | +--------+-----------+ | 100 | 孙悟空 | | 100 | 沙和尚 | | 100 | 猪八戒 | | 100 | 白龙马 | | 88 | 哪吒 | | 99 | 观音 | | 78 | 白骨精 | +--------+-----------+ 7 rows in set (0.00 sec)
- select 聚合函数分组查询
- select 聚合函数名(指定列) from 表名; 指定对于表每一列进行聚合函数
- 查询一下表中所有的 age 和 age 最大 最小值
select sum(age) from stu; +----------+ | sum(age) | +----------+ | 665 | +----------+ 1 row in set (0.00 sec) select min(age) from stu; +----------+ | min(age) | +----------+ | 78 | +----------+ 1 row in set (0.00 sec) select max(age) from stu; +----------+ | max(age) | +----------+ | 100 | +----------+ 1 row in set (0.00 sec)
select 指定分组字段 聚合函数(指定字段) from 表名 group by 指定分组字段
注意:分组也就意味着去重,一旦分组之后, 就会按照分组列进行去重,
一旦去重之后意味着什么? 我们跟随着去重列一同显示出来的其他列也必须是聚合在一起的
上述这句话必须理解清楚,你想想,分组前是很多行,分组之后进行了去重,记录需要从多条记录压缩成一条记录,也就意味着,我们需要聚合多条记录.
依照age 进行 分组, 将多条记录聚合压缩成分组记录, 名字同组的联在一起,并且统计同组人数
select age, count(*), group_concat(`name`) from stu group by age; +------+----------+-----------------------------------------+ | age | count(*) | group_concat(`name`) | +------+----------+-----------------------------------------+ | 78 | 1 | 白骨精 | | 88 | 1 | 哪吒 | | 99 | 1 | 观音 | | 100 | 4 | 孙悟空,沙和尚,猪八戒,白龙马 | +------+----------+-----------------------------------------+ 4 rows in set (0.00 sec)
- select 分页查询
何为分页 limit n, m; 从 n 条记录开始显示m条记录
- select * from limit 起始记录数, 每页的记录数
- 起始记录数目如何计算, 是每一页的记录数的整数倍
- eg: 查看第一页的记录,和查看第二页的记录 (每页记录数为3)
select * from stu limit 0,3; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1001 | 孙悟空 | 100 | | 1002 | 沙和尚 | 100 | | 1003 | 猪八戒 | 100 | +------+-----------+------+ 3 rows in set (0.00 sec) select * from stu limit 3,3; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1004 | 白龙马 | 100 | | 1006 | 哪吒 | 88 | | 1004 | 观音 | 99 | +------+-----------+------+ 3 rows in set (0.00 sec) select * from stu limit 6,3; +------+-----------+------+ | id | name | age | +------+-----------+------+ | 1009 | 白骨精 | 78 | +------+-----------+------+ 1 row in set (0.00 sec)
如上分别是查看第一页 第二页,第三页的 记录