原文链接:MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)_mysql有这一篇幅就够了-CSDN博客
一、概述
1、什么是数据库?
答:数据的仓库。
2、什么是SQL?
答;Structure Query Language(结构化查询语言)简称SQL,数据库管理系统通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。
3、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等?
答:都是一个软件,有两个主要功能:数据保存到文件或内存;接受命令,对文件进行操作。
4、SQL的分类?
答:(1)DDL:数据定义语言,操作数据库、表、列等,常用:CREATE、ALTER、DROP。
(2)DML:数据操作语言,操作数据库的表里的数据,常用:INSERT、UPDATE、DELETE。
(3)DCL:数据控制语言,操作访问权限和安全级别,常用语句:GRANT、DENY。
(4)DQL:数据查询语言,查询数据,常用:SELECT。
二、三大范式
1、第一范式(1NF):每列的值具有原子性,不可再分割;
2、第二范式(2NF):基于1NF,如果表是单主键,那么非主键列必须完全依赖主键;如果是复合主键,非主键列必须完全依赖主键。
3、第三范式(3NF):基于2NF,非主键列之间不能相关依赖。
三、数据类型
包含整型、浮点型、定点型、字符串型、时间和日期类型等。
1、整型
整型类型 | 字节数 |
TINYINT | 1 |
SMALLINT | 2 |
MEDIUMINT | 3 |
INT | 4 |
BIGINT | 8 |
2、浮点型
浮点型 | 字节数 |
FLOAT | 4 |
DOUBLE | 8 |
DECIMAL(M,D) | M+2 |
注意:DECIMAL(M,D):M表示输入数据的长度,D表示小数点后的长度,例如:DECIMAL(6,2)的数据6.5243,插入后显示为6.52。
3、字符串型
(1)char(M):字节数为M;例如:char(3):‘a’和‘abc’都占用3字节。
(2)varchar:存储可变长度字符串,字节数为实际数据长度+1。例如:varchar:‘a’占2字节,‘ab’占3字节。
存储大文本时的字符串类型:
数据类型 | 字节数 |
TINYTEXT | 8 |
TEXT | 16 |
MEDIUMTEXT | 24 |
LONGTEXT | 32 |
4、日期和时间
数据类型 | 字节数 |
YEAR | 1 |
DATE | 4 |
TIME | 3 |
DATETIME | 8 |
TIMESTAMP | 4 |
注意:
(1) YEAR表示方式:
用两位字符串表示:‘00’-‘99’,‘00’-‘69’代表2000——2069,'70'-'99'代表1970——1999。
两位数字表示:1-99,1-69代表2001-2069,70-99代表1970-1999。
‘0’表示2000,而0表示0000。
(2) TIME类型:3种格式。
‘D HH:MM:SS’:D表示日可取0—34之间的值, 插入数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插入数据库中的日期为59:30:50。
‘HH:MM:SS’或HHMMSS:输入’115454’或115454,插入数据库中的日期为11:54:54
COURRENT_TIME或NOW()输入当前系统时间。
(3) DATETIME类型: ’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’。
’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间。
YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期 和时间。
NOW来输入当前系统的日期和时间。
(4)TIMESTAMP类型:
使用CURRENT_TIMESTAMP输入系统当前日期和时间。
输入NULL或无任何输入时,输入当前系统日期和时间。
5、二进制类:常用BLOB存储二进制类型数据。
数据类型 | 字节数 |
TINYBLOB | 8 |
BLOB | 16 |
MEDIUMBLOB | 24 |
LONGBLOB | 32 |
四、数据库、数据表基本操作
1、数据库的基本操作
(1)创建:create database 数据库名;
(2)删除:drop database 数据库名;
(3)查看所有数据库:show databases;
(4)数据库字符集修改为gbk:alter database 数据库名 character set gbk;
(5)切换数据库:use 数据库名;
(6)查看当前使用的数据库:select database();
2、数据表基本操作
(1)创建表:
create table 表名(
字段1 字段类型,
字段2 字段类型,
…
字段n 字段类型
);
(2)查看所有数据表:show tables;
(3)查看表基本信息:show create table 表名;
(4)查看表的字段信息:desc 表名;
(5)修改表:
改表名:
alter table 表名 rename to 新表名;
改字段名:
alter table 表名 change 原字段名 新字段名 字段类型;
改字段类型:
alter table 表名 modify 字段名 新的字段类型;
增加字段:
alter table 表名 add 新字段 新字段的类型;
删除字段:
alter table 表名 drop 字段名;
(6)删除表:drop table 表名;
五、数据表约束
MySQL中定义了一些维护数据库完整性的规则,常称为表的约束,用来防止错误数据插入数据库。
1、主键约束(PRIMARY KEY)
primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。
设置主键的两种方式:
第一种:字段名 字段类型 primary key
create table student(
id int primary key,
name varchar(20)
);
第二种:primary key(字段名)
create table student(
id int,
name varchar(20),
primary key(id)
);
2、非空约束(NOT NULL)
字段不能是空值。
基本语法:字段名 数据类型 NOT NULL
create table student(
id int,
name varchar(20) not null
);
3、默认值约束(DEFAULT)
向表中插入新记录时,如果该字段没赋值,数据库会自动赋值。
基本语法:字段名 字段类型 DEFAULT 默认值。
create table student(
id int,
name varchar(20),
gender varchar(10) default 'male'
);
4、唯一性约束(UNIQUE)
表中字段的值不能重复出现。
基本语法:字段名 字段类型 UNIQUE。
create table student(
id int,
name varchar(20) unique
);
5、外键约束(FOREIGN KEY)
多张表之间的约束,可以保证数据的完整和统一性。
基本语法:
-- 在创建数据表时语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
-- 将创建数据表创号后语法如下:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
create table student(
id int primary key,
name varchar(20)
);
create table class(
classid int primary key,
studentid int
);
学生表作为主表,班级表作为副表设置外键:
alter table class add constraint fk_class_studentid foreign key(studentid) references student(id);
删除外键:alter table 副表名 drop foreign key 外键名。
alter table class drop foreign key fk_class_studentid;
注意:
(1)副表的外键通常是主表的主键,二者数据类型要一致;
(2)主表变化时,副表要和主表保持一致。
六、数据表操作
1、插入数据
使用Insert语句。
(1)为所有字段插入数据,字段和值的顺序、类型等要一一对应。
inset into 表名 (字段1,字段2,…,字段n) values (值1,值2,…,值3)。
insert into student (id,name,age,gender) values (1,'bob',18,'male');
(2)为指定字段插入数据
基本和为表中所有字段插入数据,一样,只是需要插入的字段由你自己指定.
insert into student (id,name) values (2,'jack');
(3)同时插入多条记录
insert into student (id,name,age,gender) values (值 1,值 2,…),(值 1,值 2,…),...;
insert into student (id,name,age,gender) values (2,'Lily',21,'female'),(3,'Lucy',19,'male')
2、更新数据
使用Update语句。
(1)更新部分数据。基本语法:update 表名 set 字段1=值1,…,字段i=值i where 条件表达式
将name为tom的记录的age改为20,gender改为female
update student set age=20,gender='female' where name='tom'
(2)更新全部数据。
例如:将所有记录的age设置为18。
update student set age=18
3、删除数据
使用delete语句。
基本语法:delete from 表名 where 条件表达式
删除部分数据:删除年龄18的记录。
delete from student where age=18
删除全部数据:删除表中所有记录。
delete from student
注意:delete和truncate的区别
1)delete可跟where条件表达式,删除部分数据,truncate只能删除全部记录。
2)delete是DML语句,truncate通常认为是DDL语句。
4、简单查询——不含where的select语句
(1)查询所有字段:select * from 表名。
(2)查询指定字段:select id,name from 表名。
(3)常数的查询:
SELECT中除了书写列名,还可以书写常数。可以用于标记:
select sid,sname,'2021-03-02' from student;
(4)查询结果过滤重复数据——使用distinct。
注意:select命令中distinct只能用在第一个所查列名之前。
select distinct gender from student
(5)算术运算符(加减乘除运算符)
select sname,age+10 from student;
5、条件查询
(1)使用关系运算符
关系运算符:
= —— 等于;<>或!= ——不等于;
< ——小于;<= ——小于等于;
> ——大于;>=——大于等于。
例如: select * from student where age>=18。
(2)使用in或not in关键字——判断某个字段的值是否在指定集合
select * from student where sid in ('S_1002','S_1003');
(3)使用between and——判断某个字段的值是否在指定的范围之内
select * from student where age between 15 and 18
(4)使用is null查询——判断字段的值是否为空值,空值不是0,不是空字符串。
select * from student where age is not null
(5)使用and、or ——连接多个查询条件
select * from student where name='tom' and age=18
(6)使用like——判断两个字符串是否相匹配
select * from student where name like 'tom'
注意:
1)%可以表示任意长度字符串。例如:“a%”——以字符a开始任意长度的字符串,“%g”——以g结尾的任意长度字符串。
2)_(下划线)表示任意一个字符。例如:“ab_”——“ab”开始长度为3的字符串,“a__b”——a开头b结尾的长度为4的字符串。
(7)使用ORDER BY——查询结果排序
基本语法:
SELECT 字段名1,字段名2,…
FROM 表名
ORDER BY 字段名1 ASC(DESC),字段名2 ASC(DESC);
select * from student order by age desc
ASC——升序;desc——降序
(8)使用LIMIT——限制查询结果的数量
select * from student order by age asc limit 3
(9)使用group by——原来的表拆分成了几张小表,在进行查询
统计部门编号大于1001的各部门员工个数:
select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;
group by和聚合函数以及having一起使用:
例如:统计工资总和大于8000的部门
select sum(salary),department from employee group by department having sum(salary) >8000
6、多表连接查询
(1)交叉连接查询/笛卡尔连接
使用CROSS JOIN语句
select * from 表1 CROSS JOIN 表2
交叉连接(笛卡尔积连接):例如,集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。
(2)内连接查询
又叫简单连接或自然连接,要求满足条件的连接记录才可以出现在结果中。
基本语法:INNER JOIN用于连接两个表,ON来指定连接条件;其中INNER可以省略。
select * from 表1 INNER JOIN 表2 ON 条件表达式
(3)外连接查询
基本语法:
SELECT * FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件
1)关键字左边的表被称为左表,关键字右边的表被称为右表;OUTER可以省略。
2) 在使用左(外)连接和右(外)连接查询时,查询结果是不一致的,具体如下:
左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录;
右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。
7、子查询
子查询是指一个查询语句嵌套在另一个查询语句内部的查询,执行时先执行子查询语句再将返回结果作为外层查询的过滤条件。子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。
(1)带比较运算符的子查询
例如:查询班级编号比张三所在班级还大的班级信息
select * from class where cid>(select classid from student where sname='张三')
(2)带EXISTS关键字的子查询
EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会执行。
例如:假如王五同学在学生表中则从班级表查询所有班级信息
select * from calss where exists (select * from student where sname='王五')
(3)带ANY关键字的子查询
ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。
例如:查询比任一学生所属班级号还大的班级编号的班级信息。
select * from class where cid > any (select classid from student)
(4)带ALL关键字的子查询
带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。
例如:查询比所有学生所属班级号还大的班级编号的班级信息
select * from class where cid > all (select classid from student)
七、使用函数
1、聚合函数
(1)count()——统计表中行数、或者列值不为null的数据个数
查询表中有多少记录
select count(*) from student
(2) max()、min()——指定列的最大值、最小值,如果是字符串,使用字符串排序运算
select max(age) from student
(3)sum()——指定列的数值和,非数值类型的列和为0。
select sum(age) from student
(4)avg()——指定列的平均值,非数值类型的列和为0。
select avg(字段名) from 表名。
2、其他常用函数
时间函数:
SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME('14:23:12','01:02:01');
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF('2019-07-22','2019-05-05');
字符串函数:
--连接函数
SELECT CONCAT ()
--
SELECT INSTR ();
--统计长度
SELECT LENGTH();
数学函数:
-- 绝对值
SELECT ABS(-136);
-- 向下取整
SELECT FLOOR(3.14);
-- 向上取整
SELECT CEILING(3.14);
八、查询时设置别名
1、给表设置别名:select * from student as stu;
2、给字段设置别名:select name as '姓名', id from student;
九、表的关联关系
1、数据表间存在着三种关系:
(1)多对一:部门和员工,一个部门有多个员工,一个员工在一个部门里。
(2)多对多:学生老师,一个老师有多个学生,一个学生有多个老师
(3)一对一。
2、关联查询
例如:一个学生表(姓名、学号、班级号),一个班级表(班级号、班级名),查询Java班的所有学生。
select * from student where classid=(select cid from class where cname='java')
3、关联关系的删除数据
班级表中删除Java班,要先删除学生表中与该班级有关的相关联学生。
删除关联学生
delect from student where classid=(select cid from class where cname='java')
删除Java班
delect from class where cname='java'
十、查询语句的总结
1、书写顺序:
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
2、执行顺序
from ===> where ===> group by ===> having ===> select ===> order by ===> limit