链接:MySQL :: MySQL Community Downloads
长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库”
开源免费,小巧但功能齐全
可在Windows和Linux系统上运行
操作方便,适用于中小型甚至大型网站应用
1. 查看数据库
show databases;
2. 创建数据库
create database 数据库名;
3. 删除数据库(危险操作)
drop database 数据库名;
4. 使用数据库
use 数据库名;
CREATE TABLE 表名 (
字段名1 字段类型 [ 属性 ] [ 索引 ] [注释] ,
字段名2 字段类型 [ 属性 ] [ 索引 ] [注释] ,
… …
字段名n 字段类型 [ 属性 ] [ 索引 ] [注释]
) [ 表类型 ] [ 表字符集 ] ;
[ ] 包含的内容可以省略;
char(M):
固定长字符串,检索快但费空间, 0 <= M <= 255
varchar(M):
可变字符串0 <= M <= 65535
tinyint【taɪni】:
非常小的数据 有符值: -2 ^7 ~ 2^7-1,无符号值:0 ~ 28-1 1字节
int :
标准整数 有符值: -2^31 ~ 2^31-1,无符号值:0 ~ 2^32-1 4字节
bigint:
较大的整数 有符值: -2^63 ~2^63-1,无符号值:0 ~2^64-1 8字节
Decimal(钱)【desɪml】:
字符串形式的浮点数 decimal(m, d)
DATETIME:
YY-MM-DD hh:mm:ss 1000-01-01 00:00:00 至9999-12-31 23:59:59
一、什么是范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就叫做范式。
二、约束作用
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
三、三范式
第一范式:确保每列保持原子性
第二范式:确保表中的每列都和主键相关
第三范式:确保每列都和主键列直接相关,而不是间接相关约束
增加数据(INSERT语句)
INSERT INTO `表名` [(`字段1`,`字段2`,...`字段n`)] VALUES/VALUE ('值1','值2',...'值n')[,('值1','值2',...'值n')...];
增加数据(INSERT INTO SELECT )
INSERT INTO table2(column_name,...)SELECT column_name,...FROM table1;
修改数据(UPDATE语句)
UPDATE 表名 SET `字段名1` = '值1' [ , `字段名2` = '值2', …. ] [ WHERE 条件];
删除数据(DELETE语句)
DELETE FROM 表名 [ WHERE 条件];
删除数据(TRUNCATE语句)
TRUNCATE [TABLE] 表名
功能:清空某一张表内的全部数据,重置自增计数器;
特点:由于没有条件约束,所以速度快,而且效率高。
查询语句语法规则
SELECT [DISTINCT]
{*|表1.*|[ 表1.字段1 [as 字段别名1]
[, 表1.字段2[as 字段别名2]][, …]]}
FROM 表1 [ as 表别名 ]
[ left|right|inner join 表2 on 表之间的关系 ]
[ WHERE ]
[ GROUP BY ]
[ HAVING]
[ ORDER BY]
[ LIMIT {[ 位置偏移量,] 行数 }] ;
GROUP BY分组
对所有的数据进行分组统计;
分组的依据字段可以有多个,并依次分组。
HAVING
与GROUP BY结合使用,进行分组后的数据筛选
ORDER BY排序
SELECT * FROM 表名 ORDER BY 字段名 [DESC|ASC]
LIMIT关键字(分页)
SELECT * FROM 表名 LIMIT [n , m ] (n表示当前页页码,m表示当前页步长及显示数据条数)
MySql8新关键词OFFSET
SELECT * FROM 表名 limit m offset n
n 表示第一条记录的偏移量,m 表示显示记录的数量;
表别名和字段别名 (AS可省略)
SELECT 表别名.字段名1 AS 字段别名1, 表别名.字段名2 AS 字段别名2 FROM 表名 AS 表别名
DISTINCT(去重,当所有列的值都相等时)
SELECT DISTINCT 字段名1, 字段名2... FROM 表名
WHERE条件子句
SELECT * FROM 表名 [ WHERE 条件];
LIKE 关键字
SELECT * FROM 表名 WHERE 字段 LIKE 条件;
IN 关键字
SELECT * FROM 表名 WHERE 字段 IN (值1,值2...);
NULL 值查询
SELECT * FROM 表名 WHERE 字段 IS NULL
SELECT * FROM 表名 WHERE 字段 IS NOT NULL
函数名 返回值
AVG(col) 返回指定列的平均值
COUNT(col) 返回指定列中非NULL值的个数
MIN(col) 返回指定列的最小值
MAX(col) 返回指定列的最大值
SUM(col) 返回指定列的所有值之和
多表联查
非等值查询:SELECT * FROM 表1,表2
等值查询:SELECT * FROM 表1,表2 WHERE 表1.字段1 = 表2.字段2...
连接查询
SELECT * FROM 表1 LEFT|right|INNER JOIN 表2 ON 条件
LEFT JOIN:从左表(表1)中返回所有的记录,即便在右(表2)中没有匹配的行。
RIGHT JOIN:从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行
INNER JOIN:在表中至少一个匹配时,则返回记录。
UNION(两个查询的并集)
语法:
select A.field1 as f1, A.field2 as f2 from
union
(select B.field3 as f1, field4 as f2 from
order by 字段 desc/asc
注意:
1列名不一致时,会以第一张表的表头为准,并对其栏目。
2会将重复的行过滤掉。
3如果查询的表的列数量不相等时,会报错。
4在每个子句中的排序是没有意义的,mysql在进行合并的时候会忽略掉。
5如果子句中的排序和limit进行结合是有意义的。
6可以对合并后的整表进行排序
UNION ALL(表的并集,不过滤重复值)
语法:
select A.field1 as f1, A.field2 as f2 from
union all
(select B.field3 as f1, field4 as f2 from
order by 字段 desc/asc
子查询
where 子查询
-- 查询id最大的一个学生(使用where子查询实现)
select * from student where sid = (select max(sid) from student)
-- 查询每个班下id最大的学生(使用where子查询实现)
select * from student where sid in (
select max(sid) from student group by classid
)
-- 子查询(where 子查询)学过张三老师课程的学生
select * from student where sid in(
select sid from sc where cid = (
select cid from course where tid=(
select tid from teacher where tname ='张三'
)
)
)
-- 没学过张三老师课程的学生信息
select * from student where sid not in(
select sid from sc where cid = (
select cid from course where tid=(
select tid from teacher where tname ='张三'
)
)
)
from 子查询
-- 查询大于5人的班级名称和人数(不使用子查询)
select classname,count(sid) from class
left join student on class.classid = student.classid
group by classname having count(sid) > 5
-- 查询大于5人的班级名称和人数(使用from型子查询)
select classname,c from class
left join (select classid,count(sid) c from student
group by classid) t
on class.classid = t.classid
where c > 5
exists 子查询
-- 学生表中有性别为外星人的同学就查询出所有的老师
select * from teacher
where exists (select * from student where ssex = '外星人')
any, some子查询:
表示满足其中任意一个条件
假设any内部的查询语句返回的结果个数是三个,
如:result1,result2,result3,那么,
select ...from ... where a > any(...);
->相当于:
select ...from ... where a > result1 or a > result2 or a > result3;
some 是 any的别名,所以用法是一样的,可以替代使用
all 子查询
假设any内部的查询语句返回的结果个数是三个,
select ...from ... where a > all(...);
->
select ...from ... where a > result1 and a > result2 and a > result3;
流程控制函数,语句
函数 语句
IF(value,value1,value2) 如果value 的值为TRUR 返回value1,否则返回value2
IFNULL(value,value1,value2) 如果value 的值不为NULL 返回value1,否则返回value2
case when then end语句
(1)简单Case函数
select stuid,stuname,
case stusex
WHEN 1 THEN '男'
WHEN 0 THEN '女'
ELSE '其他'
end ,
stuaddress from student;
(2) Case搜索函数
select stuid,stuname,
case
WHEN stusex = 1 THEN '男'
WHEN stusex = 0 THEN '女'
ELSE '其它'
END,
stuaddress from student