操作数据库(DDL)

连接数据库

mysql -u用户名 -p enter password:密码

image.png
退出数据库

exit quit

查看已经创建的数据库

SHOW DATABASES;

注意

  • mysql不严格区分大小写
  • 分号作为结束符,必须写

查看数据库版本

select version();

创建数据库

CREATE DATABASE 数据库名;
CREATE DATABASE 数据库名 charset=utf8;

注意

  • charset:指定编码为utf8

查看创建数据库的命令

SHOW CREATE DATABASE 数据库名;

查看当前使用的数据库

SELECT DATABASE();

使用数据库

USE 数据库名;

删除数据库

DROP DATABASE 数据库名;

注意

  • SQL语句不区分大小写
  • 每行必须以英文状态下分号作为结束
  • 当数据库名称有特殊字符时,使用`包括。如:Logic_edu`

操作数据表

查看当前数据库中所有表

SHOW TABLES;

创建表

CREATE TABLE 数据表名(字段 类型 约束[, 字段 类型 约束])

约束

unsigned 无符号(正数)
zerofill 前导零填充
auto_increment 自增
default 默认值
not null 非空
PRIMARY KEY 主键 (非null并不重复)
unique 唯一性 (可以为null但不重复)
index 常规索引

查看表的创建语句

SHOW CREATE TABLE 数据表名;

查看表描述信息

DESC 数据表名;

添加表字段

ALTER TABLE 数据表名 ADD 字段 类型;

修改表字段

ALTER TABLE 数据表名 MODIFY 字段 类型; — 不重命名 ALTER TABLE 数据表名 CHANGE 原字段名 新字段名 类型及约束; — 将字段重命名

删除表字段

ALTER TABLE 数据表名 DROP 字段;

练习

  • 添加字段

    • 字段名称:birthday
    • 字段类型:DATETIME
  • 修改字段

    • 字段类型:DATE
  • 修改字段

    • 字段名称:birth
    • 字段类型:DATE
  • 删除该字段

操作数据

新增数据

整行插入

INSERT INTO 数据表名 VALUES(值1,值2,值3…);

指定列中插入数据

INSERT INTO tabname (字段1, 字段2,…) VALUES (值1,值2,….);

指定列中插入多条数据

INSERT INTO 数据表名 (字段1, 字段2,…) VALUES (值1,值2,…),(值1,值2,…);

修改数据

UPDATE 数据表名 SET 字段1=新值,字段2=新值 [WHERE 条件];

删除数据

DELETE FROM 数据表名 [WHERE 条件];

查询数据

查询整个表数据

SELECT * FROM 数据表名;

查询指定字段数据

SELECT 字段1,字段2 FROM 数据表名;

查询指定字段数据,并给字段起别名

SELECT 字段1 as 别名,字段2 as 别名 FROM 数据表名;

查询指定字段并去重

SELECT DISTINCT 字段1 FROM 数据表名;

注意,如果有多个字段时,是比较一整行数据是否重复,如果有一个字段不重复那都算不重复。

where子句

where子句通常结合增删改查使用,用于做筛选的条件。

比如,查询当id=1的数据

  1. select * from Student where id=1

不仅如此,经常结合运算符使用。

比较运算符

运算符 描述
= 等于
> 大于
>= 大于等于
< 小于
<= 小于等于
!=或<> 不等于

逻辑运算符

运算符 描述
a and b 当同时满足a,b时,则为True
a or b 当满足a或b其中一个时,则为True
not a 否定

模糊查询

like关键字用来进行模糊查询,并且结合%以及_使用。

  • % 表示任意多个任意字符
  • _ 表示一个任意字符

    select from students where name like “__” — 仅有两个字符的学生信息 select from students where name like “__%” —至少含有两个字符的学生信息

范围查询

关键字 描述
in 表示在一个非连续的范围内
between…and… 表示在一个连续的范围内

select from students where id in(1,3,5); — id是1,3,5的信息, in里面的内容是or关系 select from students where id not in(1,3,5); — id不是1,3,5的信息 select from students where id between 2 and 4; — id是2~4的信息 select from students where id (between 3 and 5) and gender=”男”; —id是3~5且是男的信息

空判断

关键字 描述
is null 判断空
is not null 判断非空

常用聚合函数

count 总数

  • 求students总人数
  • 求男性的人数
  • 女性的人数

select count() from students; —查询表有多少条数据 select count() from students where gender=”男”; —查询男的总人数

max() 最大值

  • 查询最大的年龄
  • 女性最大的id

    select max(age) from studers; —查询最大的年龄

min() 最小值

  • 查询未删除的学生的最小编号

    select min(age) from studers; —查询最小的年龄

sum 求和

  • 查询男生年龄和

    select sum(age) from studers where gender = 1; —查询男的年龄总和

avg 平均值

  • 查询未删除女生的年龄的平均值
  • 计算男性的平均年龄,保留2位小数

    select avg(age) from studers where gender = 1; —查询男的平均年龄,默认保留4位小数 加上round(avg(age), 2)可以限制保留的小数

分组与分组之后的筛选

分组

image.png
在数据库中,通过 group by 将查询结果按照1个或多个字段进行分组,字段值相同的为一组。

select … from students group by 需要分组字段;

group_concat(…)
我们通过group_concat(…)查看每组的详细信息


分组后的筛选

image.png

排序

order by 字段 默认升序 order by asc 字段 指定升序 order by desc 字段 指定降序

限制

limit start,count

  • start 为偏移量,默认起始0
  • count 为条数

注意:

  • limit 不能写数学公式
  • limit只能写在末尾

表连接

当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql。这时我们就需要使用表连接。

分类:

  • 内连接
  • 外连接
    • 左连接
    • 右连接

内连接

内连接仅选出两张表中互相匹配的记录

select * from 表1 inner join 表2 on 表1.列 = 表2.列;

image.png

左连接

查询的结果为两个表匹配到的数据,左表持有的数据,对于右表中不存的数据使用null填充

select * from 表1 left join 表2 on 表1.列 = 表2.列;

image.png
练习:

  • students表左连接classes表 并查看班级为null的数据
  • 左连接 并且 查询 s.is_del=1 并且 s.name=”amy” 的数据

右连接

查询结果为两个表匹配到的数据,右表持有的数据,对于左表中不存在的数据使用null填充。

select * from 表1 right join 表2 on 表1.列 = 表2.列;

image.png

子查询

某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。