总目录:https://blog.csdn.net/qq_41106844/article/details/105553392
数据库子目录:https://blog.csdn.net/qq_41106844/article/details/105553331
Yuan先生的数据库基础:https://www.cnblogs.com/yuanchenqi/articles/6357507.html
登录
mysql -u用户名 -p
password:密码
数据库操作(DDL)
创建数据库
语法
create database [if not exists] db_name [default character set] [default collate]
create database语句创建指定的数据库
如果数据库已经存在并且没有声明if not exists程序就会报错,声明了if not exists则会取消创建该数据库,继续执行下面的语句。
db_name设置数据库名
default character set设置数据库的默认编码
default collate设置数据库的默认排序规则
查看数据库
语法
show databases; 查看所有数据库
show create database db_name; 查看数据库的创建方式
修改数据库
语法
alter database db_name [default character set] [default collate]
数据库更名操作 建议使用可视化工具。
删除数据库
语法
drop database [if exists] db_name;
从删库到跑路。
进入/切换数据库
语法
use db_name;
查看当前数据库
语法
select database();
这个方法也可以在刚登入时用来查看所有数据库。
mysql数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
下面的表显示了需要的每个整数类型的存储和范围。
日期/时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
字符类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
数据表操作
基础操作
创建表
语法
CREATE TABLE <表名> ([表定义选项])[表选项][分区选项];
约束:
primary key (非空且唯一) :能够唯一区分出当前记录的字段称为主键!
unique:唯一索引
not null:非空
auto_increment 主键字段必须是数字类型。
外键约束 foreign key
查看表信息
desc tab_name 查看表结构
show columns from tab_name 查看表结构
show tables 查看当前数据库中的所有的表
show createtable tab_name 查看当前数据库表建表语句
修改表结构
增加字段
语法
alter table tab_name add[column] 列名 类型[完整性约束条件][first|after 字段名];
增加多个字段
修改列名
语法
alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名];
将addr2改成addr3
删除一列
语法
alter table tab_name drop [column] 列名;
删除掉employee中的addr列。
修改表名
语法
rename table 表名 to 新表名;
修改数据集
语法
alter table 表名 character set XX;
删除表
语法
drop table tab_name;
添加/删除主键
语法
alter table tab_name add primary key(字段名称,...)
alter table tab_name drop primary key;
如何真正删除主键
alter table tab_name modify id int;
auto_increment没了,但这样写主键依然存在,所以还要加上下面这句
alter table tab_name drop primary key;
仅仅用这句也无法直接删除主键
表纪录操作
增
语法
insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
我们先建立一个学生表
然后第一种增加记录的方式。
也可以空一些字段
如果全字段追加,不需要有字段列表。
还可以一次追加多条记录。
还有set插入
删
语法
delete from tab_name [where ....]
删除id为7的记录。
如果不跟where语句则删除整张表中的数据。
delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop。
TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。
改
语法
update tab_name set field1=value1,field2=value2,......[where 语句]
我们把id为6的这一行的name改为王红。
同时age增加1。
单表查询
准备表与数据。
普通查询
语法
SELECT *|field1,filed2 ... FROM tab_name
WHERE 条件
GROUPBY field
HAVING 筛选
ORDERBY field
LIMIT 限制条数
查询表中所有学生的信息。
查询表中所有学生的姓名和对应的英语成绩。
过滤表中重复数据。
select 也可以使用表达式,并且可以使用: 字段 as 别名或者:字段 别名
在所有学生分数上加10分特长分显示。
统计每个学生的总分。
使用别名表示学生总分。
条件查询
查询姓名为XXX的学生成绩
查询英语成绩大于90分的同学
查询总分大于200分的所有同学
where字句中可以使用:比较运算符,通配符,逻辑运算符。
查询JS分数在 70-100之间的同学。
查询Django分数为75,76,77的同学。
查询所有姓王的学生成绩。
查询JS分>90,Django分>90的同学。
查找没有分配班级的学生的姓名
排序查询
Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
语法
select *|field1,field2... from tab_name order by field [Asc|Desc]
Asc 升序、Desc 降序,其中asc为默认值 。
ORDER BY 子句应位于SELECT语句的结尾。
对JS成绩排序后输出。
对总分排序按从高到低的顺序输出。
对姓王的学生年龄排序输出
分组查询
数据表建立
对购物表按类名分组后显示每一组商品的价格总和。
对购物表按类名分组后显示每一组商品价格总和超过150的商品。
having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
<2>使用where语句的地方都可以用having进行替换
<3>having中可以用聚合函数,where中就不行。
聚合函数
COUNT(列名):
统计一个班级共有多少学生?
统计JS成绩大于70的学生有多少个?
统计总分大于280的人数有多少?
注意:count(*)统计所有行; count(字段)不统计null值.
SUM(列名):
统计一个班级JS总成绩
统计一个班级各科分别的总成绩
统计一个班级各科的成绩总和
统计一个班级JS成绩平均分
AVG(列名):
求一个班级JS平均分
求一个班级总分平均分
MAX():
求班级最高分
MIN():
求班级最低分
where和having
Mysql在执行sql语句时的执行顺序:
from
where
select (as)
group by
having
order by
limit
limit子句用于限制查询结果返回的数量,常用于分页查询
select * from tab_name limit i,n
i:为查询结果的索引值(默认从0开始),当i=0时可省略i
n:为查询结果返回的数量# i与n之间使用英文逗号","隔开
正则表达式
查找以yu开头的name
查找以n结尾的name
查找带l的name
多表查询
创建表
连接查询
笛卡尔积查询
内连接
查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
外连接
左外连接
在内连接的基础上增加左边有右边没有的结果
右外连接
在内连接的基础上增加右边有左边没有的结果
全外连接
在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
右连接 UNION 左连接
复合条件连接查询
查询员工年龄大于等于25岁的部门
以内连接的方式查询employee和department表,并且以age字段的升序方式显示
子查询
子查询是将一个查询语句嵌套在另一个查询语句中。
内层查询语句的查询结果,可以为外层查询语句提供查询条件。
子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
还可以包含比较运算符:= 、 !=、> 、<等
带IN关键字的子查询
查询employee表,但dept_id必须在department表中出现过
带比较运算符的子查询
查询员工年龄大于等于25岁的部门
带EXISTS关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。Ture或False,当返回Ture时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
没有dept_id等于205的记录,返回为false,外层查询语句不进行查询,查询为空。
完整性约束之主键约束
<1> 一张表只能有一个主键
<2> 主键类型不一定非是整型
单字段主键
主键字段特点:非空且唯一
多字段联合主键
完整性约束之外键约束
环境:每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任
外键约束对子表的含义: 如果在父表中找不到候选键,则不允许在子表上进行insert/update
外键约束对父表的含义: 在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时父表的行为取决于在定义子表的外键时指定的on update/on delete子句
创建外键
子句语法
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
删除直接用drop。
ON语句
cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除
set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
Restrict方式
拒绝对父表进行删除更新操作
No action方式
在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作