一、基本命令
1、启动服务
说明:以管理员身份运行cmd
格式:net start 服务名称
示例:net start mysql57
#在Linux启动和关闭mysql、MongoDB、Redis
sudo service mysql start
mysql -u root -p
sudo service mysql stop
2、停止服务
说明:以管理员身份运行cmd
格式:net stop 服务名称
示例:net stop mysql57
3、连接数据
mysql -u 用户名 -p
示例:mysql -u root -p
4、退出登录(断开连接)
quit或exit
5、查看版本
示例:select version();(连接后可以执行)
6、显示当前时间
示例:select now();(连接后可以执行)
7、远程连接
格式:mysql -h ip地址 -u 用户名 -p
输入对方mysql密码
二、数据库操作
创建数据库
create database 数据库名 charset=utf8;
删除数据库
drop database 数据库名;
切换数据库
use 数据库名;
查看当前选择的数据库
select database();
三、表操作
查看当前数据库中所有表
show tables;
查看表结构
desc 表名;
查看建表语句:
show create table 表名 \G;
虽然 desc 命令可以查看表定义,但是其输出的信息还是不够全面,,为了查看更全面的表定义信息,有时就需要通过查看创建表的 SQL 语句来得到。
可以看到表定义、表的 engine(存储引擎)和 charset(字符集)等信息。
\G”选项的含义是使得记录能够按照字段竖着排列,对于内容比较长的记录更易于显示。
重命名表名
格式:rename table 原表名 to 新表名;
修改表结构
格式:alter table 表名 add|change|drop 列名 类型;
示例:alter table newcar add isDelete bit default 0;
注意:删除的时候不用指定类型。
使用change的时候也有不同:change紧跟着的是你要修改的字段名,然后指定新字段名及类型:
alter table username change isDelete isDelete bit default 0;
另:使用modify(v.调整,改进)可直接修改字段类型。但不能修改列名。
alter table username modify isDelete bit default 0;
查询表中的全部数据
select * from 表名;
select * from student; select后面写表中的列名,如果是*表示在结果集中显示表中的所有列
select name, age from student; 如果要查询多个列,之间使用逗号分隔
select name as a, age from student; 可以使用as为列起别名,这个别名显示在结果中。
删除表
drop table 表名;
创建表
#格式:
create table 表名(列及类型);
#说明
auto_increment表示自增长
primary key表示主键
not null表示不为空
bit 二进制,通常来表示布尔类型
default 默认值
if not exists 若不存在
#示例:
create table if not exists st(id int auto_increment primary key, name varchar(20) not null, age int not null, gender bit default 1, address varchar(20), isDelete bit default 0);
四、数据操作
增加数据
a、全列插入
格式:insert into 表名 values(...);
说明:主键列是自动增长,但是在全列插入时需要占位,通常使用0,一般第一行作为主键。
示例:insert into student values(0,"tom",19,1,"北京",0);
b、缺省插入(插入部分列内容)
格式:insert into 表名 (列1,列2,……) values (值1,值2,……);
示例:insert into student(name,age,address) values("lilei",19,"上海");
注意:不能为空的列和没有设置默认值的列也全部要输入内容。
c、同时插入多条数据(不能缺省数据)
格式:insert into 表名 values(...),(...),……
示例:insert into student values(0,"hanmeimei",18,0,"北京",0),(0,"poi",22,1,"海南",0),(0,"wenli",20,0,"石家庄",0);
按条件查删改
1.删(没有条件是全部删除,慎用
格式:delete from 表名 where 条件;
示例:delete from student where id=4;
2.改(没有条件是全部列都修改,慎用
格式:update 表名 set 列1=值1,列2=值2,…… where 条件;
示例:update student set age=16 where id=7;
3.条件查询
语法:select * from 表名 where 条件
示例:select * from student where id>7 and gender=0;
注意优先级:小括号>not>比较运算符>and>or
a、比较运算符
等于 =
大于 >
小于 <
大于等于 >=
小于等于 <=
不等于 !=或<>
b、逻辑运算符
and 并且
or 或者
not 非
优先级:
not>and>or
c、模糊查询
语法:列名 like "_"/"%";
%表示任意多个任意字符
_表示一个任意字符
select * from student where name like "习__"; 查询名字以习开头的三个字的同学
select * from student where name like "%蛋" and gender != '男' and gender != '1'and age = 18;查询名字以蛋结尾的,并且不是男生,年龄大于18的学生。
d、范围查询
in/not in 表示在一个非连续的范围内
between...and... 表示在一个连续的范围内
示例:select * from student where id in (8,10,12);查询编号为8、10、12的学生
select * from student where id between 6 and 8;查询编号为6到8的学生
e、空判断
注意:null为空,""只是空字符串。
判断空: is null
判断非空:is not null
示例:select * from student where address is null;
4.删除重复行:
在正常查询的列名前加distinct
语法:select distinct 列名 from 表名 where 条件;
5.聚合函数
例如:
查询学生总数
select count(*) from student;
查询女生的编号最大值
select max(id) from student where gender=0;
查询所有学生的年龄和
select sum(age) from student;
查询所有学生的年龄平均值
select avg(age) from student;
a、count() 表示计算总行数,括号中可以写【*】或列名
b、max(列) 表示求此列的最大值
c、min(列) 表示求此列的最小值
d、sum(列) 表示求此列的和
e、avg(列) 表示求此列的平均值
6.分组
按照列名字段分组,表示此字段相同的数据会被放到一个集合中并被聚合计算.
分组后,只能查询出相同的数据列,对于有差异的数据列无法显示在结果集中,可以对分组后的数据进行统计,做聚合运算.
语法:
select 列1,列2,聚合…… from 表名 group by 列1,列2,列3,……[with rollup][having 条件查询]
# WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总
# HAVING 关键字表示对分类后的结果再进行条件的过滤。
分组后的数据筛选:
where与having的区别:
1、where是对from后面指定的表进行筛选,属于对原始数据的筛选
2、having是对group by分类后的结果再进行条件的过滤
select 列1,列2,聚合…… from 表名 group by 列1,列2,列3,…… having 列1,……聚合……;
例1,
要 emp 表中统计公司的总人数:
select count(1) from emp;
在此基础上,要统计各个部门的人数:
select deptno,count(1) from emp group by deptno;
更细一些,既要统计各部门人数,又要统计总人数:
select deptno,count(1) from emp group by deptno with rollup;
统计人数大于 1 人的部门:
select deptno,count(1) from emp group by deptno having count(1)>1;
最后统计公司所有员工的薪水总额、最高和最低薪水:
select * from emp;查看薪水是哪个列名
select sum(sal),max(sal),min(sal) from emp;
示例2:#将数据表按性别进行分组,并统计每个性别有多少条记录
select gender,count(*) from student group by gender;
select name,gender,count(*) from student group by gender,age;
7.排序
语法:select * from 表名 order by 列1 asc|desc,列2 asc|desc , ……;
说明:
a、将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序
b、默认按照从小到大的顺序排序
c、asc升序
d、desc降序
f、如果只有一个排序字段,则这些字段相同的记录将会无序排列
需求:将没有被删除的数据按年龄排序
select * from student where isDelete=0 order by age desc;
select * from student where isDelete=0 order by age desc, id desc;
8.分页
语法:
select * from 表名 limit start,count;
select * from student limit 3; 只写一个则start索引默认从0开始
select * from student limit 3,3;表示从第四条记录开始,显示3条记录
select * from student where gender=1 limit 0,3;
表连接
表连接分为内连接和外连接
最主要区别:
是內连接仅选出两张表中互相匹配的记录
而外连接会选出其他不匹配的记录。我们最常用的是内连接。参考链接:
https://blog.csdn.net/plg17/article/details/78758593
https://www.cnblogs.com/clphp/p/6256757.html
例如:查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和dept 中,因此,需要使用表连接来进行查询:
mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
- 内连接:inner join on
- 组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集部分。
- 外连接
- 左连接:left join on / left outer join on
- 左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
- 右连接:right join on / right outer join on
- 左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。
- 左连接:left join on / left outer join on
A_id | A_name | A_part |
---|---|---|
1 | 张三 | 经理部 |
2 | 李四 | 秘书部 |
3 | 王二 | 设计部 |
4 | 赵五 | 运营部 |
B_id | B_name | B_part |
---|---|---|
2 | 李四 | 秘书部 |
3 | 王二 | 设计部 |
5 | 老刘 | 人事部 |
6 | 老黄 | 销售部 |
现有两表A_table 和 B_table
1、内连接:select * from A_table inner join B_table on A_table.A_id = B_table.B_id;
A_id | A_name | A_part | B_id | B_name | B_part |
---|---|---|---|---|---|
2 | 李四 | 秘书部 | 2 | 李四 | 秘书部 |
3 | 王二 | 设计部 | 3 | 王二 | 设计部 |
2、select * from A_table left join B_table on A_table.A_id = B_table.B_id;
A_id | A_name | A_part | B_id | B_name | B_part |
---|---|---|---|---|---|
2 | 李四 | 秘书部 | 2 | 李四 | 秘书部 |
3 | 王二 | 设计部 | 3 | 王二 | 设计部 |
1 | 张三 | 经理部 | NULL | NULL | NULL |
4 | 赵五 | 运营部 | NULL | NULL | NULL |
3、select * from A_table right outer join B_table on A_table.A_id = B_table.B_id;
A_id | A_name | A_part | B_id | B_name | B_part |
---|---|---|---|---|---|
2 | 李四 | 秘书部 | 2 | 李四 | 秘书部 |
3 | 王二 | 设计部 | 3 | 王二 | 设计部 |
NULL | NULL | NULL | 5 | 老刘 | 人事部 |
NULL | NULL | NULL | 6 | 老黄 | 销售部 |
子查询
某些情况下,当我们查询的时候,需要的条件是另外一个select 语句的结果,这个时候,就要用到子查询。
关键字主要包括 in、not in、=、!=、exists、not exists 等。
《深入浅出MYSQL第二版》P49
mysql> select * from emp;
ename | hiredate | sal | deptno |
---|---|---|---|
zzx | 2000.00 | 1 | |
lisa | 4000.00 | 2 | |
bjguan | 5000.00 | 1 | |
bzshen | 4000.00 | 3 | |
dony | 2000.00 | 4 |
mysql> select * from dept;
deptno | deptname |
---|---|
1 | tech |
2 | sale |
3 | hr |
5 | fin |
例如,从 emp 表中查询出所有部门在 dept 表中的所有记录:
select * from emp where deptno in (select deptno from dept);
__________________________
ename hiredate sal deptno |
zzx 1 |
lisa 2 |
bjguan 1 |
bzshen 3 |
___________________________
一、如果子查询记录数唯一,还可以用=代替 in:
mysql> select * from emp where deptno = (select deptno from dept);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> select * from emp where deptno = (select deptno from dept limit 1);
__________________________
ename hiredate sal deptno |
zzx 1 |
bjguan 1 |
___________________________
二、某些情况下,子查询可以转化为表连接,例如:
select * from emp where deptno in (select deptno from dept);
转换为表连接后:
mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;
__________________________
ename hiredate sal deptno |
zzx 1 |
lisa 2 |
bjguan 1 |
bzshen 3 |
___________________________
注意:表连接在很多情况下用于优化子查询
记录联合
我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能,具体语法如下:
SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;
区别:
UNION ALL 是把结果集直接合并在一起
UNION 是将UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果。
例如:将 emp 和 dept 表中的部门编号的集合显示出来:
mysql> select deptno from emp
-> union all
-> select deptno from dept;
|dept|
——————
| 1 |
| 2 |
| 1 |
| 4 |
| 1 |
| 2 |
| 5 |
——————
如果希望将结果去掉重复记录后显示:
mysql> select deptno from emp
-> union
-> select deptno from dept;
|dept|
——————
| 1 |
| 2 |
| 4 |
| 5 |
——————