show engines;
SQL分类:
DML:数据操作语言,操作数据库中存储的数据(insert、update、delete)
DDL:数据定义语言,创建、删除、修改数据库、数据表(create、drop、alter)
DQL:数据查询语言,查询数据库(select)
DCL:数据控制语言,用来控制数据库组件的存取(事务commit、rollback)
**
create database 数据库名称 default character set utf8 collate utf8_general_ci;
default character set:设置默认字符集支持中文
collate:设置数据库的校验字符集,指对某个字符串类型的数据进行排序查询的时候,数据排序方式,如何比较两个字符串值的大小关系
utf8_general_ci:不区分大小写
utf8_bin:区分大小写
drop database 数据库名;
show database;
use 数据库名;
创建数据表之前,一定要选择一个数据库,给指定的数据库中创建数据表。
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
alter table 数据表名 add 字段名 数据类型;//新增字段
alter table 数据表名 change 旧字段名 新字段名 数据类型;//修改字段
alter table 数据表名 drop 字段名;//删除字段
alter table 数据表名 alter column 列名 set default 值;//设置默认值
drop table 数据表名;
show tables;
desc 数据表名;
增删改查
CRUD create、read、update、delete
insert into 数据表名(字段列表) values(值列表);
省略字段列表相当于添加了全部的字段
delete from 数据表名;//删除全部数据
delete from 数据表名 where 字段名 = 值;//根据where条件删除数据
update 数据表名 set 字段名 = 值,...;//修该全部的对应数据
update 数据表名 set 字段名 = 值,... where 字段名 = 值;//根据条件修改值
select 字段列表 from 数据表;
select * from xxx where ...;//通配符*表示查询所有字段,where条件查询
数学函数、日期函数、字符串函数、聚合函数
求绝对值: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后
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
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
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;
select score from course group by name;
//根据名字分组查询,相同名字只显示出第一条
select name from student group by name having count(*) = 3;
//having与group by 连用 ,用于加条件
//降序
select * from course order by score desc;
//升序
select * from course order by score asc;
PS!!!:通过运算符返回的结果不会影响到数据库中的内容,即数据库中值不会改变。
执行运算符:加减乘除
比较运算符:大于、等于、小于、不等于…,返回的是个布尔类型(返回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;//非
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 外键名;
一对一: A中的一条记录对应B中的一条记录,B中的一条记录对应A中的一条记录。(例如:每个人和他的身份证号)
一对多:A中的一条记录对应B中的多条记录,B中的一条记录对应A中的一条记录。(例如:班级和学生)
多对多:A中的一条记录对应B中的多条记录,B中的一条记录对应A中的多条记录。(例如:学生和选课)
嵌套查询:
select * from class where id = (select cid from student where name = '张三');//将括号内查出的cid作为条件查询
内连接会将结果进行笛卡尔积,即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;
左连接:左表所有数据和右表满足条件的数据
条件用on而不是where
select * from s left join class c on s.cid = c.id and s.id = 1;
右连接:右表所有数据和左表满足条件的数据
条件用on而不是where
select * from s right join class c on s.cid = c.id and s.id = 1;
多个表用逗号连接即可
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、不要添加过多的索引,维护成本很高。
alter table test add index in_id(id);//方式一
create index in_id on test(id);//方式二
alter table test drop index in_id;//方式一
drop index in_id on test;//方式二
数据库中一张虚拟的表,允许不同用户或者应用程序以不同的方式查看同一张表中的数据。
create view view_common as select id,name from user;
select * from view_common;
drop view view_common;
触发器中定义了一系列操作,可以在对指定表进行插入、更新、删除的时候自动执行这些操作,完成对目标的管理。
//同步插入触发器
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;
drop trigger 触发器名;
存储过程是一组为了完成特定功能的SQL语句的集合,存储在数据库中的,用户通过指定存储过程的名字和参数进行调用。
存储过程相当于是定义在MySQL中的方法,开发者可以直接调用。
优点:
1、只需要创建一次。
2、执行速度更快。
3、更好的安全机制。
参数:1、输入输出类型、参数名称、参数数据类型
入参:相当于java中方法的参数
出参:相当于java中方法的返回值
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 名;
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的基础上,表中只有一个候选键且都是单属性。