mysql学习笔记

一、https://www.mysql.com/ 官网
二、以管理员身份运行cmd命令,开启SQL服务命令为:net start mysql
三、连接数据库:mysql –uroot –p123456或者mysql –uroot –p回车后输入密码即可
退出SQL:quit命令
四、登录成功后:
查看版本:select version();
查看当前时间:select now();
五、远程连接
运行命令:mysql –hip地址 –uroot –p
•	-h后面写要连接的主机ip地址
•	-u后面写连接的用户名
•	-p回车后写密码
六、数据库操作
    1、 创建数据库:create database 数据库名 charset=utf8;
    2、 删除数据库:drop database 数据库名;
    3、 切换数据库:use 数据库名;
    4、 查看当前选择的数据库:select database();
    5、 显示所有数据库:show databases;
七、表操作
    1、查看当前数据库所有表:show tables;
    2、创建表(auto_increment表示自动增长)
	create  table 表名(列及类型);
	例如:
            create table students(id int auto_increment primary key,sname varchar(10) not null);
    3、修改表
	alter table 表名 add|change|drop 列名 类型;
	例如: alter table students add birthday datetime;
    4、删除表 :drop table 表名;
    5、查看表结构:desc 表名;
    6、更改表名:rename table 原表名 to 新表名;
    7、查看表的创建语句:show create table ‘表名’;
	例如:show create table students;
    8、清空表命令:delete和truncate
         1. delete
            ① 语法:delete from table_name;
            ② 示例:DELETE FROM `order`;
         2. truncate
            ① 语法:truncate table table_name;
            ② 示例:TRUNCATE TABLE `order`;
         3. 区别
            ① 使用delete清空表中的记录,内容的ID仍然从删除点的ID继续建立,而不是从1开始。而
        truncate相当于保留了表的结构而重新建立了一张同样的新表。delete的效果有点像将mysql表中所
        有记录一条一条删除到删完。
            ② 效率上truncate比delete快。但truncate删除后不记录mysql日志,不可以恢复数据。
八、数据操作
查询:select * from 表名
增加:全列插入:insert into 表名 values(...);
     缺省插入:insert into 表名(列1,...) values(值1,...);
     同时插入多条数据:insert into 表名 values(...),(...)...;
  或insert into 表名(列1,...) values(值1,...),(值1,...)...;
 修改:update 表名 set 列1=值1,... where 条件;
      例:update test set name=”Jack” where id = 1;
  删除: delete from 表名 where 条件;
  逻辑删除,本质就是修改操作update
  alter table test add isdelete bit default 0;
  如果需要删除:
	update test set isdelete=1 where id=1;
表company两列(room_num和information)中,information包含A座且id不等于545,66的数据替换掉room_num的数据,information留空操作:
UPDATE company SET room_num=information,information=NULL WHERE information LIKE "%A座%" AND id NOT IN (545,66);

九、备份与恢复
	备份:首先用超级管理员打开cmd,然后进入到mysql目录下:
	    执行命令:mysqldump  –uroot –p数据库名字 > D:/备份文件.sql
根据提示输入mysql密码即可。
	恢复:首先要创建数据库,然后用超级管理员打开cmd,进入到mysql目录下,
	    执行命令:mysql –uroot  –p 数据库名 < D:/备份文件.sql
根据提示输入mysql密码即可。

十、条件语句
select * from 表名 where 条件;
消除重复行distinct:
	select distinct gender from students; 	
比较运算符:
	select * from students where id <= 5;
	select * from students where name !=’张三’;
	select * from students where isdelete=0;
逻辑运算符:(and、or、not)
	select * from students where id >3 and gender=1;
	select * from students where id<=5 or isdelete=1;
模糊查询:like(%表示任意多个任意字符,_表示一个任意字符)
查询姓张的学生:
	select * from students where name like “张%”;
查询姓李且名字是一个字的学生:
	select * from students where name like “李_”;
查询姓张或叫三的学生:
        select * from students where name like “张%” or name like “%三%”;
范围查询:in
查询编号是1或2或5的学生:
        select * from students where id in (1,2,5);
between….and…表示一个连续的范围内
查询学生是3至8的男生:
        select * from students where id between 3 and 8 and gender=1;
空判断:is null
查询没有填写地址的学生:
        select * from students where address is null;
非空判断:is not null
查询填写了地址的学生:
        select * from students where address is not null;
查询填写了地址的女生:
	select * from students where address is not null and gender=0;
优先级:
•   小括号,not,比较运算符,逻辑运算符
•   and比or先运算,如果同时出现并希望先算or,需要结合()使用
十一、聚合
count、max、min、sum、avg
查询学生总数:
        select count(*) from students;
查询男生编号的最大值:
        select max(id) from students where gender=1;
查询未删除的学生编号最小值:
	select min(id) from students where isdelete=0;
 查询男生编号之和:
	select sum(id) from students where gender=1;
查询未删除女生的编号平均值:
	select avg(id) from students where gender=0 and isdelete=0;
多重查询,子查询:
查询第二位名字是倩并且序号id不是85,1,5的最大编号的学生信息:
  select * from students where id=(select max(id) from students where name like "_倩%" and id not in (85,1,5));
十二、分组
查询出男女生的总数:
    select count(*) from students group by gender;
查询男女生总数,并将gender起个别名为性别:
    select gender as 性别,count(*) from students group by gender;

查询男生的总数:
    方案一:select * from students where gender=1;
    方案二:select gender as 性别,count(*) from students group by gender having gender=1;
查询男女生总数,并将数量结果起个别名为‘性别总数’且大于3的结果:
    select gender,count(*) as 性别总数 from students group by gender having 性别总数>3;
对比where与having:
•   where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
•   having是对group by的结果进行筛选
十三、排序
将筛选结果按照id降序排序:
    select * from students order by id desc;
升序排序(默认,asc可不写):
    select * from students order by id asc;
查询未删除的男生信息,并按照学号降序排序:
    select * from students where gender=1 and isdelete=0 order by id desc;
十四、分页
从start开始,获取count条数据, start索引从0开始
select * from 表名 limit start,count;
例:select * from students limit 0,3;
按照id降序筛选出男生信息,并从结果中索引为2的数据开始获取2条数据
	select * from students where gender=1 order by id desc limit 2,2;
已知:每页显示m条数据,当前显示第n页
求总页数:此段逻辑后面会在python中实现:
•	查询总条数p1
•	使用p1除以m得到p2
•	如果整除则p2为总数页
•	如果不整除则p2+1为总页数
每页显示m条数据,显示第n页的数据:
select * from students where gender=1 limit (n-1)*m,m;
十五、关系
外键的级联操作(通过外键约束进行数据的有效性验证)
修改外键的级联操作:
    alter table scores add constraint stu_sco foreign key(stuid) references 
students(id) on delete cascade;
开始创建表的时候可以创建,分数表的stuid关联学生表的id:
    create table scores(id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id);

十六、连接查询
查询每个学生每个科目的分数,结果按照分数排序
    select students.sname,subjects.stitle,scores.score from scores
inner join students on scores.stuid=students.id 
inner join subjects on scores.subid=subjects.id
order by score desc;
查询每个学生每个科目的分数,结果按照分数排序(另一种写法)
    select students.sname,subjects.stitle,scores.score from students
inner join scores on scores.stuid=students.id
inner join subjects on scores scores.subid=subjects.id
order by scores.score desc;
查询学生的姓名、平均分,并且按照平均分降序排序
	select students.sname as 姓名,avg(score)as 平均分 from scores
inner join students on scores.stuid=students.id
group by 姓名
order by 平均分 desc;


查询男生的姓名、总分,并且按照总分降序排序
    select students.sname as 姓名,sum(scores.score)as 总分 from scores 
inner join students on scores.stuid=students.id
where students.gender=1
group by students.sname
order by 总分 desc;

查询未删除科目的名称、最高分、平均分
    select subjects.stitle as 科目,max(scores.score)as 最高分,avg(scores.score)as 平均分 from scores
inner join subjects on scores.subid=subjects.id
where subjects.isdelete=0
group by 科目;
查询未删除科目的名称、最高分、平均分(另一种写法)
    select subjects.stitle as 科目,max(scores.score)as 最高分,avg(scores.score)as 平均分 from subjects
inner join scores on scores.subid=subjects.id
where subjects.isdelete=0
group by 科目;
十七、自关联
# 创建areas表
    create table areas(aid int primary key,atitle varchar(20),pid int,
foreign key(pid) references areas(aid));
# 导入数据
    insert into areas values ('110000', '北京市', null);
# 查询多少个省、自治区、直辖市
    select * from areas where pid is null;
# 查询省的名称为‘山西省’的所有城市
    select * from areas 
where pid=(
select aid from areas
where pid is null and atitle='山西省');
# 查询省的名称为‘河北省’的所有城市
    select city.*,province.atitle from areas as city
inner join areas as province on province.aid=city.pid
where province.atitle='河北省';
# 查询太原市下的区/县
    select  xian.*,city.atitle from areas as xian
inner join areas as city on city.aid=xian.pid
where city.atitle='太原市';
# 查询山西省及其下的市、区/县
select province.atitle as 省份,city.atitle as 市,xian.atitle as '区/县'
from areas as city
inner join areas as province on province.aid=city.pid
inner join areas as xian on xian.pid=city.aid
where province.atitle='山西省';

十八、视图
# 将以下查询语句封装到一个视图里
    select * from scores
inner join students on students.id=scores.stuid
inner join subjects on subjects.id=scores.subid
where subjects.isdelete=0;
# 创建视图
    create view v_stu_sub_sco as
select students.*,subjects.stitle,scores.score from scores
inner join students on students.id=scores.stuid
inner join subjects on subjects.id=scores.subid
where subjects.isdelete=0;
# 查询视图
    select * from v_stu_sub_sco;


十九、事务
要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
查看表的创建语句:show create table students;
修改表类型:alter table '表名' engine=innodb;
事务语句:
开启begin;
提交commit;
回滚rollback;

二十、索引
 查看索引:show index from 表名;
创建索引(字符串类型需指定length):
create index indexName on 表名(表字段名(length));
    create index areas_index on areas(atitle(10));
删除索引:
    drop index stu_index on students;
# 查看索引
    show index from areas;
# 记录语句执行时间
    set profiling=1;
# 执行语句
    select * from areas where atitle='山西省';
# 查看语句执行的时间,0.0021285秒
    show profiles;
# 创建索引
    create index areas_index on areas(atitle(10));
# 执行语句
    select * from areas where atitle='山西省';
# 查看语句执行的时间, 0.0004645秒
    show profiles;
# 删除索引
    drop index areas_index on areas;

 

你可能感兴趣的:(mysql)