MYSQL语法大全

创建数据库

create database tb charset=utf8;

使用数据库

use tb;

创建表

在当前数据库创建新表

create table tabname(字段1,类型1,字段2,类型2,......);

create table student(
		id int unsigned primary key auto_increment not null,
		name varchar(20) default '',
		age tinyint unsigned default 0,
		height decimal(5,2),
		gender enum('男','女','中性','保密') default '保密',
		cls_id int unsigned default 0,
		is_delete bit default 0
	);
create table classes(
			id int unsigned primary key auto_increment not null,
			name varchar(30) not null
		);
根据旧表创建新表

create table 新表 as 旧表;

create table student2 like student;

根据旧表部分列创建新表:
create table 新表 as select 列名1,列名2 ... from 旧表 definitiononly;

字段设置

增加一个列名

alter table 表名 add 列名 类型;

给student中添加外号nickname
alter table student add nickname int;

指定列名后面添加一个列:
alter table 表名 add 已有列名 after 列名 类型;

添加主键

alter table 表名 add primary key 列名;

添加外键

alter table 表名 add foreign key 列名 reference 表名 主键;

插入数据
完全插入:insert into 表名 value(值1,值2,.....);与字段一一对应
选择插入:insert into 表名 (列名1,列名2,....) value (值1,值2,.....);
批量插入:insert into 表名 values(值1,值2,.....),(值1,值2,.....),(值1,值2,.....)......;

完全插入可省列名,但值必须包含所有字段,批量插入类同,选择必须插入所选字段,选择对应字段的值,批量插入类同

insert into student values
		(1,'小明',18,180.00,2,1,0),
		(2,'小花',19,155.00,2,2,1),
		(3,'小月',20,190.00,1,1,0),
		(4,'小华',30,174.00,1,2,1),
		(5,'tim',41,160.00,2,1,0),
		(6,'tom',33,178.00,4,2,1),
		(7,'jack',22,174.00,2,2,1),
		(8,'dad',25,175.00,1,1,0),
		(9,'mom',24,155.00,1,2,0),
		(10,'周杰伦',36,184.00,2,2,0),
		(11,'刘亦菲',25,196.00,3,3,1),
		(12,'成龙',29,185.00,2,4,0),
		(13,'周杰',44,163.00,2,5,0),
	    (15,'檀健次',18,175.00,1,1,0),
	    (16,'白鹿',25,165.00,2,1,0),
	    (17,'万鹏',26,165.00,2,3,0);
		(14,'金星',33,162.00,3,3,1);

使用 as 起别名

使用 as 给字段起别名

select 字段 as 名字 ... from 表名;

给表起别名

select 字段 from 表名 as 别名;

在这里插入图片描述

删除数据库

drop database tb;

删除语句

delete from 表名 where 列名='范围';(不加where条件为删除所有的值)

删除表

drop table tabname;(要先使用库)

在这里插入图片描述

删除一个列名

alter table 表名 drop 列名 ;

删除主键

alter table 表名 drop primary key 列名;

修改一个列名

alter table 表名 change 旧列 新列 类型;

修改列名类型

alter table 表名 modify 列名 新类型;

更新某行某个值

update table_name set col1=‘value1’,col2=‘value2’ where where_definition;
update 表名set 列名="值" value 列名="范围"
where 1=1(全选)
or where 1=2(全不选)
不加where条件为修改所有指定列的值

库表属性

显示当前使用数据库

select database();

查看表的属性

desc 表名;

查看库里有多少个表

show tables;

完全查询

select * from 表名;

在这里插入图片描述

选择查询

select 列1,列2,... from表名;

去重查询:distinct
查询所有性别 distinct去重
select distinct gender from student;

在这里插入图片描述

比较运算符条件查询

select ... from 表名 where ...

查询大于18岁的信息:
select * from student where age>18;

逻辑运算符(and、or、not)

年龄不是小于或者等于18 并且是女性
	select * from student where not age <=18 and gender=2;

在这里插入图片描述

模糊查询

like

select * from 表名 where 列名 like '%value%';

占位符:%替换1个或者多个 / _替换1个

查询姓名中以“小”开头的姓名:
	select * from student where name like "小%";   
查询姓名中有“小”的姓名:
	select * from student where name like "%小%"; 
rlike 正则表达式

^表示…开头,$表示…结尾

查询以周开始的姓名
	select name from student where name rlike "^周.*";
查询以 周开始、伦结尾的姓名
	select name from student where name rlike "^周.*伦$";

范围查询

in表示在一个非连续的范围内
查询 年龄为1834 的姓名:
	select name,age from student where age in (18,34);
not in 表示不在一个连续的范围内
查询 年龄不为1834 的姓名:
	select name,age from student where age not in (18,34);	
between… and … 表示在一个连续的范围内

查询年龄在1834之内的信息:
	select name,age from student where age between 18 and 34;
not between… and … 表示在一个连续的范围内
查询年龄不在1834之内的信息:
	select name,age from student where age not between 18 and 34;

空判断

判断is null
判断非空 is not null
判断身高为null的信息
	select * from student where height is null;

聚合函数

总数:count
查询男性有多少人 
	select count(*) as 男性人数 from student where gender=1;
最大值:max
查询最大年龄
	select max(age) as 最大年龄 from student;
查询女性的最高身高
	select max(height) as 最高女性 from student where gender=2;
最小值:min
查询男性的最低身高
	select min(height) as 最低男性 from student where gender=1;
求和:sum
计算所有人的年龄总和
	select sum(age) as 年龄总和 from student;
平均值:avg
计算平均年龄
	select avg(age) as 平均年龄 from student;
	select sum(age)/count(*) from student;

四舍五入查询

round(数,要保留的小数位数)
计算所有人的平均年龄,保留两位小数
	select round(avg(age),2) from student;
计算男性的平均身高,保留两位小数
	select round(avg(height),2) from student where gender=1;

分组查询

select * from 表名 group by 列名;

group_concat()将分组中括号内对应的字符串进行连接
按照性别分组,查询所有的性别
	select gender from student group by gender;
计算每种性别中的人数
	select gender,count(*) from student group by gender;
计算男性的人数
	select gender,count(*) from student where gender=1 group by gender;
查询同种性别中的姓名
	select gender,group_concat(name) from student group by gender;
查询平均年龄超过30岁的性别,以及该性别的人的姓名
	select gender,group_concat(name) from student group by gender having avg(age)>30;
查询每种性别中的人数多于2个的信息
	select gender,group_concat(name) from student group by gender having count(*)>2;

排序查询

order by 字段 desc(降序)/asc(升序)

查询年龄在1834岁之间的男性,按照年龄从小到大排序
	select * from student where gender=1 and age between 18 and 34 order by age asc; 
查询年龄在1834岁之间的女性,按照身高从高到矮排序
	select * from student where gender=2 and age between 18 and 34 order by height desc;
查询年龄在1834岁之间的女性,按照身高从高到矮排序,如果身高相同的情况下按照年龄从小到大排序
	select * from student where gender=2 and age between 18 and 34 order by height asc,age asc;
查询年龄在1834岁之间的女性,按照年龄从小到大,身高从高到矮排序
	select * from student where gender=2 and age between 18 and 34 order by age asc,height desc;

分页查询

limit start,count
查询前5个数据
	select * from student limit 0,5;   (前一个数字表示:起始位置,后一个数字表示:显示个数)
查询6-10(包含)的数据
	select * from student limit 5,5; 
每页显示2个,第1个页面
	select * from student limit 0,2; 
每页显示2个,第2个页面
	select * from student limit 2,2; 
每页显示2个,第3个页面
	select * from student limit 4,2; 
每页显示2个,第4个页面
	select * from student limit 6,2; 
每页显示2个,显示第6页的信息,按照年龄从小到大排序
	select * from student order by age asc limit 10,2;(limit 放在最后)
查询所有女性的信息并按照身高从高到矮排序只显示2个
	select * from student where gender=2 order by height desc limit 2;

连接查询

内连接:inner join … on

内连接只要左右表都匹配的数据,也就是交集

查询有能够对应班级的学生以及班级信息
	select * from student as s inner join classes as c on s.cls_id= c.id ;
按照要求显示姓名、班级
	select s.name,c.name from student as s inner join classes as c on s.cls_id= c.id ;
查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级的名称
	select s.*,c.name from student as s inner join classes as c on s.cls_id= c.id ;
在以上查询中,将班级名显示在第一列
	select c.name,s.* from student as s inner join classes as c on s.cls_id= c.id ;
查询 有能够对应班级的学生以及班级信息,按照班级进行排序
	select c.name,s.* from student as s inner join classes as c on s.cls_id= c.id order by c.name;
当同一个班级的时候,按照学生的id进行从小到大排序
	select c.name,s.* from student as s inner join classes as c on s.cls_id= c.id order by c.name,s.id;
左外连接:left join

无论左表在右表有无匹配,都返回左表的数据,缺失的右表数据为NULL

查询每位学生对应的班级信息
	select * from student as s left join classes as c on s.cls_id= c.id;
查询没有对应班级信息的学生
	select * from student as s left join classes as c on s.cls_id= c.id having c.id is null;
右外连接:right join on

无论右表在左表有无匹配,都返回左表的数据,缺失的右表数据为NULL

	select * from student as s right join classes as c on s.cls_id=c.id;
全外连接

select * from 表名 full/cross join 表名 on 主键等于外键

无论左右表有无匹配,都返回两者的数据,缺失的数据为NULL
由于mysql用不了全外连接所以我用左外连接加上右外连接就可以

select * from student as s left join classes as c on s.cls_id= c.id 
union 
select * from student as s right join classes as c on s.cls_id=c.id;

子查询

select * from 表名 where = (select 列名 from 表名 where 列名='范围');

补充

终端进入MYSQL

mysql -h localhost -u root -p (用root账户登录),然后输入密码;

语句书写顺序

select * from 表名 join on 表名 where group by having union order by limit

约束类型

非空:not null
唯一约束:unique
自增长:auto_increment
设置默认值:default
主键:primary key
外键:foreign key

关键词

or:或
and:和
having:分组后的附加条件
group by:分组
order by:排序 asc升序desc降序
in:存在于某个值中
not in:不存在某个值中
count:计数
avg:平均数
sum:求和
max:最大值
min:最小值
distinct:去重
round:查询所有字段
where 1=1:全选
where 1=2:全不选
limit 1,5:从第一行开始显示5条数据
top 10 :select top 10 * from 表名 显示10条数据
new id():随机
like'%关键字%':取含有关键字的词
inner join...on:内连接表
left join...on:左外连接
right join...on:右外连接
left(right,inner) out join...on:去重

此文章仅用于学习需要,数据来自B站:最详细的MYSQL数据库查询

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值