数据库使用排名网站:
https://db-engines.com/en/ranking
MySQL的官网文档说明:(重要!!!)
https://dev.mysql.com/doc/refman/5.7/en/
目录
decimal 类型(Exact value有固定小数位的数字类型)
REPLACE,REVERSE,CHAR_LENGTH三个方法
注意事项:
1.在mysql命令行中一定是英文半角状态输入;
2. show warning 查看提示
数据库database是由表组成的;
表是由结构化的数据组成的;
select database(); 表示当前使用的是哪个database,如果没有则显示null
SQL中delimiter是;可以通过delimiter $$,将分隔符改变为$$
数据类型
数字类型
INT类型:区别是大小不同(Exact value)
https://dev.mysql.com/doc/refman/5.7/en/integer-types.html
创建unsigned类型时例子: create table test1(id int unsigned);
decimal 类型(Exact value有固定小数位的数字类型)
适用于存储钱等关键数字数据
decimal(5,2)表示一共是5位(不包括符号),小数点是2位。
超过固定的小数位,会自动四舍五入,如下:
bin类型
时间类型
Date(表示年月日)
time类型(表示时分秒)
YEAR类型
DATETIME &Timestamp
timestamp会根据时区的改变而改变,datetime不会改变,且timestamp会根据字段的修改而改变,如下所示。
timestamp占用4个字节,datetime占用8个字节
设置on update now()时,当表被改动时,timestamp会自动更新当前的时间。
时间的一些函数:可以查看博客最开始的一个官方链接介绍:
字符类型
char和Varchar的区别在于长度一个固定一个不固定:
在长度固定时使用char类型速度更快。
Blob和text
因为blob字段可能很长,如果排序的话耗费时间长,可以设置排序长度为2000,那么只对前2000个字符进行排序。
Enum和set
Enum用于特定的字段,比如男性/女性,鞋子的大小型号等。同时插入字段时比varchar快很多。
设置set的值为2的N次方。
常用命令:
show tables;
show databases;
use table_name;
desc table_name; 显示table的具体信息
drop table table_name; 删除表操作
insert into person(name,age) values('li',25);
insert into person(name,phone,age) value('wang','13516202269',23);
insert into person(name,phone,age) values('li','78979',23),('fanru','1334544',22); 可同时插入多条记录。
Null和Not Null
null表明这个字段可以是unknown的,其默认值为Null,当建立表时可以对其进行设置:
create table person2(name varchar(20) not null,phone varchar(20),age int);
字段后面加not null,表明这个字段不能为空,不然报错。
设置字段的默认值
create table person3(name varchar(20) default 'wjz',phone varchar(20),age int);
设置字段的唯一性,primary key和unique
create table person4(name varchar(20) ,phone varchar(20) primary key,age int);
create table person5(name varchar(20) ,phone varchar(20) ,age int, primary key (phone));
设置auto_increment属性
create table person5(id int auto_increment primary key, name varchar(20) ,phone varchar(20),age int);
或者
create table person5(id int auto_increment , name varchar(20) ,phone varchar(20),age int,primary key(id,name));
第二种primary key的定义方法可以定义联合字段的唯一性,适用于实际中用户唯一性购买商品等场景
primary key和unique的区别是,设置的字段是否可以为null
create table person7(id int primary key, age int unique);
SQL文件快速编辑
使用visual Studio Code编辑
source 命令执行.sql文件
常用语句
where语句
select * from employee where not salary>=6000;
可以加and or not,进行联合筛选
update语句
update employee set salary=10000 where not salary>=6000;
update employee set salary=10000, notes='wjz' where id=4; 更新两个字段
删除语句
delete语句
delete from employee where id=4;
truncate语句:
truncate table_name; 清空表的所有内容
字符串语句函数
concat语句
select concat(first_name,' ' ,last_name)as fullname from employee;
select concat_ws('-',first_name ,last_name,'is',title)as fullname from employee; #默认设置字段的连接符
substring语句
select substring(title,1,5)fullname from employee; #substr是其缩写
select concat_ws(' ',first_name,last_name,'was hired on',substr(hire_date,1,4))infor from employee;
REPLACE,REVERSE,CHAR_LENGTH三个方法
大小写转换
UPPER 和LOWER进行大小写转换
left、right、length
LTRIM、RTRIM、TRIM 去除空格
排序
select * from employee order by salary ; --默认为升序,结尾加desc 为降序
select first_name ,last_name,title from employee order by 2; --order by 2表示按照第二个字段进行排序
limit
select first_name ,last_name,title from employee limit 2,4; --表示显示第3到4个字段
select first_name ,last_name,title from employee limit 2,很大的数; --表示显示第3到结尾个字段
模糊搜索 like
select * from employee where last_name like "C%"; --%表示任意字符
select * from employee where last_name like "__an"; --知道长度是4,可以用_代替进行模糊搜索
搜索%时,加转义字符
distinct 去重操作
Group by 分组,聚合操作
group by是字段都分组好了,比如上图中相应的title中first_name有的数量是2,3,1等。而distinct只是进行去重,没有聚合的功能。
Having与where的区别
在使用group by之后无法使用where进行条件的过滤,会报错如下:
只能先进行条件的筛选再进行group by操作,如下
那么如果想对group by后的结果进行筛选,需要使用having ,如下
其他方法
max 最大
min 最小
sum 求和
avg 求平均
convert:转换函数
数值函数
div 除法取整数 MOD求余
power 幂运算
round四舍五入
日期函数
dateadd 增减日期
加密函数
MD5()
逻辑操作符
=与!= not 表达式 例如
select * from employee where salary=8000
select * from employee where salary!=8000
select * from employee where NOT salary=8000
and or 的使用
between等于>= 和<=,表示一个连续范围时使用
select * from movie where title_year between 1990 and 2000;
select * from movie where title_year >=1990 adn title_year<=2000;
in 在断续范围时使用
select * from employee where salary in (5000,7000,8000);
判断语句
case:增加多个条件比如:
case
when then
when then
else
end
IFNULL:判断是否为null
ifnull(xx,0):判断XX为null值,则将其设置为0
IF:判断结果为两个时
if(xxx,A,B):判断XXX为真,则A否则为B
例子:
例子2 :
表关联
select * from orders where customer_id=(select id from customers where email='roj@gmail.com');
通过外键约束关联字段:foreign key
限制customer_id必须是customer表中id这个字段中的值。
设置外键约束时,也造成无法删除外键的字段,加上on delete cascade后可以关联删除两个表中相应的字段
Inner join(交集)
select * from customers inner join orders where customers.id=orders.customer_id;
Left join(以左侧为base进行连接)
例子:
select first_name,last_name,sum(amount) from customers left join orders on customers.id=orders.customer_id group by customers.id;
IFNULL(xx,0):判断XX如果是null则设置其为0
多对多表关联
允许用户连接到MySQL服务器的设置
https://www.cnblogs.com/junlin40243/p/9691257.html
制作千万的测试数据: