MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
数据库的基础操作
1.创建数据库
create database 数据库名;
如不确定将要创建的数据库是否已经存在
create database if not exists 数据库名;
注意
数据库名一般不可以是SQL中的关键字(如create 、database、where、between…)
当然如果非要使用关键字命名,当然也可以,借助``
create database `数据库名`;
2.显示数据库
show databases;
3.使用数据库
use 数据库名;
4.删除数据库
drop database 数据库名
注意
- 删除和使用关键字命名的数据库时,也是需要加上``;
- 删除不存在的数据库时会报错,如果不确定要删除的数据库是否存在时,也可以加个判断条件,如果数据库存在则删除,不存在则报警告
drop database if exits 数据库名;
表的基础操作
也可以使用MySQL + Navicat,大家可以去网上找相关的教程进行下载安装、操作使用。
1.创建表
create table 表名(数据类型 字段名,数据类型 字段名...)
// create table student (name varchar(20) comment '姓名', age int -- '年龄')
// 使用comment 或 -- (空格)添加注释
2.显示表
show tables;
3.查看表结构
desc 表名;
4.删除表
drop table 表名;
// 或者
drop table if exits 表名;
//删除指定行
delete from 表名 条件
// delete from student where name = '张三'
5.新增数据
//单行数据全列插入
insert into 表名 values (数据,数据...);
//单行数据指定列插入
insert into 表名(字段名,字段名...) values (数据,数据);
//多行数据全列插入
insert into 表名 values (数据,数据...),(数据,数据...),...,(数据,数据...);
注意 插入数据时,数据的类型以及数量要和表中定义的类型和数量一致
6.查询数据
//全列查询
select * from 表名;
//指定列查询
select 列名,列名... from 表名;
//别名
select 列名 as 别名 from 表名;
//select name as '姓名' from student
//关键字 as 可以省略,但不建议
7.去重
select distinct 列名 from 表名;
注意 如果同时给多个列去重,那么需要对应行的对应列都重复才能去重成功
8.排序
//asc(升序)、desc(降序)
//升序时的关键字 asc 可以省略,但不建议
select 列名 from 表名 order by 待排序的列名 asc/desc;
注意
- null数据视为比任何数值都小,升序时在最上面,降序时在最下面
- 可以对多个列进行排序,排序优先级按照书写顺序
9.条件查询
//(1) 查询分数大于90分的同学:
select name, score from student where score > 90
//(2) 查询年龄大于18并且分数大于90分的同学:
select * from student where age > 18 and score > 90
//(3) 查询年龄大于18,或者分数大于90分的同学:
select * from student where age > 18 or score > 90
//(4) 查询分数在[90,100]的同学(使用and也可以做到,但是and的效率不如between高):
select * from student where score between 90 and 100
//(5) 查询年龄是18或20岁的同学(使用 or 也可以做到,但是效率不如 in):
select * from student where age in (18,20)
//(6)%模糊查询(% :表示任意0个或多个字符)
//一般为:SELECT 字段 FROM 表 WHERE 某个字段 LIKE 条件
//将会把name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。
select * from student where name like '%三%'
//需要找出name中既有“三”又有“猫”的记录,请使用and条件
select * from student where name like '%三%' and name like'%猫%'
//虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。
select * from student where name like '%三%猫%'
//(7)_模糊查询(_ : 表示任意单个字符),常用来限制表达式的字符长度语句
//只找出“唐三藏”这样name为三个字且中间一个字是“三”的;、
select * from student where name like '_三_'
//只找出“三脚猫”这样name为三个字且第一个字是“三”的;
select * from student where name like '三__';
//(8)[]模糊查询([]:表示括号内所列字符中的一个,类似正则表达式)
//找出“张三”、“李三”、“王三”(而不是“张李王三”)
select * from student where name like '[张李王]三'
//如 [] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
select * from student where name like '老[1-9]'
注意
- 条件查询可以使用表达式,但不能使用别名,因为条件查询执行的优先级高于别名查询
- and 的优先级高于 or ,可以使用()来选中需要优先执行的语句
10.分页查询
limit n : 返回 n 条
offset m : 跳过 m 条记录, 默认 m=0, 单独使用似乎不起作用
select 列名 from 表名 limit n; (从第0行往后查询n行数据)
select 列名 from 表名 limit n offset m; (从第m行往后查询n行数据)
select 列名 from 表名 limit n,m (相当于 limit m offset n , 从第 N 条开始, 返回 M 条)
//(1) 查询分数前三高的同学
select * from student order by score desc limit 3
//(2)从第2行往后查询分数前三高的同学
select * from student order by score desc limit 3 offset 2
注意
客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:
查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
查询第10条到第20条的数据的sql是:select * from table limit 10,10; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;
通过上面的分析,可以得出符合我们需求的分页sql格式是:
select * from table limit (start-1)*pageSize,pageSize;
11.修改数据
//(1) 修改指定行的指定列
update 表名 set 列名 = 表达式 where 条件
// update student set score = 100 where name = '张三'
//(2) 修改指定行的所有列
update 表名 set 列名 = 表达式;
// update student set score = 0