数据库复习笔记4——MySQL基本操作

MySQL基本操作

这篇博客介绍MySQL数据库中常用的一些操作指令。

数据库操作 

我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下:

删除数据库过程中,务必要十分谨慎,因为在执行删除命令后,所有数据将会消失。我们使用drop命令删除数据库: 

 修改数据库属性,包括更改数据库名称、数据库所有者等等:

 数据表操作

1、创建数据表

我们使用create命令创建数据表,同时可以指定每一列的数据类型和属性等

需要注意,这里的列名被反引号框了起来,而不是单引号。

实例解析:

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL,在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
  • ENGINE设置存储引擎,CHARSET设置编码

MySQL 字段属性应该尽量设置为 NOT NULL,NULL类型的字段会导致种种弊端,例如:

  • 含有空值的列很难进行查询优化,而且对表索引时不会存储 NULL 值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用 0、一个特殊的值或者一个空串代替空值。
  • 联表查询的时候,例如 LEFT JOIN table2,若没有记录,则查找出的 table2 字段都是 null。假如 table2 有些字段本身可以是 null,那么除非把 table2 中 not null 的字段查出来,否则就难以区分到底是没有关联记录还是其他情况。

实际上,空串“”不等于NULL。任何数跟 NULL 进行运算都是 NULL, 判断值是否等于 NULL,不能简单用 =,而要用 IS NULL关键字。

可以看到,我们在定义数据表时,为每个列都定义了一些约束,列完整性约束包括:

  • PRIMARY Key(主键)、NULL(空值)、NOT NULL(非空值)、UNIQUE(值唯一)、CHECK(有效性检查)、DEFAULT(缺省值)

复合主键:

数据表中多个数据字段(两个及两个以上)共同构成的主键,称为“复合主键”。此时,只有当组成复合主键的所有列的值都相同时,才不允许。

复合主键的声明如下:

在上课计划表中,需要记录四个字段,课程ID,教师ID,课程名称,上课教室。因为一个课程会有多位任课教师,所以只根据课程ID无法确认上课教室,所以需要把(课程ID,教师ID)作为复合主键。

注意:这里是为了举例复合主键的声明方式,其实上述数据表的设计存在问题,其不满足第二范式:即消除非主属性对主属性的部分依赖。因为只根据课程ID就可以确定课程名称,不需要教师ID,所以实际上需要把上面的表进行拆分。

代理主键 VS 业务主键:

业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键。

代理主键(逻辑主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键。

代理主键是指在关系型数据库设计中,当资料表中的候选键都不适合当主键时,例如资料太长,或是意义层面太多,就会用一个attribute来当代理主键,此主键可能是用流水号,来代替可辨识唯一值的主键。代理主键提供了一个与当前表数据逻辑无关的字段作为主键,代理主键被广泛使用在业务表、数据表,一般有几种生成方式:uuid、自增。其中使用最多的是自增,代理主键成功的避免了业务主键与数据表关联耦合的问题,与业务主键不同的是,业务主键的数据一旦发生更改,那么那个系统中关于主键的所有信息都需要连带修改,这是不可避免的,并且这个更改是随业务需求的增量而不断的增加、膨胀。而代理主键与应用耦合度低,它与数据无任何必要的关系,你可以只关心:第一条数据; 而不用关心: 名字是a的那条数据。 某一天名字改成b, 你还是只关心:第一条数据。

例如:出版社数据系统中有:书籍信息表(书籍名,作者,年代),书籍售出表(书籍名,销量,单价),书籍库存表(书籍名,剩余图书数量)。我们如果选择书籍名作为主键(业务主键),之后如果因为一些原因,某本书的名称需要进行修改,那么和该书籍相关的所有表都要进行修改。但是如果我们在书籍信息表中,使用一个自增字段id来作为主键(代理主键),那么之后我们只需要修改书籍信息表中的第一行记录即可。

外键:

外键是一种约束,表与表的关联约束。如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。

例如:Table1(A,B,C) 和 Table2(D,E),其中Table1的主键为A ,Table2的主键为D,Table1的B字段指向Table2的D字段,则B是Table1的外键,Table1称为外键表,Table2称为主键表。外键表中的外键不能有主键表中不存在的数据。(保证数据的完整性和一致性)

一张表中可以有多个外键,外键的默认作用有两点:

  1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。

  2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。

  外键的定制作用----三种约束模式:

    district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。

    cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。

    set null:置空模式,前提外键字段允许为NLL,  父表操作后,子表对应的字段被置空。

  使用外键的前提:

  1. 表储存引擎必须是innodb,否则创建的外键无约束效果。

  2. 外键的列类型必须与父表的主键类型完全一致。

  3. 外键的名字不能重复。

  4. 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。

设置外键的语句如下:

方法一:在创建数据表的时候添加外键:

方法二:先创建表,然后添加外键约束:

删除外键约束的语句:

2、删除数据表

MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。

我们有以下几种不同的方式对表进行删除:

  • drop命令:删除表全部数据和表结构,立刻释放磁盘空间,不管是 Innodb 和 MyISAM;

  • truncate命令:删除表全部数据保留表结构,立刻释放磁盘空间 ,不管是 Innodb 和 MyISAM;

  • delete命令: 删除表全部数据表结构不变,对于 MyISAM 会立刻释放磁盘空间,InnoDB 不会释放磁盘空间;

需要注意:如果存在外键约束,先删子表(有FOREIGN Key关键词的表)再删主表(被关联的表)

3、修改数据表

与修改数据库、列类似,我们可以使用一个ALTER关键字对数据表的属性进行替换。

4、数据操作

(1)插入数据

MySQL表中使用 INSERT INTO SQL语句来插入数据。

如果数据是字符型,必须使用单引号或者双引号,如:”value”。插入数据的格式必须与表结构中固定的数据格式一致。

插入数据的时候,除了使用INSERT INTO语句之外,还可以使用REPLACE INTO语句。REPLACE INTO语句插入数据的时候,首先判断要插入的主键是不是在数据表中已经存在,如果存在,则先删除原有记录,然后插入;如果不存在则直接插入。使用的时候直接将INSERT替换为REPLACE即可。

(2)查询数据

查询数据是MYSQL数据库中最为常用的操作之一,使用SELECT语句:

  • 查询语句中你可以使用一个或者多个表,表之间使用逗号分割,并使用WHERE语句来设定查询条件。

  • SELECT 命令可以读取一条或者多条记录

  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据

  • 你可以使用 WHERE 语句来包含任何条件。

  • 你可以使用 LIMIT 属性来设定返回的记录数,也可以截取一定的记录返回。

select * from table limit 5; --返回前5行
select * from table limit 0,5; --同上,返回前5行
select * from table limit 5,10; --返回6-15行(10行数据)

LIMIT后面如果跟一个数,表示选择前多少条记录,如LIMIT 5,选择前5条记录。

LIMIT后面如果跟两个数,第一个数表示从第几条记录开始(但不包括该条记录),第二个数表示截取的数据行数。如:LIMIT 5,10:表示从第5条数据开始取(但不取第5条),取10条,因此是第6行---第15行。

  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0

OFFSET必须配合LIMIT使用,此时LIMIT后面只能有一个参数,表示要取的的数量,OFFSET表示要跳过的数量 。如下所示:

select * from table limit 5 OFFSET 3; --返回第4行--第8行(5行数据)

(3)删除数据

可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。

如果不指定条件语句,那么DELETE命令会将表中的全部数据都删除,表结构会被保存。

(4)更新数据

如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。

  • 你可以同时更新一个或多个字段。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在一个单独表中同时更新数据。

update 语句可用来修改表中的数据, 简单来说基本的使用形式为:

update 表名称 set 列名称=新值 where 更新条件;

以下是在表 students 中的实例:

将 id 为 5 的手机号改为默认的 - : update students set tel=default where id=5;

将所有人的年龄增加 1: update students set age=age+1;

将手机号为 13288097888 的姓名改为 "小明", 年龄改为 19: update students set name="小明", age=19 where tel="13288097888";

5、聚合函数

MySQL中常用的聚合函数主要有:

  • AVG():计算平均值(只能用于数值类型的列)
  • MIN():计算最小值(可以用于数值类型、日期类型和字符类型)
  • MAX():计算最大值(可以用于数值类型、日期类型和字符类型)
  • SUM():计算该列所有值的和(只能用于数值类型的列)
  • COUNT():计算结果集行数(可以用于数值类型、日期类型和字符类型)

聚合函数只能出现在having条件语句中,而不能出现在where条件语句中,因为它的执行晚于where。

聚合函数的使用方法参见:https://blog.csdn.net/u010339879/article/details/100067575

6、条件语句

MySQL中的条件语句主要分为两种类型,分别是:

  • where:是一个约束声明,是在查询之前约束来自数据库的数据。
  • having:是一个过滤声明,是在查询结果集返回以后对查询结果进行的过滤操作。HAVING语通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足

MySQL关键字的执行顺序:from、where、group by、聚集函数、having、select、order by、limit

HAVING 和 WHERE的区别参见:https://www.cnblogs.com/mr-wuxiansheng/p/11188733.html

常用的关系运算符:

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true。 A = B 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true A != B 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true A > B 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true A < B 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true A >= B 返回false。
<= 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true A <= B 返回 true。
IS NULL 当列的值是 NULL,此运算符返回 true。 A = NULL 返回true
IS NOT NULL 当列的值不是 NULL,此运算符返回 true。 A != NULL 返回true
<=> 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。 NULL <=> NULL 返回true

BETWEEN运算符

我们可以利用BETWEEN...AND限定范围,相比于常规的比较操作符(>,<,=),BETWEEN关键字可以运用在更广阔的范围内,如时间范围、字符范围等。

LIKE运算符

我们可以利用LIKE与通配符限定范围。

常见的通配符有:

  • 通配符 _代表一个未指定的字符

  • 通配符 %代表任意个(0个或者多个)未指定的字符。

GREATEST关键字

语法格式为:GREATEST(值1,值2,…值n),其中n表示参数列表中有n个值。当有2个或多个参数时,返回值为最大值,假如任意一个自然变量为NULL,则GREATEST()的返回值为NULL

LEAST关键字

语法格式为:LEAST(值1,值2,…值n),其中值n表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。

IN,NOT IN运算符

IN运算符用来判断操作数是否为列表中的其中一个值,如果是,返回值为1;否则返回值为0。

REGEXP运算符

REGEXP运算符用来用正则表达式匹配字符串,语法格式为:expr REGEXP 匹配条件,如果expr满足匹配条件,返回1;如果不满足,则返回0;若expr或匹配条件任意一个为NULL,则结果为NULL。

REGEXP运算符的使用详见:https://blog.csdn.net/su_bao/article/details/81668596

7、结果排序

如果我们需要对select读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

  • 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 你可以设定多个字段来排序。
  • 你可以使用 ASC(升序) 或 DESC(降序) 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列
  • 你可以添加 WHERE…LIKE 子句来设置条件。

8、分组

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 聚集函数,如果要对分组结果进行筛选,必须使用having

9、多表查询

当要查询的数据涉及到多个表时,我们可以通过嵌套查询或者连接的方式进行多表查询。

多表查询的详细内容参见:https://www.cnblogs.com/bypp/p/8618382.html

10、别名

在使用 MySQL查询时,当表名很长或者执行一些特殊查询的时候,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名代替表原来的名称。需要注意的是,这个新指定的临时别名不能与数据库中已有的表重名。

格式为:

<表名> [AS] <别名>

例如:

同样,在使用 SELECT 语句显示查询结果时,MySQL 会显示每个 SELECT 后面指定输出的列,在有些情况下,显示的列名称会很长或者名称不够直观,MySQL 可以指定列的别名,替换字段或表达式。

格式为:

<列名> [AS] <列别名>

例如:

11、过滤重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。distinct必须放在要查询字段的开头(如果distinct后面跟两个字段,mysql会认为是查询这两个字段都不重复的记录)。

DISTINCT的详细用法参见:https://www.cnblogs.com/lxwphp/p/11339949.html

12、MySQL 临时表

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间。临时表在MySQL 3.23版本中添加,如果你的MySQL版本低于 3.23版本就无法使用MySQL的临时表。不过现在一般很少有再使用这么低版本的MySQL数据库服务了。

13、MySQL复制表

如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE … SELECT 命令,是无法实现的,该命令只复制数据

我们可以通过先创建相同结构的表,再复制数据的形式进行表复制:

  • 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
  • 如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。

也可以使用如下方法:

14、MySQL中关键字的执行顺序

在MySQL中进行查询的时候,语句执行的顺序如下:

from ——》where ——》group by ——》having ——》select ——》order by ——》limit

参考资料:

1、https://hillzhang1999.gitee.io/2020/05/29/shu-ju-ku-fu-xi-ji-yu-mysql/#toc-heading-61

猜你喜欢

转载自blog.csdn.net/ProQianXiao/article/details/108102039
今日推荐