文章目录
- 一、Navicat 工具链接 Mysql
- 二、数据库的使用
- 1.常用数据类型
- 2. 建表 create
- 3. 删表 drop
- 4. insert 插入数据
- 5. select 查询数据
- 6. update 修改数据
- 7. delete 删除记录
- truncate table 删除数据
- 三、字段约束
- 字段
- 1. 主键 + 自增
- delete和truncate自增长字段的影响
- 2. 非空 not null
- 3. 唯一 unique
- 4. 默认值 default
- 5. 别名
- 字段别名
- 表别名
- 6. 过滤 distinct
- 四、条件查询
- 1. where 条件
- 2. 运算符的查询语句
- 比较运算符
- 逻辑运算符
- 3. 模糊查询 like
- 4. 范围查询
- 5. 空判断 is null
- 6. 其他练习
- 五、排序 order by
- 六、聚合函数
- 1. count 总记录数
- 2. max/min 最大/小值
- 3. sum 求和
- 4. avg 平均值
- 七、分组
- 1. 分组 group by
- 2. 分组后筛选 having
- having和where筛选的区别
- 八、数据分页
- 1. limit 显示指定的记录数
- 2. 数据分页显示
- 3. 求总页数
- 九、多表链接查询
- 写SQL三步法
- 1.内连接
- 2.左连接
- 3.右链接
- 4. 自关联
- 5. 子查询
- 6. 练习
- 十、MySQL 内置函数
- 1. 字符串函数
- 1. 拼接字符串 concat
- 2. 字符串长度 length
- 3. 截取字符串
- 练习
- 4. 去空格
- 2. 数学函数
- 1. 四舍五入 round
- 2. 随机数 rand
- 3. 日期、时间函数
- 十一、了解
- 1. 视图
- 2. 事务
- 回滚事务操作
- 提交事务
- 3. 索引
- 创建索引
- 查看索引
- 删除索引
- 索引优缺点
- 十二、基于命令行的mysql
- cmd登录之后的命令
- 在命令行下创建和删除数据库
一、Navicat 工具链接 Mysql
连接到Mysql数据库以后,创建数据库。
二、数据库的使用
1.常用数据类型
int
整数,有符号范围(-2147483648 ,2147483647),无符号范围(0,4294967295) ,如: int unsigned, 代表设置一个无符号的整数;
tinyint
小整数, 有符号范围(-128,127), 无符号范围(0,255), 如: tinyint unsigned,代表设置一个无符号的小整数
decimal
小数, 如decimal(5,2)表示共存5位数,小数占2位,不能超过2位;整数占3位,不能超过三位;
varchar
字符串, 如 varchar(3)表示最多存3个字符,一个中文或一个字母都占一个字符; .
datetime
日期时间,范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),如 ‘2024-04-01 20:46:59’。
tips:
注释:--
一般用快捷键ctrl + /
Sql 语言不区分大小写
ctrl + r
快捷执行
2. 建表 create
语法:create table 表名(字段名 字段类型,字段名 字段类型,)
-- 例1: 创建表a,字段要求:nane (姓名),数据类型: varchar(字符串),长度为10
create table a(
name varchar(10)
)
-- 例2:创建表b,字段要求: name(姓名), 数据类型为,varchar(字符串),长度为10;
-- height(身高),数据类型为decimal (小数),一共5位,其中3位整数,2位小数。
create table b(
name varchar(10),
height decimal(5,2)
);
-- 例3:创建表c,字段要求如下:id:数据类型为int(整数);
-- name姓名:数据类型为varchar (字符串)长度为20,
-- age年龄:数据类型为tinyint unsiqned (无符号小整数 0-255)
create table c(
id int,
name varchar(20),
age tinyint unsigned
);
3. 删表 drop
语法1:drop table 表名;
语法2:drop table if exists 表名;
-- 删除表a(再执行删除表a会报错)
drop table a;
-- 删除表a(如果表a存在,就利除表a,如果不存在,什么也不做)
drop table if exists a;
4. insert 插入数据
语法:insert into 表名 values(值,值,值);
-- 往表c 插入数据
insert into c values(001,'mario',23);
指定字段插入 语法:insert into 表名(字段名,字段名) values(值,值);
-- 表c 插人一条记录,只设置id和姓名name
insert into c(id,name) values(2,'anna');
一条语法插入多条记录:insert into 表名 values(值,值),(值,值),(值,值);
-- 表c插入多条记录,用一条insert语句,数据之间用逗号隔开
insert into c values(3,'jone',19),
(4,'kool',21),
(5,'amy',27);
5. select 查询数据
语法:select * from 表名;
-- 查询表c的所有字段
select * from c;
-- 查询表c的name字段
select name from c;
-- 查询表c的字段,顺序可自定义
select name,id,age from c;
6. update 修改数据
语法:update 表名 set 字段=值,字段=值 where 条件;
如果没有where条件代表修改表中所有的记录。
-- 修改表c,所有人的年龄(age字段)改为20
update c set age=20;
如果有where条件修改表中的记录。
-- 修改表c id为3的记录,姓名(name字段)改为 tigger,年龄(age字段)改为25
update c set name='tigger',age=25 where id=3;
update c set name='图图' where name='amy';
update c set age=age+1 where id=3;
7. delete 删除记录
语句:delete from 表名 where 条件;
--删除所有记录
delete from c;
-- 删除表c id=3的记录
delete from c where id=3;
delete from c where id>=3;
truncate table 删除数据
语法:truncate table 表名;
-- 删除表c中所有的记录
truncate table c;
delete 和 truncate区别:
在速度上:truncate > delete;
如果想删除部分
数据用delete
,注意带上where
子句;
如果想保留表
而将所有数据删除
,自增长字段恢复从1开始,用truncate
;
三、字段约束
字段
- 主键(primary key): 值不能重复. auto_increment代表值自增长;
- 非空(not null): 此字段不允许填写空值:
- 唯一(unique): 此字段的值不允许重复;
- 默认值(default): 当不填写此值时会使用默认值,如果填写时以填写为准。
1. 主键 + 自增
创建带约束的表和数据:
语法:
-- 创建表的主键 自增长,
create table 表名(
字段名 数据类型 primary key auto_increment,
字段名 数据类型 约束,
...
);
-- 创建表a id自增长,
create table a(
id int unsigned primary key auto_increment,
name varchar(10),
age int
);
-- 插入数据
insert into a(name,age) values('brown',28),('green',28),('a',45);
-- 插入 指定id值
insert into a values(5,'Jone',34);
-- 再插入 不指定id (此时id自增长只看前一条数据的id值)
insert into a(name,age) values('popol',34);
注意:如果不指定字段,
主键自增长
字段的值可以用占位符
, 0或者null
insert into a values(0,'Jone1',32);
insert into a values(NULL,'Jone2',34);
delete和truncate自增长字段的影响
delete 删除数据:
truncate 删除数据:
2. 非空 not null
语法:
-- not null 字段不能为空
create table 表名(
字段名 数据类型 not null,
...
);
create table b(
id int unsigned,
name varchar(10) not null,
age int
);
insert into b values(1,'anna',28)
-- 报错:name定义非空,如果为空插入失败
insert into b(id,age) values(1,28)
3. 唯一 unique
语法:
-- 创建表a id自增长,
create table 表名(
字段名 数据类型 unique,
...
);
create table d(
id int unsigned,
name varchar(10) unique,
age int
);
insert into d values(1,'anna',28)
-- name 字段unique代表唯一 值不能重复插入
insert into d values(2,'anna',23)
4. 默认值 default
当一个字段有默认值约束插入数据时如果指定了值那么默认值无效;如早没有指定值,会使用默认值xx
语法:
create table 表名(
字段名 数据类型 default xx,
...
);
create table e(
id int unsigned,
name varchar(10),
age int default 20
);
-- 插入 指定age的值
insert into e values(1,'anna',28)
-- 插入 不指定age的值,会使用默认值 20
insert into e(id,name) values(2,'anna')
5. 别名
字段别名
通过字段名 as别名的语法可以给字没起一个别名,别名可以是中文
as可以省略
字段名as别名和 字段名 别名结果是一样的
-- 通过as给字段起一个别名
select name as 姓名,sex as 性别 from students;
-- 别名的as可以省略
select name 姓名,sex 性别 from students;
表别名
-- 通过 表名as别名 起一个别名
select * from students as stu;
-- 别名的as可以省略
select * from students stu;
6. 过滤 distinct
通过 select distinct 字段名,字段名 from 表名
来过滤select查询结果中的重复记录。
select distinct sex,class from students;
四、条件查询
1. where 条件
-- 查询students 表中学号studentNo ="001"的记录
select * from students where studentNo ="001";
-- 查询students 表中年龄age等于30的姓名name,班级class
select name,class from students where age=30;
2. 运算符的查询语句
比较运算符
<
小于
<=
小于等于
>
大于
>=
大于等于
!=
和 <>
不等于
-- 查询students 表中name (姓名)等于"小乔学生的age (年龄)
select age from students where name ='小乔';
-- 查询students表中30岁和30岁以下的学生记录
select * from students where age <= 30;
-- 查询class 班级为"1班"以外的学生记录
select * from students where class!="1班";
逻辑运算符
-- 条件 and 条件(条件都需满足)
-- 查询age年龄小于30, 并且sex 性别为"女"的同学记录
select * from students where age<30 and sex="女";
-- 条件 or 条件(条件满足一个即可)
-- 查询sex性别为‘女’或者class班级为”1班’的学生记录
select * from students where sex='女' or class="1班";
-- not 条件 (如果条件为满足,not后变为不满足。如果条件为不满足,not后变为满足;)
-- 查询hometown老家非天津的学生记录
select * from students where not hometown='天津';
3. 模糊查询 like
%
代表任意多个字符
_
代表任意一个字符
-- 查询name姓名中以孙开头的学生记录
select * from students where name like '孙%';
-- 查询name为任意姓,名叫"乔"的学生记录
select * from students where name like '%乔';
-- 查询name姓名有'白"的学生记录
select * from students where name like '%白%';
-- 查询name 姓名以"孙"开头,且名后只有一个字的学生记录
select * from students where name like '孙_';
-- 查询name 姓名为两个字的学生记录
select * from students where name like '__';
4. 范围查询
in(值,值,值)
-->非连续
范围查找
between 开始值 and 结束值
-->连续
范围找包含开始值包含结束值
-- 查询hometown 家乡是"北京或"上海"或"广东'的学生记录
select * from students where hometown in('北京','上海','广东');
select * from students where hometown='北京' or hometown='上海' or hometown='广东';
-- 查询age年龄为25至30的学生记录
select * from students where age between 25 and 30;
select * from students where age >=25 and age <=30;
5. 空判断 is null
注意: null
与' '
是不同的
null
: 代表什么都没有;
' '
:代表长度为0的字符串;
is null
: 是否为 null;
is not null
: 是否不为null;
-- 空判断 is null
-- 查询card身份证为null的学生记录
select * from students where card is null;
-- 非空判断 is not null
-- 查询card身份证非null 的学生记录
select * from students where card is not null;
6. 其他练习
-- 修改age为25, 并且name为"孙尚香"的学生,class 为"2班'
update students set class="2班" where age=25 and name="孙尚香";
-- 删除class为"1班",并且age大于30的学生记录
delete from students where class="1班" and age > 30;
五、排序 order by
asc
代表从小到大
升序,这可以省略。
desc
代表从大到小
降序,不可以省略。
当一条select语句出现了where 和order by
语法:select * from 表名 where 条件 order by 字段1,字段2;
-- 查询所有学生记录,按age年龄从大到小排序,年龄相同时,再按studentNo 学号从小到大排序
select * from students order by age desc, studentNo;
-- 查询所有男学生记录,按class班级从小到大排序,班级相同时,再按studentNo 学号再按学号从大到小排序
select * from students where sex="男" order by class,studentNo desc;
六、聚合函数
注意
:
聚合函数不能用到 where后面的条件里。
聚合函数不能与普通字段同时出现在查询结果中
1. count 总记录数
count求select返回的记录总数
count(字段名)
-- 查询学生总数(查询stuents表有多少记录)
select count(*) from students;
-- 查询女同学数量
select count(*) from students where sex ="女";
-- 查询过滤相同性别后的总数
select count(distinct sex) from students;
2. max/min 最大/小值
max(字段名)
min(字段名)
-- 查询最大年龄
select max(age) from students;
-- 查询女同学最大的年龄
select max(age) from students where sex ="女";
select min(age) from students;
3. sum 求和
sum(字段名)
-- 查询女同学的年龄总和
select sum(age) from students where sex ="女";
4. avg 平均值
avg(字段名)
-- 查询女同学的平均年龄
select avg(age) from students where sex ="女";
avg的字段中如果有null值,这条null数据不参与计算平均值
七、分组
1. 分组 group by
按照字段分组。表示此字段相同的数据会被放到一个组中;
分组的目的是配合聚合函数,聚合函数会对每一组的数据分别进行统计;
语法:
select 字段1,字段2,聚台函数... from 表名 group by 字段1,字段2...
select * from 表名 where 条件 group by 字段 order by 字段;
group by
就是配合聚合函数使用的,不然没有意义!
-- 查询 男女同学的数量
select sex,count(*) from students group by sex;
-- 分别查询'1班',不同性别同学的数量
select sex,count(*) from students where class="1班" group by sex;
小练习:
统计各个班级学生总数、平均年龄、最大年龄、最小年龄。但不统计'3班",统计结果按班级名称从大到小排序
select class,count(*) 总数,avg(age),max(age),min(age) from students where
class!='3班' group by class order by class desc;
2. 分组后筛选 having
having 总是出现在group by语句之后。
having 后面可以使用聚合函数。
语法:
select字段1,字段2,聚合... from 表名 group by 字段1,字段2,字段3...having 字段1,...聚合...
-- 用where查询男生总数
-- where先筛选复合条件的记录,然后在聚合统计
select count(*) from students where sex="男"
-- 用having查询男生总数
-- having先分组聚合统计,在统计的结果中筛选
select count(*) from students group by sex having sex="男";
having配合聚合函数的使用:
-- 求班级人数大于3人的班级名字
select class from students group by class having count(*) > 3;
having和where筛选的区别
where是对表的原始数据进行筛选。
having是对group by之后已经分过组的数据进行筛选。
having可以使用聚合函数,where不能用聚合函数
八、数据分页
1. limit 显示指定的记录数
语法:select * from表名where条件group by字段order by字段limit start, count
limit总是出现在select语句的最后
start代表开始行号,行号从0开始编号
count代表要显示多少行
省略start,默认从0开始,从第一行开始
-- 查询前三行记录
select * from students limit 0,3;
select * from students limit 3;
-- 查询从第4条记录开始的三行记录
select * from students limit 3,3;
当有where或者group by或者order by ,limit总是出现在最后
-- 查询年龄最大同学的name
select name from students order by age desc limit 1;
-- 查询年龄最小女同学的name
select name from students where sex='女' order by age limit 1;
2. 数据分页显示
m 每页显示多少条记录
n 第n页
把计算结果写到limit后面:imit(n-1)* m, m
-- 每页显示4条记录,第3页的结果
select * from students limit 8,4
-- 每页显示4条记录,第2页的结果
select * from students limit 4,4
3. 求总页数
已知每页记录数,求一张表需要几页显示完 ,
。求总页数
。总页数/每页的记录数
。如果结果是整数,那么就是总页数,如果结果有小数,那么就在结果的整数上+1
-- 每页显示5条记录,分别多条select显示每页的记录
select * from students limit 5;
select * from students limit 5,5;
select * from students limit 10,5;
九、多表链接查询
写SQL三步法
- 搭框架
基本的select语句框架搭建起来,如果有多表,把相应的多表也联合进来。 - 看条件
决定where后面的具体条件 - 显示的字段
select后面到底要显示什么字段
1.内连接
把两张表相同的地方查询出来
内链接最重要的是找对两张表要关联的字段
语法1:select * from 表1 inner join 表2 on 表1.字段=表2.字段;
语法2:select * from 表1,表2 where 表1.字段=表2.字段;
(隐式内连接)
-- students表与socres内连接,只显示name,课程号,成绩
select name 姓名,courseNo 课程号,score 成绩
from students stu
inner join scores sc
on stu.studentNo = sc.studentNo;
- 带有 where条件的内连接
语法:select * from 表1 inner join 表2 on 表1.字段=表2.字段 where 条件;
-- 查询王昭君,并且成绩小于90 的信息,要求只显示姓名、课程号、成绩
select name,courseNo,score from students stu
inner join scores sc on stu.studentNo = sc.studentNo
where name='王昭君' and score < 90;
- 多表内链接
-- 三张表的链接
select * from students stu
inner join scores sc
on stu.studentNo = sc.studentNo
inner join courses cs
on sc.courseNo=cs.courseNo;
-- 查询所有学生的" linux"课程成绩,要求只显示姓名、成绩、课程名
select name,score,coursename from students stu
inner join scores sc
on stu.studentNo = sc.studentNo
inner join courses cs
on sc.courseNo=cs.courseNo
where coursename='linux';
- order by内连接
-- 查询成绩最高的男生信息,要求显示姓名、课程名、成绩
select name,score,coursename from students stu
inner join scores sc
on stu.studentNo = sc.studentNo
inner join courses cs
on sc.courseNo=cs.courseNo
where sex='男'
order by score desc limit 1;
2.左连接
包括了内连接,同时还查询左表特有的内容
不存在的数据使用null填充
语法1:select * from 表1 left join 表2 on 表1.字段=表2.字段;
3.右链接
包括了内连接,同时还查询右表特有的内容
不存在的数据使用null填充
语法1:select * from 表1 right join 表2 on 表1.字段=表2.字段;
4. 自关联
自关联是同一张表做连接查询;
自关联下,一定找到同一张表可关连的不同字段。
-- 查询省的个数
select count(*) from areas where pid is null;
-- 查询 广东省有多少个市
select * from areas a1 INNER JOIN areas a2 on a1.id=a2.pid
WHERE a1.name='广东省';
5. 子查询
子查询是嵌套到主查询里面的
子查询做为主查询的数据源或者条件
子查询是独立可以单独运行的查询语句
主查询不能独立独立运行,依赖子查询的结果
-- 查询 年龄比平均年龄大的所有学生
select * from students where age > (select avg(age) from students);
表级子查询:
-- 查询所有女生的信息和成绩
-- 子查询
select * from (select * from students where sex='女') stu
inner join scores sc on stu.studentNo = sc.studentNo
-- 内连接
select * from students stu inner join scores sc
on stu.studentNo = sc.studentNo
where sex ='女';
6. 练习
表:
-- 1.1列出男职工的总数和女职工总数
select count(*) from employees group by sex;
-- 1.2列出非党员职工的总数
select count(*) 总数 from employees where politicalstatus!='党员';
-- 1.3列出所有职工工号,姓名以及所在部门名称
select employees.deptid,employees.empname,departments.deptname from employees
inner join departments on employees.deptid=departments.deptid;
-- 1.4列出所有职工工号,姓名和对应工资
select employees.deptid,employees.empname,salary.salary from employees
inner join salary on employees.empid=salary.empid;
-- 1.5列出领导岗的姓名以及所在部门名称
select employees.empname,departments.deptname from employees
inner join departments on employees.deptid=departments.deptid
where employees.leader is null;
-- 1.6列出职工总人数大于4的部门号和总人数
select count(*) 总人数,departments.deptid from employees
inner join departments on employees.deptid=departments.deptid
group by employees.deptid
having count(*) > 4;
-- 1.7列出职工总人数大于4的部门号和部门名称
select count(*) 总人数,departments.deptname from employees
inner join departments on employees.deptid=departments.deptid
group by employees.deptid
having count(*) > 4;
-- 1.8列出开发部和测试部的职工号,姓名
select employees.empname,departments.deptid from employees
inner join departments on employees.deptid=departments.deptid
where departments.deptname in('开发部','测试部');
-- 1.9列出市场部所有女职工的姓名和政治面貌
select e.empname,d.deptid from employees e
inner join departments d on e.deptid=d.deptid
where d.deptname='市场部' and e.sex='女';
-- 1.10显示所有职工姓名和工资,包括没有工资的职工姓名
select e.empname,s.salary from employees e
left join salary s on e.empid=s.empid;
-- 1.11求不姓孙的所有职工工资总和
select sum(salary) from employees e
inner join salary s on e.empid=s.empid
where not e.empname like '孙%';
十、MySQL 内置函数
内置函数可以用在 where条件后面,聚合函数一定不可以!
1. 字符串函数
1. 拼接字符串 concat
concat(参数1,参数2,参数3,参数n)
参数可以是数字,也可以是字符串
把所有的参数连接成一个完整的字符串
select concat(11,'sj21','000') -- 11sj21000
2. 字符串长度 length
注意:一个utf8格式的汉字,length返回3
select length('sj21000') -- 7
select length('我是猪猪') -- 12
-- 查询表students 中name长度等于9 (三个utf8格式的汉字)的学生信息
select * from students where length(name) = 9;
3. 截取字符串
汉字、字母不区分
left(str,n)
从左截取 n个字符
select left('是猪猪ooo',4) -- 是猪猪o
right(str,n)
从右截取 n个字符
select right('是猪猪ooo',4) -- 猪ooo
substring(str,star,n)
从star截取 n个字符
select substring('是猪猪ooo',2,3) -- 猪猪o
练习
-- 截取students 表中所有学生的姓
select left(name,1) from students;
select substring(name,1,1) from students;
-- 查询students 表的card 字段,截取出生年月日,显示李白的生日
select name,substring(card,7,8) from students where name='李白';
-- 查询students 表的所有学生信息,按生日从大到小排序
select * from students order by substring(card,7,8);
4. 去空格
ltrim(str)
去除左边空格rtrim(str)
去除右边空格trim(str)
去除两边空格
select ltrim(' 是猪猪ooo ')
select rtrim(' 是猪猪ooo ')
select trim(' 是猪猪ooo ')
2. 数学函数
1. 四舍五入 round
round(n,d)
n表示原数,d表示小数位置,默认为0
-- 四舍五入,保留整数位
select round(1.658) -- 2
-- 四舍五入,保留小数点后2位
select round(1.658,2) -- 1.66
-- 查询students表中学生的平均年龄,并四舍五入
select round(avg(age)) from students;
2. 随机数 rand
round();
每次运行会产生一个从0-1之间的浮点数
经常用rand进行随机排序: order by rand()
select rand();
-- 从学生表中随机抽出一个学生
select name from students order by rand() limit 1;
3. 日期、时间函数
-- current date返回系统日期
select current_date();
-- current time返回系统时间
select current_time();
-- 返回系统日期与时间
select now();
-- 插入当前时间
insert into a values(1,now())
十一、了解
1. 视图
视图就是对select语句的封装
视图可以理解为一张只读的表,针对视图只能用select
,不能用delete和update
-- 创建一个视图,查询所有男生信息
create VIEW stu_male as
select * from students where sex='男';
-- 使用视图
select * from stu_male INNER JOIN scores
on stu_male.studentNo = scores.studentNo;
-- 删除视图
drop VIEW stu_male;
drop VIEW if EXISTS stu_male;
2. 事务
事务广泛的运用于订单系统、银行系统等多种场景;
事务是多条更改数据操作sql语句集合
一个集合数据有一致性,要么就都失败,要么就都成功
- begin --开始事务
- rollback --回滚事务,放弃对表的修改
- commit --提交事务,对表的修改生效
没有写begin代表没有事务,没有事务的表操作都是实时生效。
如果只写了begin,没有rollback,也没有commit,系统退出,结果是rollback
回滚事务操作
-- 开启事务,
-- 删除students 表中studentNo 为001 的记录,
-- 同时删除scores 表中studentNo 为001 的记录,
-- 回滚事务,两个表的删除同时放弃
-- 开始事务
begin;
delete from students where studentNo='001';
delete from scores where studentNo='001';
-- 回滚事务,放弃更改
rollback;
select * from students;
select * from scores;
提交事务
-- 开启事务,
-- 删除students 表中studentNo 为001 的记录,
-- 同时删除scores 表中studentNo 为001 的记录,
-- 提交事务,两个表的删除同时生效
-- 开始事务
begin;
delete from students where studentNo='001';
delete from scores where studentNo='001';
-- 提交事务,一旦提交,两个删除操作同时生效
commit;
select * from students;
select * from scores;
3. 索引
index
给表建立索引,目的是加快select查询的速度
如果一个表记录很少,几十条,或者几百条,不用索引
表的记录特别多,如果没有索引I,select语句效率会非常低
创建索引
语法:create index 索引名称 on 表名(字段名称(长度);
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致;
字段类型如果不是字符串, 可以不填写长度部分。
-- 例1:为表students的age字段创建索引,名为age_ index
create index age_index on students(age);
-- 例2:为表students的name字段创建索引,名为name_ index
create index name_index on students(name(10);
-- 查询表中age等于30的学生
-- 这里会自动调用age_index
select * from students where age=30;
-- 不会调用任何索引,因为sex字段没有索引
select * from students where sex='女';
查看索引
语法:show index from 表名;
show index from students;
删除索引
语法:drop index 索引名 on 表名;
drop index age_index on students;
索引优缺点
提高select的查询速度;
降低update,delete和insert语句的执行速度;
项目中80%以上是select,所以index必须的;
在实际工作中如果涉及到大量的数据修改操作,修改之前可以把索弓|删除修改完成后再把索引建立起来。
十二、基于命令行的mysql
mysql -h mysql的服务器的地址 -u 用户名 -p
如果是使用本机的mysql: mysql -u root -p
cmd登录之后的命令
show databases
显示系统所有的数据库;- use 数据库名:使用指定的一个数据库
使用mydb数据库:use mydb
show tables
查看指定数据库有多少表
如果命令行默认字符集与数据库默认字符集不同
在windows默认字符集是gbk:set names gbk;
告诉mysql,客户端用的字符集是gbk
选择了数据库以后就可以查看数据库有多少表
在命令行中每条sgl语句用;
结尾
可以通过desc表名查看一个表的字段结构:
desc students
- 查看students每个字段的定义
在命令行下创建和删除数据库
create database 数据库名 default charset 字符集
--创建一个数据库mytest ,默认字符集为utf8
create database mytest default charset utf8;
-- 删除数据库mytest
drop database mytest
drop database if exists mytest;