mysql数据库
定义:
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
RDBMS 即关系数据库管理系统(Relational Database Management System)
win+R CMD 打开命令行窗口
mysql -u root -ppwd(pwd 自定义密码)
mysql> show databases; --分号结束。sql语句就会发送给mysql服务器端执行
+--------------------+
| Database |
+--------------------+
| information_schema | --mysql元数据数据库。
| mysql | --mysql配置数据库。其中user表用于管理mysql用户和密码、权限信息。
| performance_schema | --mysql性能监控信息数据库。
| test | --测试数据库。
+--------------------+
数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型
- 数值
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT
- 日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
- 字符串类型
字符串类型指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 类型,可存储的最大长度不同,可根据实际情况选择。
- 数据类型属性
MySQL语句的分类:
DDL(data defination language)数据库定义语言
作用:创建 删除 修改 库表结构
DML(data manipulation language)数据操作语言
作用:增 删 改表的记录
DCL(data control lanuage)数据控制语言
作用:用户的创建以及授权
DQL(data query lanuage)数据查询语言
作用:查询数据
数据库操作
1、DDL
-
show databases; 显示所有数据库
-
create database 数据库名称; 创建数据库
-
use 数据库名称; 使用数据库
-
show tables; 查看表格
-
show create database 数据库名称;查看数据库创建细节,如字符编码等
-
select database(); 查看当前正在使用的数据库
-
drop database 数据库名; 删除数据库
-
create table 表名(字段名1 字段数据类型1,字段名2 字段数据类型2,…);创建表格
-
insert into 表名 values(数据1,数据2…);
-
select * from 表名; 查看表中所有记录
-
alter table 表名 add 字段名 字段类型; 在表格上增加字段
-
alter table 表名 modify 字段名 字段类型; 修改字段类型
-
alter table 表名 change 旧字段名 新字段名 新字段类型; 修改字段名
-
alter table 表名 drop 字段名; 删除字段
-
alter table 表名 character set 字符集名; 修改表的字符集
-
alter table 表名 charset=字符集名; 修改表的字符集
-
alter table 旧表名 rename to 新表名; 修改表名
-
rename table 旧表名 to新表名; 修改表名
-
drop table 表名; 删除表格
-
desc 表名; 查看表格结构
2、DML:数据操作语言 操作表格中的数据(insert、update、delete)
insert 插入:
格式:insert into 表名[字段1,字段2,字段3,…] values(值1,值2,值3,…);
-
方式一:字段名称全写
insert into 表名(字段1,字段2,字段3,…)values(值1,值2,值3,…);
注:字段与值必须一一对应 -
方式二:字段名称全部省略,值不省略
insert into 表名 values(值1,值2,值3,…) -
方式三:写部分字段 值与字段必须一一对应
insert into 表名(字段1,字段3,字段5,…)values(值1,值3,值5,…)
update:修改,更新表格中的记录
语法:update 表名 set 字段名=值;
delete:删除表格中的数据
-
只能删除表中的数据,不能影响表中的自增长约束
-
使用delete删除的数据,通过事务可以回滚。
-
后面带条件
1、删除表格中的全部数据(表格存在,数据不存在)
delete from 表名
2、删除表格中的部分数据
delete from 表名 where 条件;
3、使用truncate删除表中记录
Truncate table employee;(摧毁整张表格,重新建立表结构,效率高)
(delete 是一条一条的删除语句,而truncate 删除整个表格…)
DQL 数据库查询语言
查询数据
- 查询所有列
select * from 表名; - 查询指定列
select 字段1,字段2,… from 表名 - 查询时指定别名
select 字段1 as 别名1,字段2 as 别名2 from 表名;或者省略as
select 字段1 别名1,字段2 别名2 from 表名; - 合并列查询(合并的列必须为数值类型)
select (字段+字段2)from 表名; - 查询时增加常量列
select 字段1,字段2,要添加的常量列 from 表名; - 查询去除重复数据
select distinct 字段1 from 表名;或者
select distinct(字段1) from 表名; - 条件查询
1、逻辑条件: and or
- 1)两个条件的交集 ----> and
select * from 表名 where 条件1 and 条件2;
- 2) 两个条件的并集 ----> or
select * from 表名 where 条件1 or 条件2;
2、比较条件:<,>,<=,>=,=, between and
between A and B 闭区间,包含A,B
3、判空条件:=" ", is null,<>" ", is not null
-- null 和 空字符串的区别:
-- null: 没有数据。 判断null: is null,判断不为null: is not null
-- 空字符: 有数据,数据就是空字符串。判断空字符: =" " ; 判断不为空字符串: <> " "
--不为空 :select * from 表名 字段名 is not null and 字段名 <>" ";
4、模糊条件:like
-- like后面跟上符合
-- %: 表示任意多个字符(0-多个)
-- _: 表示一个字符
-
排序(order by)
select * from 表名 order by 字段名 排序条件;
排序条件:ASC 升序(默认) DESC 降序
-
限制条件(limit)
显示表格的前几行
select * from 表名 limit 行数;
显示表格的若干行 n表示偏移几行,m表示显示的总行数
select * from 表名 limit n,m;
例:3~5行
select* from 表名 limit 2,3;
数据约束
定义:对用户操作表的数据进行约束
-
默认值(default)
作用:当用户对使用默认值的字段不插入值的时候,就使用默认值
注:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null
3)当字段没有插入值的时候,mysql自动给该字段分配默认值 -
非空(not null)
作用: 限制字段必须赋值
注:
1)非空字符必须赋值
2)非空字符不能赋null -
唯一(unique)
作用: 对字段的值不能重复
注:
1)唯一字段可以插入null
2)唯一字段可以插入多个null -
主键(primary key)
作用:非空+唯一
注:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。 -
自增长(auto_increment)
作用:自增长,从0开始 ZEROFILL 零填充
注:自增长字段可以不赋值,自动递增
SELECT * FROM student;-- 不能影响自增长约束 DELETE FROM student; -- 可以影响自增长约束 TRUNCATE TABLE student;
参照完整性
1、一对多(1*N)
- 外键(foreign key)
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题: 独立出一张表
注:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
-- 部门表(主表)
CREATE TABLE dept(
id INT PRIMARY KEY,
deptName VARCHAR(20)
)
-- 修改员工表(副表/从表)
CREATE TABLE employee(
id INT PRIMARY KEY,
empName VARCHAR(20),
deptId INT,-- 把部门名称改为部门ID
-- 声明一个外键约束
CONSTRAINT emlyee_dept_fk FOREIGN KEY( deptId ) REFERENCES dept(id)
-- 外键名称 外键 参考表(参考字段/主键)
)
注: constraint: 约束的意思。foreign key: 外键。references: 参照
子表的删除更新策略一共有四种
- CASCADE 级联策略。使用此种策略时主表的记录被删除或者主键字段被修改时会同步删除或修改子表
- NO ACTION 无动作策略。使用此种策略时要删除主表必须先删除子表,要删除主表的记录必须先删除子表关联的记录,不能更新主表主键字段的值。
- RSTRICT 主表约束策略。此种策略对主表的约束跟 NO ACTION 一样
- SET NULL 置空策略。使用此种策略时,如果主表被删除或者主键被更改,则将子表中的外键设置为NULL。需要注意的是,如果子表的外键是主键或者是设置为NOT NULL的,则主表的删除和主键的更改跟 NO ACTION 一样。
2、一对一
3、多对多
Create table teachers(
id int,
name varchar(100)
salary float(8,2),
primary key(id)
);
Create table students(
id int,
name varchar(100),
grade varchar(100),
primary key(id)
);
Create table teacher_student(
t_id int,
s_id int,
primary key(t_id,s_id)
CONSTRAINT teacher_id_fk FOREIGN KEY(t_id) REFERENCES teachers(id),
CONSTRAINT student_id_fk FOREIGN KEY(s_id) REFERENCES students(id)
);
多表查询
使用单个select 语句从多个表格中取出相关的查询结果,多表连接通常是建立在有相互关系的父子表上
-
交叉连接(笛卡尔积)
定义:第一个表格的所有行 乘以 第二个表格中的所有行
语法:
隐式语法(不使用关键字): select * from customers,orders;
显式语法(使用关键字): select * from customers CROSS JOIN orders;
注:交叉连接获得的结果集是错误的 -
内连接
定义:内连接是在交叉连接的基础上,只列出连接表中与连接条件相匹配的数据行, 匹配不上的记录不会被列出
语法:
隐式语法:
select * from customers,orders where customers.id=orders.customer_id;
显式语法:
select * from customers c INNER JOIN orders o ON c.id=o.customer_id; -
外连接
定义:外链接是以一张表为基表,其他表信息进行拼接,如果有就拼接上,如果没有显示null; 外链接分为左外连接和右外连接
1)左外连接: 以关键字左边的表格为基表进行拼接
语法: select * from customers c LEFT JOIN orders o ON c.id=o.customer_id;
2)右外链接: 以关键字右边的表格为基表进行拼接
语法: select * from orders o RIGHT JOIN customers c ON c.id=o.customer_id; -
子查询
定义:当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候就会用到子查询,为了给主查询(外部查询) 提供数据而首先执行的查询(内部查询)被叫做子查询; 子查询分为嵌套子查询和相关子查询。
1)嵌套子查询:
内部查询的执行独立于外部查询,内部查询仅执行一次,执行完毕后将结果作为外部查询的条件使用(嵌套子查询中的子查询语句可以拿出来单独运行。)
例:查询出id为1的老师教过的所有学生。
select * from students where id in(select s_id from teacher_student where t_id=1);
2)相关子查询:
定义:内部查询的执行依赖于外部查询的数据,外部查询每执行一次,内部查询也会执行一次。每一次都是外部查询先执行,取出外部查询表中的一个元组,将当前元组中的数据传递给内部查询,然后执行内部查询。根据内部查询执行的结果,判断当前元组是否满足外部查询中的where条件,若满足则当前元组是符合要求的记录,否则不符合要求。然后,外部查询继续取出下一个元组数据,执行上述的操作,直到全部元组均被处理完毕。
例:每一科考试成绩大于平均分的学生的分数。
select * from score as a where a.score>(select avg(b.score) from score as b where a.cou_id=b.cou_id);
- 分页查询
group by()
GROUP BY子句的真正作用在于与各种聚合函数配合使用。它用来对查询出来的数据进行分组。
分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。分组函数忽略空值。
例:对性别进行分组在分组基础上进行聚合函数总计
select sex,count(*) as "人数" from students group by sex;
- 分组筛选
分组筛选(group by + having(条件))
例:查询人数大于2的性别
-- 1)分组 2)统计 3)条件
select sex ,count(*) from student group by sex having count(*)>2;
(1)、分组函数的重要规则
1)如果使用了分组函数,或者使用GROUP BY 的查询:出现在SELECT列表 中的字段,要么出现在聚合函数里,要么出现在GROUP BY 子句中。
2)GROUP BY 子句的字段可以不出现在SELECT列表当中。
(2)、having where 的区别
①、where和having都是用来做条件限定的,
②、WHERE是在分组(group by)前进行条件过滤,
③、HAVING子句是在分组(group by)后进行条件过滤,
④、WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数。
⑤、HAVING子句用来对分组后的结果再进行条件过滤
常用函数
- 聚合函数
SUM():求和函数
AVG():平均函数
MAX():最大值函数
MIN():最小值函数
COUNT():统计数量函数
select count(*) from 表名;
select count(id) from 表名;效率比count(*)效率高
注意:聚合函数会排除null值的数据
-
日期函数
-
数值函数
-
字符串函数
-
其他函数
参考链接:https://www.runoob.com/mysql/mysql-data-types.html