????????链接: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 <table1> A?
?? ?union?
?? ?(select B.field3 as f1, field4 as f2 from <table2> B)
?? ?order by 字段 desc/asc
?? ?注意:
?? ?1列名不一致时,会以第一张表的表头为准,并对其栏目。
?? ?2会将重复的行过滤掉。
?? ?3如果查询的表的列数量不相等时,会报错。
?? ?4在每个子句中的排序是没有意义的,mysql在进行合并的时候会忽略掉。
?? ?5如果子句中的排序和limit进行结合是有意义的。
?? ?6可以对合并后的整表进行排序
UNION ALL(表的并集,不过滤重复值)
?? ?语法:
?? ?select A.field1 as f1, A.field2 as f2 from <table1> A?
?? ?union all
?? ?(select B.field3 as f1, field4 as f2 from <table2> B)
?? ?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
?