MySQL的基础概念
数据库DB:由构成信息的数据组成的存储。
数据库管理系统DBMS:由数据库、存储和管理数据库中数据的软件,以及显示数据并使用户能够与数据库系统进行交互的应用程序组成。即由数据库及其管理的软件组成的系统。
数据库管理员DBA:使用DBMS来管理数据的专业人员,即系统用户。
SQL结构化查询语言的组成:
数据定义语言DDL:定义和管理数据对象,如数据库、表等
数据操作语言DML,操作数据库对象中包含的数据
数据查询语言DQL,查询数据库
数据控制语言DCL,管理数据库,包括管理权限和数据更改
数据库的类型:
纯文本数据/XML【适用于小型应用,对于大型应用存在限制,只能顺序访问,不能随机访问,查找数据和数据关系或多用户同时访问进行写操作时困难】
关系型数据库:把复杂的数据结构归结为简单的二元关系。对数据的操作几乎全部建立在一个或多个关系表格上,通过对这些关系的表格分类、合并、连接或选取等运算来实现对数据库的管理。
非关系型数据库:不仅仅是”SQL“,适用于超大规模和高并发。
MySQL: 运行速度快、成本低、可移植性低、适用用户光
存储引擎: 存储引擎是处理不同类型SQL操作组件。InnoDB是默认的,最通用的存储引擎。MySQL8支持的引擎:InnoDB, MyISAM, Memory, CSV, Archive, Blackhole等
查看所支持的引擎。show engines;查看数据库默认使用的引擎show variables like '%storage_engine%';
MySQL的基础概念
MySQL命令详解
1.常用命令:
use dbname; | 选定默认数据库 |
drop database dbname; | 直接删除数据库,不提醒 |
show databases; | 显示所有数据库 |
show tables; | 显示默认数据库中所有 的表 |
describe tablename; | 查看表的结构 |
select version(), current_date; | 显示mysql版本和当前日期 |
\c | 放弃正在输入的命令 |
\h | 显示命令清单 |
\q | 退出mysql |
\s | 查看mysql服务器状态信息 |
2. MySQL中的数据类型:
类型 | 说明 | 取值范围 | 存储需求 |
TINYINT | 非常小的数据 | 有符号值:-2^7~2^7-1 无符号值:0~2^8-1 | 1字节 |
SMALLINT | 较小的数据 | 有符号值:-2^15~2^15-1 无符号值:0~2^16-1 | 2字节 |
MEDIUMINT | 中等大小的数据 | 有符号值:-2^23~2^23-1 无符号值:0~2^24-1 | 3字节 |
INT | 标准整数 | 有符号值:-2^31~2^31-1 无符号值:0~2^32-1 | 4字节 |
BIGINT | 较大的整数 | 有符号值:-2^63~2^63-1 无符号值:0~2^64-1 | 8字节 |
FLOAT | 单精度浮点数 | +1.1754351e-38 -1.1754351e-38 | 4字节 |
DOUBLE | 双精度浮点数 | +22250738585072014e-308 -22250738585072014e-308 | 8字节 |
DECIMAL | 字符串形式的浮点数 | Decimal(M, D) | M+2字节 |
UNSIGNED属性:标识为无符号数
ZEROFILL属性:宽度位数不足以0填充
CHAR[(M)] | 定长字符串 | M字节 |
VARCHAR[(M)] | 可变字符串 | 可变长度 |
TINYTEXT | 微型文本串 | 0~2^8-1字节 |
TEXT | 文本串 | 0~2^16-1字节 |
DATE | YYYY-MM-DD日期格式 | 1000-01-01~9999-12-31 |
DATETIME | YY-MM-DD hh:mm:ss | 1000-01-01 00:00:00 --- 9999-12-31 23: 59:59 |
TIME | hh:mm:ss | -835:59:59 _ 838:59:59 |
TIMESTAMP | YYYYMMDDHHMMSS | 1970年某刻~2038年某刻,精度为1秒 |
YEAR | YYYY | 1901~2155 |
3. 创建表:
create table if not exists '数据库名' ( '字段1' int(4) primary key, '字段2' char(20), .....);
4 关系结构:
关系模型围绕一个简单自然的结构而建立。一个关系实际上是一个没有重复行的表格。
完整性约束:保证数据库中数据的完整性。
创建表:保证数据的完整性=实施完整性约束
4种完整性约束:域完整性、实体完整性、自定义完整性、引用完整性
约束条件 | 说明 | 完整性约束 |
primary key | 主键,一行数据的唯一标识 | 实体完整性 |
foreign key | 外键,关联另外一张表的主键 | 引用完整性 |
not null | 非空约束,字段不允许为空 | 域完整性 |
unique | 唯一约束,设置字段的值必须是唯一的,允许为空,但只能有一个空值 | 域完整性 |
auto_increment | 自增列,一般做主键 | 实体完整性 |
default | 赋予某字段默认值 | 域完整性 |
check | 检查约束,用户自定义约束条件 | 域完整性 |
5. 主键:
create table 表名( 字段名 数据类型 primary key, ...);
6. 注释
create table 表名 ( 字段名 数据类型 COMMENT ‘字段xxx’)COMMENT='测试表';l
7.设置字符集编码
create table 表名() CHARSET=字符集名;
8.查看表结构:
DESCRIBE 表名;
9.删除表:
drop table if exists 表名;
10.修改表:
修改表名:alter table 表1 rename 表2;添加字段alter table 表1 add 字段名 数据类型...;修改字段alter table 表1 change 字段1名 字段2 数据类型...;删除字段alter table 表1 drop 字段;
11. 添加主键:
第一种方式:create table 表名( 字段1 数据类型 primary key,);第二种方式:create table 表名( 字段1 数据类型, ... primary key(字段1名));第3种方式:alter table 表名 add constraint 自定义约束名 primary key 表名(字段名);
12. 添加外键:
alter table 表名 add constraint 自定义外键名 foreign key (外键字段) references 关联表名(关联字段);
外键的值可以为null,
外键字段去引用一张表的某个字段的时候,被引用的字段必须具有unique约束,有了外键引用之后,表分为父表和子表。创建时先创建父表、删除时先删除子表数据、插入时先插入父表数据。
13. MySQL系统帮助:
HELP 查询内容;例如: help contents、help `data types`;
14.插入数据:
单条:insert into 表名 [(字段1,字段2,.....)] values(值1, 值2,.....);多条:insert into 表名 [(字段1,字段2,.....)] values(值1, 值2,.....),(值1, 值2,.....),(值1, 值2,.....);多条:create table if nott exists 表1 ( select 字段名,...from 表2);
15. 更新数据:
update 表名 sett 字段1=值1,字段2=值2,..... [where 条件];
16. 删除数据:
delete from 表名 [where 条件];# 清空表中的所有数据,自增计数归0truncate table 表名;
17. 运算符和布尔运算符
= | 等于 |
<> or != | 不等于 |
> or >= | 大于/大于等于 |
< or <= | 小于/小于等于 |
not | 逻辑非 |
and | 逻辑与 |
or | 逻辑或 |
18.操作符:like between-and is null
通配符:%
19. 查询:
简单查询:select 列名|表达式|函数|常量 from 表名 [where 查询条件表达式] [order by 排序的列名 ASC or DESC];
查询产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正存储,每次执行查询只是从数据库中提取数据,并按照表的形式显示出来。
20.聚合函数:
AVG() | 某字段的平均值 |
COUNT() | 某字段的行数 |
MAX() | 某字段的最大值 |
MIN() | 某字段的最小值 |
SUM() | 某字段的和 |
eg:select avg(StuId) as 平均值 from Students;
聚合函数旁边写普通列的时候,必须在后面进行group by 分组。
20.常用的字符串函数:
CONCAT(str1,str1....strn) | 字符串连接 | SELECT CONCAT('Y', 'l') |
INSERT(str, pos, len, newstr) | 字符串替换 | SELECT INSERT('aaaa', 1, 2,'Yl') |
LOWER(str) | 转换为小写 | SELECT LOWER('YINLEI') |
UPPER(str) | 转换为大写 | SELECTT UPPER('yinlei') |
SUBSTRING(str, num, len) | 字符串截取 | SELECT SUBSTRING('啊啊啊 ', 1, 2) |
21.常用的时间日期函数:
CURDATE() | 获取当日期 |
CURTIME() | 获取当前时间 |
NOW() | 获取当前日期和时间 |
WEEK(date) | 返回日期date为一年中的第几周 |
YEAR(date) | 返回日期date的年份 |
HOUR(time) | 返回时间time的小时值 |
MINUTE(time) | 返回时间time的分钟值 |
DATEDIFF(date1, date2) | 返回日期参数date1、date2之间相隔的天数 |
ADDDATE(date, n) | 计算日期参数date加上n天后的日期 |
22. 常用的数学函数:
CELL(x) | 返回大于或等于数值x的最小整数 |
FLOOR(x) | 返回小于或等于数值x的最大整数 |
RAND() | 返回0~1之间的随机数 |
23. LIMIT子句:
SELECT 字段名列表FROM 表名或视图[WHERE 查询条件][GROUP BY 分组的字段名][ORDER BY 排序的列名 ASC 或 DESC][LIMIT 位置偏移量,【行数】]
24. 子查询:
e.g: 查询与学生”尹磊“的密码相同的同学信息:方式1:select LoginPwd from StuInfo where StuName = '尹磊';# 密码123select * from StuInfo where LoginPwd = '123';方式2:子查询:select * from StuInfowhere LoginPwd = (select LoginPwd from StuInfo where StuName = '尹磊');
25. Exists子查询:
子查询有返回结果:Exists子查询结果为TRUE
无返回结果那么查询结果为FALSE,且外层查询将不执行
26. 分组查询:
SELECT 列名列表 FROM 表名WHERE 条件GROUP BY 列1,列2.....列nHAVING 分组条件
27. 多表连接查询:
内连接 inner join ... on
左外连接 left join ... on / left outer join on
右外连接right join ... on / right outer join on
全连接 union / union all
注:需要从多个表中选择或比较数据项的情况,就需要使用到多表连接查询。
多表连接查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征。
内连接【交集】:使用比较运算符根据每个表的通用列中的值匹配2个表中的行
SELECT ..FROM 表1INNER JOIN 表2ON ...等价于SELECT .... FROM 表1, 表2 WHERE ...
左外连接:
SELECT ..FROM 左表LEFT JOIN 右表ON ...
左表的记录将会全部显示出来,右表只会显示符合搜素条件的记录,右表不足的地方均为NULL
右外连接:
SELECT ..FROM 右表RIGHT JOIN 左表ON ...
和左外连接相反。
全连接/联合:
SELECT 列1, 列2 .... from 表1 UNION/ UNION ALL SELECT 列1, 列2 .... from 表2
通过union连接的语句,分别取出的列数必须相同。如果不要求合并的列名相同,则以第一条语句中的列名为准,使用union时,单个句子不用写order by ,因为不会有排序效果。但可以对最终的结果集进行排序。
完了?下一篇文章将讲述SQL的优化:如B树与索引、行锁等
再会。