MySQL学习


一、显示数据库存储引擎

show engines;

在这里插入图片描述
SQL分类:
DML:数据操作语言,操作数据库中存储的数据(insert、update、delete)
DDL:数据定义语言,创建、删除、修改数据库、数据表(create、drop、alter)
DQL:数据查询语言,查询数据库(select)
DCL:数据控制语言,用来控制数据库组件的存取(事务commit、rollback)


二、管理数据库

1、 创建数据库

**

create database 数据库名称 default character set utf8 collate utf8_general_ci;

default character set:设置默认字符集支持中文
collate:设置数据库的校验字符集,指对某个字符串类型的数据进行排序查询的时候,数据排序方式,如何比较两个字符串值的大小关系
utf8_general_ci:不区分大小写
utf8_bin:区分大小写

2、删除

drop database 数据库名;

3、查看

show database;

4、选择

use 数据库名;

创建数据表之前,一定要选择一个数据库,给指定的数据库中创建数据表。


三、管理数据表

1、创建数据表

create table 数据表名(
	//列信息
 	字段名称 数据类型 是否为主键/是否为空/默认值
);

例:

create table student(
	id int not null,
	name varchar(11),
	age int
);

整形:
int,bigint

浮点类型:
float(M,D)、double(M,D)、decimal(M,D)
M:表示该小数最多有多少个十进制数
D:表示该小数的小数点后的十进制数个数
decimal:为了确保小数是精确的,MySQL提供了定点数据类型decimal。它与另外两个浮点类型的区别是,decimal存储是将整数部分与小数部分分开存储,float和doble是将整个数一起存储。

日期和时间类型:
year:年份值
time:时间值
date:日期值
datetime:日期+时间
timestamp(时间戳):1970-01-01 00:00:01到现在的毫秒数

字符串类型:(M表示长度)
char(M):固定长度的字符串
varchar(M):可变长度的字符串0~M

二进制类型:(M表长度)
bit(M):小的二进制数
binary(M):普通二进制数
varbinary(M):可变长的普通二进制数0~M

2、修改数据表

alter table 数据表名 add 字段名 数据类型;//新增字段
alter table 数据表名 change 旧字段名 新字段名 数据类型;//修改字段
alter table 数据表名 drop 字段名;//删除字段
alter table 数据表名 alter column 列名 set default;//设置默认值

3、删除数据表

drop table 数据表名;

4、查看数据表

show tables;

5、查看数据表结构

desc 数据表名;

四、管理数据

增删改查
CRUD create、read、update、delete

1、增

insert into 数据表名(字段列表) values(值列表);

省略字段列表相当于添加了全部的字段

2、删

delete from 数据表名;//删除全部数据
delete from 数据表名 where 字段名 =;//根据where条件删除数据

3、改

update 数据表名 set 字段名 =,...;//修该全部的对应数据
update 数据表名 set 字段名 =,... where 字段名 =;//根据条件修改值

4、查

select 字段列表 from 数据表;
select * from xxx where ...;//通配符*表示查询所有字段,where条件查询

五、SQL函数

数学函数、日期函数、字符串函数、聚合函数

1、数学函数

求绝对值:abs()
向下取整:floor()
向上取整:ceil()

select abs(score) from student where id = 1;
select floor(score) from student where id = 1;
select ceil(score) from student where id = 1;
select name from student where name = 'zs' order by id;
//ps:order by 必须放在where后

2、字符串函数

PS!!!:SQL函数的返回结果不会影响到数据库中的内容,即数据库中值不会改变。

insert(s1,index,len,s2):在查询的结果中对字符串内容内容进行添加数据的修改。s1是目标字符串,index是目标字符串的下标,从1开始,len是截取长度,s2是追加内容。

select insert(name,2,2,''MySQL) from student where id = 1;

假设取得的name为Zhang则会从下标为2的位置即h开始(MySQL字符串下标是从1开始)截取2个长度的字符即截取ha,然后将’MySQL’添加到该位置,得到结果ZMySQLng。

upper():将字母转为大写
lower():将字母转为小写
left(s,len):返回s字符串的前len个字符
right(s,len):返回字符串的后len个字符
substring(s,index,len):截取s字符串从index开始len个长度的字符
reverse(s):反序输出

//假设name为TEst
select upper(name) from student where id = 1;//结果为TEST
select lower(name) from student where id = 1;//结果为test
select left(name,2) from student where id = 1;//结果为TE
select right(name,2) from student where id = 1;//结果为st
select substring(name,2,2) from student where id = 1;//结果为Es
select reverse(name) from student where id = 1;//结果为tsET

3、日期函数

curdate():获取当前日期
curtime():获取当前时间
now():获取当前日期+时间
datediff(d1,d2):计算d1和d2之间间隔的天数
adddate(d,n):d日期之后n天的日期
subdate(d,n):d日期之前n天的日期

select curdate();
select curtime();
select now();
select datediff('2020-01-01','2020-01-02')//结果为-1,日期反过来是1,正负代表向前还是向后
select adddate('2020-03-31',-100);//2019-12-22
select subdate('2020-03-31',100);//2019-12-22

4、聚合函数

count():根据某个字段统计总记录数
sum():计算某个字段值的总和
avg():求某个字段值的平均值
max():求某个字段值的最大值
min():求某个字段值的最小值

select count(id) from student;
select sum(id) from student;
select avg(id) from student;
select max(id) from student;
select min(id) from student;

六、条件查询

1、分组查询

select score from course group by name;
//根据名字分组查询,相同名字只显示出第一条
select name from student group by name having count(*) = 3;
//having与group by 连用 ,用于加条件

2、排序查询(默认升序)

//降序
select * from course order by score desc;
//升序
select * from course order by score asc;

七、MySQL运算符

PS!!!:通过运算符返回的结果不会影响到数据库中的内容,即数据库中值不会改变。

1、算术运算符

执行运算符:加减乘除
比较运算符:大于、等于、小于、不等于…,返回的是个布尔类型(返回1表示true,0表示false)
逻辑运算符:与或非…,返回0或1

select score+60 from course;
select score>80 from course;
select score>80 && level<10 from course;//与
select score>80 || level<10 from course;//或
select !(score>80 || level<10) from course;//非

2、特殊运算符

is null:判断是否为空,返回0或1
between and:判断值是否在某个区间内并返回结果
in:判断值是否在某个确定的集合内并返回结果
like:模糊查询

select name is null from course;
select score between 90 and 100 from course;
select score from course where id in (1,2,3);
//%表示可以为任意值
select * from student where name like '%刘%';//返回带'刘'的所有数据
select * from student where name like '刘%';//返回'刘'开头的所有数据
select * from student where name like '%刘';//返回'刘'结尾的所有数据

八、主键

表中的一个字段,该字段的值是每一行数据的唯一标识。

默认情况下,每张表都要有一个主键,也只能有一个主键。

主键生成策略:代理主键,与业务无关的字段,仅仅是用来标识一行数据,一般定义为int类型,因为int类型存储孔家小,同时可以设置自增避免主键冲突问题。(例如:id)

主键必须是唯一的,不能有重复的。

创建主键

create table user(
	id int primary key auto_increment,//设置id为主键且自增
	name varchar(11)
);

删除主键

alter table 表名 drop primary key;

九、外键

表中的某个字段设置为外键,与另外一张表的主键进行关联,从而将两张表的数据建立级联关系。

创建外键

create table orders(
	id int primary key auto_increment,
	name varchar(11),
	uid int,
	foreign key(uid) references user(id)//设置外键uid关联user表的主键id
);

外键的取值必须是主键中已经存储的值,如果是主键中没有的值,则外键无法存储。

A表的主键和B表的外键建立约束关系后,B表外键的值就需要被A表的主键值所约束,只能从A表中获取已经存在的值存入B表的外键,所以B表就是从表,A表就是主表。

删除外键

alter table 数据表名 drop foreign key 外键名;

十、数据表关系

1、一对一

一对一: A中的一条记录对应B中的一条记录,B中的一条记录对应A中的一条记录。(例如:每个人和他的身份证号)

2、一对多

一对多:A中的一条记录对应B中的多条记录,B中的一条记录对应A中的一条记录。(例如:班级和学生)

3、多对多

多对多:A中的一条记录对应B中的多条记录,B中的一条记录对应A中的多条记录。(例如:学生和选课)

十一、多表关联查询

1、嵌套查询,子查询

嵌套查询

select * from class where id = (select cid from student where name = '张三');//将括号内查出的cid作为条件查询

2、连接查询

(1)、内连接inner join

内连接会将结果进行笛卡尔积,即A表有两条数据,B表有三条数据,内连接查询后会有六条数据。

select * from student inner join class where student.name = '张三' and cid = class.id;//inner join表内连接

s.id as sid,student as s:as用来命别名,可省略
inner join:内连接,可省略并用’,'连接

select s.id sid,s.name sname,c.id cid,c.name cname from student s,class c where s.name = '张三' and cid = c.id;

(2)、外连接

a、左连接left join

左连接:左表所有数据和右表满足条件的数据

条件用on而不是where

select * from s left join class c on s.cid = c.id and s.id = 1;
b、右连接right join

右连接:右表所有数据和左表满足条件的数据

条件用on而不是where

select * from s right join class c on s.cid = c.id and s.id = 1;

3、多对多关系级联查询

多个表用逗号连接即可

select u.id uid,u.name uname,c.id cid,c.name cname from user u,course c,user_course uc where u.id = uc.uid and c.id = uc.cid and u.id = 1;

十二、索引

索引是数据库中一种特殊的数据结构,可以用来快速查询数据表中的特定的记录,提高数据库查询效率的重要方法,索引是直接添加到字段上的。

索引包括:普通索引、唯一索引、主键索引、全文索引、组合索引等,创建维护索引需要消耗时间,索引也需要占用物理空间。
普通索引:值可以为空,仅加速查询。
唯一索引:索引列的值必须唯一,但允许有空值。
主键索引:一个表只能有一个主键,不允许有空值。主键会自带主键索引。
索引设置原则
1、出现在where语句中的列,而不是select后面的列。
2、索引的值,尽量唯一,效率更高。
3、不要添加过多的索引,维护成本很高。

1、添加索引

alter table test add index in_id(id);//方式一
create index in_id on test(id);//方式二

2、删除索引

alter table test drop index in_id;//方式一
drop index in_id on test;//方式二

十三、数据库视图View

数据库中一张虚拟的表,允许不同用户或者应用程序以不同的方式查看同一张表中的数据。

1、创建视图

create view view_common as select id,name from user;

2、使用视图

select * from view_common;

3、删除视图

drop view view_common;

十四、触发器Trigger

触发器中定义了一系列操作,可以在对指定表进行插入、更新、删除的时候自动执行这些操作,完成对目标的管理。

1、创建触发器

//同步插入触发器
create trigger t_afterinsert_on_tab1 //触发器名
	after insert on tab1  //在tab1表执行插入之后
	for each row  //针对每一行都触发
	begin
		insert into tab2(tab2_id) values (new.tab1_id); //将tab1表中插入的tab1_id同步插入到tab2表中的tab2_id
	end;
//同步删除触发器
create trigger t_afterdelete_on_tab1 //触发器名
	after delete on tab1  //在tab1表执行删除之后
	for each row  //针对每一行都触发
	begin
		delete from tab2 where tab2_id = old.tab1_id;//将tab1表中的tab1_id删除后同步删除tab2表中的tab2_id
	end;

2、删除触发器

drop trigger 触发器名;

十五、存储过程Procedure

存储过程是一组为了完成特定功能的SQL语句的集合,存储在数据库中的,用户通过指定存储过程的名字和参数进行调用。

存储过程相当于是定义在MySQL中的方法,开发者可以直接调用。

优点
1、只需要创建一次。
2、执行速度更快。
3、更好的安全机制。

参数:1、输入输出类型、参数名称、参数数据类型
入参:相当于java中方法的参数
出参:相当于java中方法的返回值

1、入参SQL

create procedure ()add_name(in target int)//in表入参
begin
	declare name varchar(11);
	if target = 1 then //then相当于{}
		set name = 'MySQL';
		else
		set name = 'Java';
	end if;
	insert in test(name) values(name);
end;

调用存储过程

call add_name(1);//名+参数

删除存储过程

drop procedure;

2、出参SQL

create procedure count_of_student(out count_num int)//out表出参
begin
	select count(*) into  count_num from student;
end;

调用存储过程

call count_of_student(@count_num);//自己定义的变量要加@
select @count_num;

删除存储过程

drop procedure count_of_student;

十六、三大范式及其他范式

摘自尚硅谷宋红康老师的课

第一范式(1NF):
字段的原子性,即字段不可再拆分。例如(user_info这个字段包含员工的phone、address等就可拆分)
第二范式(2NF):
在1NF的基础上,还要满足数据表里的每一条数据记录,都是可以唯一标识的。而且所有非主键字段,都必须完全依赖于主键,不能只依赖于主键的一部分。(即一张表只能表达一个意思)
第三范式(3NF):
在2NF的基础上,确保表中的每一个非主键字段和主键字段直接相关。即要求数据表中的所有非主键字段
不能依赖与其他非主键字段。(即不能有依赖传递,非主属性之间不能有依赖关系)
巴斯·科德范式(BCNF):
在3NF的基础上,表中只有一个候选键且都是单属性。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值