mysql基础

一、基本命令

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。
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 |
——————  

你可能感兴趣的:(mysql基础)