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表示在一个非连续的范围内
查询 年龄为18、34 的姓名:
select name,age from student where age in (18,34);
not in 表示不在一个连续的范围内
查询 年龄不为18、34 的姓名:
select name,age from student where age not in (18,34);
between… and … 表示在一个连续的范围内
查询年龄在18到34之内的信息:
select name,age from student where age between 18 and 34;
not between… and … 表示在一个连续的范围内
查询年龄不在18到34之内的信息:
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(升序)
查询年龄在18到34岁之间的男性,按照年龄从小到大排序
select * from student where gender=1 and age between 18 and 34 order by age asc;
查询年龄在18到34岁之间的女性,按照身高从高到矮排序
select * from student where gender=2 and age between 18 and 34 order by height desc;
查询年龄在18到34岁之间的女性,按照身高从高到矮排序,如果身高相同的情况下按照年龄从小到大排序
select * from student where gender=2 and age between 18 and 34 order by height asc,age asc;
查询年龄在18到34岁之间的女性,按照年龄从小到大,身高从高到矮排序
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:去重