一、数据定义语言
1.设计数据库
//记单词
①、创建:create
②、删除:drop
③、修改:alter
④、数据库:database
⑤、切换/使用/进入:use
⑥、查询:select
⑦、表:table
⑧、显示:show
⑨、存在:exists
⑩、非:not 是否:if
-- 创建数据库 注意:数据库名称:XXX_DB
create databse 数据库名称;
-- 如果数据库不存在,创建数据库
create database if not exists 数据库名称;
-- 删除数据库 --> 注意:使用drop来删除库或者表,该结构+数据无法还原!(轻易不要操作)
drop database 数据库名称;
-- 如果数据库存在,删除数据库
drop database if exists 数据库名;
-- 切换数据库 前提:数据库已经存在!
use 数据库名称;
-- 查看创建数据库的基本信息
show create database 数据库名;
-- 查看登录的用户信息
select user();
-- 该库下的所有表
show tables;
2.设计表
//设计表 注意:[] --> 可省略
create table [if not exists] 表名(
列名 数据类型 [属性 约束],
列名 数据类型 ,
列名 数据类型
);
注意:
①、表的命名规则:tb_XXX 或者 库_XXX
②、列命名规则:表_XXX 或者 表的缩写_XXX
③、每一列必须要有列名和数据类型! --> 整数:int 字符串:varchar(长度)
④、列与列之间使用,隔开的! 最后一列省略,
⑤、使用varchar数据类型一定要长度!
⑥、执行的时候:将整个代码选中执行! create -- ;
3.数据类型
①、整数:
--> int:存储整数! int(m) --> m:提醒的作用! 11 默认也是11!
--> tinyint:代替布尔类型!
②、小数:
--> float:存储小数! float(m,n) --> m:数字的总长度! n:小数位数! (5,2)
--> double:
--> decimal:精确小数! 存储钱!
③、字符串:
--> char:固定长度! char(10) --> 占用长度永远都是10! 存储固定长度,比如性别!
--> varchar:可变长度! varchar(10) --> 永远按照使用的长度来计算!
注意:在MYSQL5.6之前,varchar计算单位是按照字节的单位来计算!在MYSQL5.6之后,计算单位按照字符来计算!无论存储是数字、字母、汉字都是按照字符来计算!!! (推荐稍微多给点,长度是一定要给!)
--> text:长文本!
④、时间类型:
--> 时间:time
--> 日期:date
--> 日期+时间:datetime
--> 时间戳:timestamp --> 只要修改当前的SQL语句,自动获取当前的时间戳!
4.属性
①、添加注释comment+别名:stu_id int comment '学号'
②、序列:将当前列自动增长, auto_increment
条件:数据类型是整数类型,并且必须添加主键
5.约束
①、主键约束:为每张表都添加主键,每张表只能有一个主键!要求数据必须是唯一并且不为空的! 关键词:primary key
②、非空约束:该列的数据不能为null! 关键词: not null
③、默认约束:该列存在默认值! default 值! (注意:值根据数据类型来填充! 数值:数字! 字符串或者日期:'' 或者 "")
--> 唯一约束:该列的数据是唯一的,但是可以多个null! 关键词: unique
④、重要的约束,但是不要在数据库中使用:外键约束!
--> 外键约束:表与表之间通过外键来关联! 表与表之间唯一的联系!
--> 如何实现外键约束?
4.1:先分析:分析主外键表!主表:先出现的表! 外键表/辅表:后出现的表!
4.2:在主键表添加主键约束!
4.3:在外键表添加一个引用列! --> 引用主键表中主键列!
注意:引用列数据类型必须与主键表中主键列的数据类型一致!
二、数据操控语言
1.插入:insert
//语法 注意:[] 内的内容可省略!
insert into 表名[(列名,列名)] values(值,值);
注意:
①、可省略列名,如果省略列名,则代表给整张表添加数据!
②、列和值必须一一对应!(个数要一致,数据类型必须一致!)
③、指定列名(外键的引用列、非空约束)插入数据--> 自动增长列 以及 默认值列会自动填充!
注意:自动增长列填null,默认值列填default
2.删除:delete
注意:只会删除数据,对表的结构不存在影响的!
//语法
delete from 表名 [where条件];
注意:
①、如果省略where,直接将整张表的数据删除!
②、where条件参考查询where!
注意事项:违反外键约束,必须先删除外键表关联数据,才能删除主键表的数据。
3.修改:update
//修改
update 表名 set 列名 = 值,列名 = 值 [where条件];
注意:
①、省略where条件,则代表给整张表修改数据!
②、列和值要对应! 例如:列是int类型,值必须是数字!列是字符串或者日期,值必须加‘ ’或者“ ”
③、修改的是数据!修改成功,返回的也是受影响行数!
三、数据查询语言
1.基础查询
①、查询的基本结构:返回的是结果集!
//语法
select 查询列 from 表名 [where 筛选条件];
②、查询所有: 查询所有列! * --> 推荐尽量少用*,检索效率比较低
select * from tab;
③、查询指定列的数据:
//语法
select 列名,列名 from 表名;
注意:列名必须是表中已经存在的列!多个列之间必须使用逗号隔开!
④、添加别名:别名都是临时,只在当前这个查询语句有效!
给列添加别名 --> 显示就是别名!
4.1:使用as关键字: select 列名 as 别名 from tab;
4.2:使用空格:select 列名 别名 from tab;
4.3:给表添加别名 --> 一旦给表添加别名,表就可以使用别名来进行操作! (联表查询中使用的特别多!)
⑤、去重复:distinct
对查询列去重复
select distinct 列名 from tab;
⑥、基础where筛选条件
6.1:等于和不等于,等于:= 不等于:!= 或者 <>
6.2:比较大小:< >= <=
6.3:或与非,或者:or 与:and 非:not
6.4:区间判断,使用and: >= and <=
between...and (注意:从小到大)
6.5:包含:使用or: 列名 = ‘ ’ or 列名 = ‘ ’
使用in : in(集合); --> 尽量少用!in(长度有限制)
6.6:判断是否为null?
是: is null 不是:is not null
2.模糊查询
//语法
select * from tab where 列名 like '占位符';
注意:
①、% : 零个或者多个! 例如:'hello' %h%:只要包含h! h%:必须以h开头! %h:必须以h结尾!
②、_ : 1个! 例如:'hello' --> hel_o就能查询出hello!
③、如果没有在条件中使用占位符,视同于等于!
3.排序
对查询结果来进行排序! order by
//语法
select * from tab [where条件] order by 列名 [desc/asc];
注意:
①、如果不需要筛选条件,直接排序的话! 不需要where关键字!
②、默认排序方式:升序(asc)!
③、desc:降序! (从大到小)
④、根据多个列来排序:
⑤、根据时间来排序:时间是可以直接进行排序的!
4.聚合函数
//聚合函数
①、求和:sum()
②、最大值:max()
③、最小值:min
④、计数:count()
⑤、平均值:avg()
5.分组
查询结果来进行分组! group by
//语法
select * from tab [where条件] group by 列名;
注意:
①、根据列来分组,得到几组数组! --> 分组+聚合函数来计算每组的值!
②、根据多个列来分组! --> group by 列名1,列名2; (先根据列名1来分组,再根据列名2来分组)
③、对分组之后再筛选! having --> 和where是一样,用于筛选!
where:where在分组之前筛选! where筛选条件不能+聚合函数!
having:在分组之后筛选! having筛选条件+聚合函数!
6.limit
①、提取前N条数据!
select * from tab [where条件] limit N;
②、提取区间条数!
select * from tab [where条件] limit N,M; --> N:起始索引(从0开始)位置! M:提取的条数!
③、分页查询:当返回的条数比较多,无法一页显示的时候! 使用分页查询!!!
3.1、查询总条数! --> count
3.2、每页显示条数! --> 8 (自定义)
3.3、总页数:总条数 % 每页条数 == 0 ? 总条数 / 每页条数 : (总条数 / 每页条数 + 1)
3.4、页码:当前页数!
//分页实体类
PageInfo{
//总条数
private Integer allCount;
//每页显示条数
private Integer count;
//总页数
private Integer allPage; --> allCount % count == 0 ? allCount / count : allCount / count + 1;
//当前页数
private Integer page;
}
-- 分页查询
-- 第0页
select * from tb_salary limit 0,8;
-- 第1页
select * from tb_salary limit 8,8;
-- 第2页
select * from tb_salary limit 16,8;
-- 第3页
select * from tb_salary limit 24,8;
总结:select * from tb_salary limit count*page,count;
7.联表查询
7(1)、联表查询:将多张表联合在一起查询操作!表与表之间唯一联系:主外键关系!!!
实现步骤:
①、先分析表之间的关联条件! --> 主键列和引用列来关联!
②、根据需求来分析使用哪一种联表查询!
7(2)、内联接:将多张表之间有关联的数据查询出来!
①、使用inner join ... on
语法:select * from tab1 inner join tab2 on tab1和tab2关联条件;
②、使用where来联表
语法:select * from tab1,tab2 where tab1和tab2关联条件;
7(3)、外联接:将主表的数据全部查询出来
①、左联接:以左边的表为主表!
语法:select * from tab1 left join tab2 on 关联条件; --> 以tab1为主表!
注意:将tab1的数据全部查询出来,tab2如果不存在的数据会填充null!
②、右联接:以右边的表为主表!
语法:select * from tab1 right join tab2 on 关联条件; --> 以tab2为主表!
注意:将tab2的数据全部查询出来!
8.子查询
子查询就是嵌套查询! 将一个select语句嵌套在另外一个select语句中!
8(1)、子查询特点:
①、子查询写在()! --> 先查询!
②、查询语句:select 查询列 from 查询表 where 查询条件!
③、子查询的作用:
3.1:当做查询列/临时列使用! --> 在select 和 from之间!
3.2:当做查询表/临时表使用! --> 在from 和 where之间!
3.3:当做查询条件来使用! --> 在where之后!(掌握)
8(2)、子查询分类:
①、当做查询条件使用:
语法:select * from tab where 列名 = (子查询);
注意:
1.1:如果使用=、>、>=、<、<=! 子查询的返回结果只能是单个值!
1.2:如果子查询返回多个结果,使用in!(效率比较低)
②、当做临时表来使用:在from之后!
③、当做临时列来使用:在select和from之间!
9.常用函数
-- 连接字符串
select concat('abc','123','小小');
-- 拼接
select concat(stu_name,'***',department) from student;
-- 插入 insert(原始字符串,起始的索引位置【从1开始】,替换的长度,替换新的字符串)
select insert('abc',1,2,'qqqq');
-- 转大小写
select lower('ABCDA'),upper('cccccDDDDD');
-- 返回字符串长度 length:单位是字节! char_length:单位是字符!
select length('你好123'),char_length('你好123');
-- 左填充和右填充 lpad(原始字符串,填充之后新的字符串的长度,填充的值)
select lpad('aaa',5,'bcbb'),rpad('af',7,'bcbb');
-- 去头尾的空格 trim
select trim(' 123 321 ');
-- 替换 replace
select replace(' 123 321 ',' ','');
-- 重复 repeat(原始字符串,重复的次数)
select repeat('131',2);
-- 截取 substring(原始字符串,从第2个开始截取,截取的长度)
select substring('abc123456',2,5);
-- 数值函数 abs绝对值,ceil向上取整,floor向下取整,mod取余,rand()随机数,
-- round(x,y)返回x的四舍五入的有y位小数的值,truncate(x,y)返回数字x截断位y位小数的结果
select abs(-1),ceil(5.85),floor(5.85),mod(10,4),rand(),round(5.68,1),truncate(5.68,1);
-- 日期
-- 获取当前的系统时间
select curdate(),curtime(),now(),sysdate();
-- 时间截取
select week(now()),year(now()),hour(now()),month(now()),monthname(now()),day(now());
-- 格式化
select date_format(now(),'%y年%m月%d日');
-- 两个日期之间的天数
select datediff('2022-12-1','2022-12-10');
10.索引
10(1)、索引的定义:在数据库表中添加索引,类似于给表单独添加了一个目录!查询的时候先检索目录,根据目录快速定位! 提高查询的速度!!!
10(2)、索引分类:
①、根据物理存储来划分:聚集索引和非聚集索引!
1.1:聚集索引:索引和实际数据存储的有按照顺序的存储!
--> 类似于新华字典按照拼音查询!
--> 每张表中只能有一个聚集索引!
--> 推荐给主键添加聚集索引!
1.2:非聚集索引:索引和实际数据存储是没有顺序!
--> 类似于新华字典按照偏旁查询!
--> 在表中可以多个非聚集索引!
②、根据实际应用来划分:
2.1:单值索引:只能给单个列添加索引!
2.2:组合索引:给多个列联合添加索引!
2.3:唯一索引:唯一单值索引 或者 唯一组合索引! --> 创建唯一索引,必须保证的值是唯一的!
2.4:主键索引:给主键添加索引!
10(3)、添加索引:
//创建单值索引
create index 索引名 on table(列名);
//创建组合索引
create index 索引名 on table(列名1,列名2);
//创建唯一索引 --> 前提:保证列的数据是惟一的
create unique index 索引名 on table(列名);
create unique index 索引名 on table(列名1,列名2);
10(4)、索引的优缺点:
//优点
①、提高查找的速度! --> 降低检索的次数!
//缺点:
①、占用物理存储位置!
②、添加索引之后降低新增、修改和删除的执行效率! 在新增、删除和修改的同时还要管理索引表!
哪些列适合添加索引?
①、根据某些列来搜索数据,适合添加索引!
②、表的数据量比较大!
③、用于排序的列比较添加索引!
④、搜索框!
哪些列不适合添加索引?
①、表的数量很小!
②、列的数据的重复量比较大! 比如:性别
③、经常性的添加、删除和修改的时候! 不怎么查询的时候!、
10(5)、索引会失效:能不用就不要用!
-- ①、判断不等于的时候索引会失效! <> 或者 !=
-- ②、使用模糊查询,如果以占位符来开头!索引也会失效!
-- ③、没有使用添加索引的列!
标签:--,列名,查询,索引,MySQL,where,select From: https://www.cnblogs.com/yao1994/p/16970770.html