Msql常用命令详解
1、列的约束
primary key(理解成人的身份证号) 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值;如果的多列组合的主键约束, 那么这些列都不允许为空值,并且组合的值不允许重复。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。MySQL的主键名总是PRIMARY, 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
AUTO_INCREMENT(自增长)
DEFAULT(默认)
unique代表唯一约束。唯一约束是指定table的列或列组合不能重复,保证数据的唯一性
not null为非空约束,指定某一行的值不能为null。
2、查询操作
A:查询所有学生
注意 ; 不能用* 即使要查询所有列 也需要将列名一一列举
查询所有的学生 mysql> select * from t_people; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 7 | 赵云 | 25 | 二年级 | 12839819238 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 14 rows in set
B:查询当前学校有哪些班级(去重-----distinct)
mysql> select distinct grade from t_people; +--------+ | grade | +--------+ | 一年级 | | 二年级 | | 三年级 | | 四年级 | +--------+ 4 rows in set
C:查询每个人三年后的年龄
mysql> select name,age+3 from t_people; +--------+-------+ | name | age+3 | +--------+-------+ | 张三 | 21 | | 李四 | 22 | | 凯瑟琳 | 21 | | 安妮 | 21 | | 马超 | 27 | | 关羽 | 29 | | 赵云 | 28 | | 张飞 | 26 | | 盖伦 | 33 | | 拉克丝 | 31 | | 嘉文 | 35 | | 赵信 | 34 | | 卡尔 | 43 | | 蓝猫 | 46 | +--------+-------+ 14 rows in set
列是支持运算。(所以在设计某些数据库表的时候有的数据可以通过某几列算出来我们就不去他添加这一列)
D:条件查询 where (大于> 小于< 等于 = )
查询年龄大于25的学生 mysql> select * from t_people where age >25; | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 7 rows in set 查询年龄小于25的学生 mysql> select * from t_people where age <25; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | +----+--------+-----+--------+-------------+-----+ 6 rows in set 查询年龄等于25的学生 mysql> select * from t_people where age = 25; +----+------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+------+-----+--------+-------------+-----+ | 7 | 赵云 | 25 | 二年级 | 12839819238 | 1 | +----+------+-----+--------+-------------+-----+ 1 row in set
支持大于> 小于< 大于等于>= 小于等于<= 等于 = 不等于 != <>
查询年龄小于等于25的学生 mysql> select * from t_people where age <= 25; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 7 | 赵云 | 25 | 二年级 | 12839819238 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | +----+--------+-----+--------+-------------+-----+ 7 rows in set 查询年龄不等于25的学生 mysql> select * from t_people where age != 25; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 13 rows in set 查询年龄不等于25的学生 mysql> select * from t_people where age <>25; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 13 rows in set
E:E 多条件查询 ( and 并且 or或者 )
查询年龄大于25并且性别是女的学生 mysql> select * from t_people where age > 25 and sex = 0; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | +----+--------+-----+--------+-------------+-----+ 1 row in set 查询年龄大于25或者性别是女的学生 mysql> select * from t_people where age > 25 or sex = 0; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 9 rows in set
注意:如果条件过于复杂需要添加 ();
F:查询年龄是18|19|35|33的学生
mysql> select * from t_people where age in (18,19,35,33 ); +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | +----+--------+-----+--------+-------------+-----+ 4 rows in set
G:年龄从小到大排列 order by (升序 asc,降序 desc)
查询所有的学生按年龄升序排序 mysql> select * from t_people order by age asc; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 7 | 赵云 | 25 | 二年级 | 12839819238 | 1 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | +----+--------+-----+--------+-------------+-----+ 14 rows in set 查询所有的学生按年龄降序排序 mysql> select * from t_people order by age desc ; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 14 | 蓝猫 | 43 | 四年级 | 12345823573 | 1 | | 13 | 卡尔 | 40 | 四年级 | 12389489324 | 1 | | 11 | 嘉文 | 32 | 三年级 | 12313212312 | 1 | | 12 | 赵信 | 31 | 三年级 | 12312480384 | 1 | | 9 | 盖伦 | 30 | 三年级 | 18281237812 | 1 | | 10 | 拉克丝 | 28 | 三年级 | 12381239918 | 0 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | | 7 | 赵云 | 25 | 二年级 | 12839819238 | 1 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | +----+--------+-----+--------+-------------+-----+ 14 rows in set
H :分组查询和聚合函数
聚合函数(max最大,min最小,avg平均,sum求和,count数量)
查询年龄最大的学生 mysql> select id,name,max(age),grade,tel,sex from t_people; +----+------+----------+--------+-------------+-----+ | id | name | max(age) | grade | tel | sex | +----+------+----------+--------+-------------+-----+ | 1 | 张三 | 43 | 一年级 | 18989898899 | 1 | +----+------+----------+--------+-------------+-----+ 1 row in set 查询年龄最小的学生 mysql> select id,name,min(age),grade,tel,sex from t_people; +----+------+----------+--------+-------------+-----+ | id | name | min(age) | grade | tel | sex | +----+------+----------+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | +----+------+----------+--------+-------------+-----+ 1 row in set 查询所有学生的平均年龄 mysql> select avg(age) from t_people; +----------+ | avg(age) | +----------+ | 26.7857 | +----------+ 1 row in set 求所有学生年龄的总和 mysql> select sum(age) from t_people; +----------+ | sum(age) | +----------+ | 375 | +----------+ 1 row in set 查询每个班的有几个人 mysql> select grade,count(*) from t_people group by grade; +--------+----------+ | grade | count(*) | +--------+----------+ | 一年级 | 4 | | 三年级 | 4 | | 二年级 | 4 | | 四年级 | 2 | +--------+----------+ 4 rows in set 查询每个性别的平均年龄 mysql> select sex,avg(age) from t_people group by sex; +-----+----------+ | sex | avg(age) | +-----+----------+ | 0 | 21.3333 | | 1 | 28.2727 | +-----+----------+ 2 rows in set 查询每个年级的平均年龄 mysql> select grade,avg(age) from t_people group by grade; +--------+----------+ | grade | avg(age) | +--------+----------+ | 一年级 | 18.2500 | | 三年级 | 30.2500 | | 二年级 | 24.5000 | | 四年级 | 41.5000 | +--------+----------+ 4 rows in set 查询平均年龄大于20的班级平均年龄 mysql> select grade,avg(age) from t_people group by grade having avg(age)>20; +--------+----------+ | grade | avg(age) | +--------+----------+ | 三年级 | 30.2500 | | 二年级 | 24.5000 | | 四年级 | 41.5000 | +--------+----------+ 3 rows in set having 相当于给分组查询加限定条件 注意 和聚合一起使用
注意:分组查询( groupby )一般与聚合函数一起使用。
I:模糊查询
查询名字是张开头的学生信息 mysql> select * from t_people where name like '张%'; +----+------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | +----+------+-----+--------+-------------+-----+ 2 rows in set 查询名字中带三的学生的信息 mysql> select * from t_people where name like '%三 %'; +----+------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | +----+------+-----+--------+-------------+-----+ 1 row in set 查询名字有两个字,其中一个是张的学生的信息 mysql> select * from t_people where name like '张_ '; +----+------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 8 | 张飞 | 23 | 二年级 | 18918823784 | 1 | +----+------+-----+--------+-------------+-----+ 2 rows in set
J:分页查询
App中 数据量过大 无法一次展示完 都进行分页展示
分页一般有两种模式
A 方案:前台控制分页(js) 将数据全部查询出来 返回值前台网页,但是展示的时候 通过js 控制只展示某一页的内容
B 方法:数据库控制分页(SQL) 在数据查询阶段 就根据需要展示的页数将数据从数据库中(部分查询只查询其中一页的数据)查询出来 ,展示到前端网页。
思考: 哪种方案好?
A 查询次数少 效率高 但是 一次性查询的数据不能过大否则内存不够。
B 查询次数多 效率一般 但是没有内容不够
需求 例如: 查询班级信息、查询2019年淘宝全年销售记录。
查询三条数据 mysql> select * from t_people limit 3; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | +----+--------+-----+--------+-------------+-----+ 3 rows in set 从索引为0开始查询,查询三条数据 mysql> select * from t_people limit 0,3; +----+--------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+--------+-----+--------+-------------+-----+ | 1 | 张三 | 18 | 一年级 | 18989898899 | 1 | | 2 | 李四 | 19 | 一年级 | 18899998888 | 1 | | 3 | 凯瑟琳 | 18 | 一年级 | 18877776666 | 0 | +----+--------+-----+--------+-------------+-----+ 3 rows in set 从索引为3开始查询,查询三条数据 mysql> select * from t_people limit 3,3; +----+------+-----+--------+-------------+-----+ | id | name | age | grade | tel | sex | +----+------+-----+--------+-------------+-----+ | 4 | 安妮 | 18 | 一年级 | 17766665555 | 0 | | 5 | 马超 | 24 | 二年级 | 18298912898 | 1 | | 6 | 关羽 | 26 | 二年级 | 18388883333 | 1 | +----+------+-----+--------+-------------+-----+ 3 rows in set limit 索引,数量
我们一般都是查询第几页 而limit 是 从索引开始查询。
请问 :
第2页 每页5 limit 5,5
第3页 每页5 limit 10,5
第4页 每页5 limit 15,5
第n页 每页x limit (n-1)x , x
一共有103条数据 每页显示6条 请问 一共多少页? 18页
一共有count条数据 每页显示x条 请问 一共多少页?
(count+x-1)/x