数据库基础

数据库

数据库是指长期存储在计算机内、有组织的、可共享的数据集合。简而言之,数据库就是一个存储数据的地方。只是,其存储方式有特定的规律。这样可以方便处理数据。数据库的操作包括创建数据库和删除数据库。这些操作都是数据库管理的基础。

创建和删除数据库

创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据。这是进行表操作的基础,也是进行数据库管理的基础。MySQL中,创建数据库是通过SQL语句create database实现的。其语法形式如下:

create database 数据库名;

示例:

create database student;

在这里插入图片描述表示创建成功,1行受到影响,处理时间为0.01秒;”Query Ok”表示创建、修改和删除成功。在创建数据库之前,可以使用show databases 语句来显示已经存在的数据库。语法格式如下:

show databases;

执行完该语句后显示下图信息:

在这里插入图片描述

在这里插入图片描述

表示集合中有5行信息,有5个数据库存在,处理时间为0.00秒,

0.00秒并不代表没有花费时间,而是时间非常短,小于0.01秒。

删除数据库:是指在数据库系统中删除已经存在的数据库。删除数据库之后,原来分配的空间将被收回。值得注意的是,删除数据库会删除该数据库中所有的表和所有数据。因此,应该特别小心。

​ MySQL中,删除数据库是通过SQL语句DROP DATABASE实现的。其语法形式如下:

  DROP DATABASE 数据库名 ;

数据库名:表示要删除的数据库名称;

执行完删除语句以后可以用show databases语句来显示已经存在的数据库;

创建、修改和删除表

**表:**是数据库存储数据的基本单位。一个表包含若干个字段或记录。表的操作包括创建新表、修改表和删除表。这些操作都是数据库管理中最基本,也是最重要的操作。

**创建表:**是指在已存在的数据库中建立新表。这是建立数据库最重要的一步,是进行其他表操作的基础。

创建表的语法格式如下:

 create table 表名(属性名 数据类型[完整性约束条件],
				…………
               属性名 数据类型[完整性约束条件];

**表名:**要创建的表的名称;

属性名:表中字段的名称;

**数据类型:**指定字段的数据类型;

**完整性约束条件:**指定字段的某些特殊约束条件。

表名不能为SQL语言的关键字,如CREATE ,UPDATE,ORDER等。一个表中可以有一个或多个属性。定义时,字母大小写均可,各属性之间用逗号隔开,最后一个属性后不需要加逗号。

==注:==在使用create table语句创建表时,首先要使用use语句选择数据库,选择数据库语句的基本格式为:use 数据库名,如果没有选择数据库,创建表时会出现:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVcJ0E8h-1637919892337)(C:\Users\86156\AppData\Roaming\Typora\typora-user-images\image-20211126103926931.png)]

例:

use s   create table Student
  (Sno   char(5) ,Sname char (20),Ssex   char (1) ,Sage   INT, Sdept  char (15))

**注意:**在navicat里面执行所选语句的方法:选中要执行的语句,右击——选中“运行已选择的”即可执行所选语句。

完整性约束条件

Primary key : 标识该属性为该表的主键;

Foreign key: 标识该属性为该表的外键,是与之联系的某表的主键;

Not null: 标识该属性不能为空;

Unique: 标识该属性的值是唯一的;

Auto_increment: 标识该属性的值自动增加;

Default: 为该属性设置默认值;

**主键:**是表的一个特殊字段。该字段能惟一地标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证是用来标明人的身份,每个人都具有惟一的身份证号。设置表的主键指在创建表时设置表的某个字段为该表的主键。

主键的主要目的:是帮助MySQL以最快的速度查找到表中的某一条信息。主键必须满足的条件:主键必须是惟一的,表中任意两条记录的主键字段的值不能相同;主键的值是非空值。主键可以是单一的字段,也可以是多个字段的组合。

1.单字段主键

2.多字段主键

设置表的主键:

(1)单字段作为主键:直接在该字段后加上primary key

例:在Student表中设置Sno为主键

 CREATE TABLE Student(
 	Sno    CHAR(5) primary key,
 	Sname CHAR(20), 
 	Ssex   CHAR(1),
    Sage   INT,  
    Sdept  CHAR(15))

(2)单字段作为主键:[constraint <约束名>] primary key[字段名]
例:在Student表中设置Sno为主键

 CREATE TABLE Student
               (Sno       CHAR(5),
                Sname  CHAR(20),          
                Ssex      CHAR(1),
                Sage      INT,
                Sdept    CHAR(15),
                primary key(Sno))

(3)多个字段作为主键:在属性定义完之后统一设置主键,语法规则如下:
primary key (属性名1,属性名2,….,属性名n)
例:在sc中设置sno和cno作为主键

 create table sc(sno char(10) ,
                             cno char(10),
                             grade int,
                             primary key (sno ,cno));
设置表的外键

外键是表的一个特殊字段。如果字段sno是一个表A的属性,且依赖于表B的主键。那么,称表B为父表,表A为子表,sno为表A的外键。通过sno字段将父表B和子表A建立关联关系。设置表的外键指在创建表设置某个字段为外键。本小节主要讲解外键设置的原则、外键的作用、设置外键的方法。

**设置外键的原则:**必须依赖于数据库中已存在的父表的主键;外键可以为空值。

**外键的作用:**是建立该表与其父表的关联关系。父表中删除某条信息时,子表中与之对应的信息也必须有相应的改变。例如,stu_id是student表的主键,stu_id是grade表的外键。当stu_id为‘123’同学退学了,需要从student表中删除该学生的信息。那么,grade表中stu_id为‘123’的所有信息也应该同时删除。

设置外键约束的语法规则如下:

constraint 外键名 foreign key (属性1,属性2,…,属性n)
                   references 表名(属性1,属性2,….,属性n) on  delete  cascade  on update cascade;

示例:

create table Student
        (Sno      char(5) , 
         Sname    char(20),          
         Ssex     char(1) ,
         Sage     int,
         Sdept    char(15),
         primary key(sno)); /* 设置主键*/

Create table course(cno  char(10) primary key,
                                cname char(10),
                                credit int);   
 create table sc(Sno char(10),
                             cno char(10),
                             grade int,
                             primary key (Sno ,cno),
                             constraint   s_fk  foreign  key (sno) references  student(sno),
                             constraint  c_fk  foreign  key(cno)  references   course(cno));      

也可以使用以下语句创建外界约束:

alter table 表名 add constraint fk_表名 foreign key(字段) references 表名

外界约束:外键必须是另一个表的主键。

设置表的唯一性约束

惟一性是指所有记录中该字段的值不能重复出现。设置表的惟一性约束是指在创建表时为表的某些特殊字段加上UNIQUE约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。例如,在id字段加上惟一性约束,所以记录中id字段上不能出现相同的值。例如,在表的id字段加上惟一性约束,那么每条记录的id值都是惟一的,不能出现重复的情况。如果一条记录的id为‘0001’,那么该表中就不能出现另一条记录的id为‘0001’。

设置惟一性约束的基本语法规则如下:

属性名  数据类型  UNIQUE

示例:

create table   sc(sno char(10) unique,
                            cno char(10),
                            grade int,
                            primary key (sno ,cno),
                            constraint   s_fk  foreign  key (sno) references  student(sno),
                            constraint  c_fk  foreign  key(cno)  references   course(cno));


设置表的属性值自动增加

AUTO_INCREMENT是MySQL数据库中一个特殊的约束条件。其主要用于为表中插入的新记录自动生成惟一的ID。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLINT、INT、BIGINT等)。默认的情况下,该字段的值是从1开始自增。

设置属性值字段增加的基本语法规则如下:

 属性名  数据类型  auto_increment

示例:

create table Student(Sno int   primary  key  auto_increment , 
         Sname      char(20),          
         Ssex       char(1) ,
         Sage       int,
         Sdept      char(15));

==注意:==如果一个字段采用auto_increment约束,则该字段一定要设置为主键,而且数据类型应该为数值类型。

设置表的属性的默认值

在创建表时可以指定表中字段的默认值。如果插入一条新的记录时没有为这个字段赋值,那么数据库系统会自动为这个字段插入默认值。默认值是通过DEFAULT关键字来设置的。设置默认值的基本语法规则如下:

属性名 数据类型  default 默认值

示例:

create table  sc(sno   char(10) unique,
            cno   char(10)  ,
            grade  int default 0 ,
            primary key (sno ,cno)
查看表结构

查看表结构是指查看数据库中已存在的表的定义。查看表结构的语句包括describe语句和 show create table 语句。通过这两个语句,可以查看表的字段名、字段的数据类型、完整性约束条件等。

(1)MySQL中,describe语句可以查看表的基本定义。其中包括,字段名、字段数据类型、是否为主键和默认值等。 describe语句的语法形式如下:

describe 表名;

(2)MySQL中, show create table语句可以查看表的详细定义。该语句可以查看表的字段名、字段的数据类型、完整性约束条件等信息。除此之外,还可以查看表默认的存储引擎和字符编码。 show create table语句的语法形式如下:

show create table 表名;

修改表

修改表是指修改数据库中已存在的表的定义。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。MySQL中通过alter table 语句来修改表。修改表包括修改表名、修改字段数据类型、修改字段名、增加字段、删除字段、修改字段的排列位置、更改默认存储引擎和删除表的外键约束等。

修改表名

•表名可以在一个数据库中唯一确定的一张表。数据库系统通过表名来区分不同的表。例如,数据库school中有student表。那么,student表就是唯一的。在数据库school中不可能存在另一个名为“student”的表。MySQL中,修改表名是通过SQL语句ALTER TABLE实现的。其语法形式如下:

alter table 旧表名 rename [to] 新表名 ;

例:

 alter table student rename to stu;

修改字段的数据类型

字段的数据类型包括整数型、浮点数型、字符串型、二进制类型、日期和时间类型等。数据类型决定了数据的存储格式、约束条件和有效范围。表中的每个字段都有数据类型。MySQL中,alter table语句也可以修改字段的数据类型。其基本语法如下:

 alter table  表名  modify  属性名  数据类型 ;

注:数据类型是指修改后的数据类型
例:将stu表的数据类型修改为char类型。

 alter table  stu  modify  sno  char(10);

修改字段名

字段名可以在一张表中唯一的确定一个字段。数据库系统通过字段名来区分表中的不同字段。例如,student表中包含id字段。那么,id字段在student表中是唯一的。student表中不可能存在另一个名为“id”的字段。MySQL中,ALTER TABLE语句也可以修改表的字段名。其基本语法如下:

ALTER  TABLE  表名  CHANGE  旧属性名  新属性名  新数据类型 ;

其中,“旧属性名”参数指修改前的字段名;“新属性名”参数指修改后的字段名;“新数据类型”参数修改后的数据类型,如不需要修改,则将新数据类型设置成与原来一样。
1.只修改字段名
2.修改字段名和字段数据类型

示例:将stu表的sno 列列名改为id,数据类型改为char(5)

   alter  table  stu  change  sno   id char(5); 

说明:modify 和change都可以改变字段的数据类型,change可以在改变数据类型的同时改变字段名,如果使用change修改字段数据类型,那么change后面必须跟两个同样的字段名。

例:用change将stu表中的sno列数据类型修改为char(10)

 alter table stu change  sno sno char(10);

增加字段

在创建表时,表中的字段就已经定义完成。如果要增加新的字段,可以通过ALTER TABLE语句进行增加。MySQL中,ALTER TABLE语句增加字段的基本语法如下:

ALTER  TABLE  表名  ADD  属性名1   数据类型  [完整性约束条件]  [FIRST |  AFTER  属性名2] ;

属性名1:指定需要增加的字段名称;

数据类型:指新增加字段的数据类型;

完整性约束条件:用来设置新增字段的完整性约束条件;

First:将新增字段添加到属性名2所指的字段后;

注意:如果SQL语句中没有FIRST | AFTER 属性名2参数指定新增字段的位置,新增的字段默认为表的最后一个字段。

增加字段:

1、增加无完整性约束条件的字段

例:为stu表增加一个字段parents, 类型为char(10)

  alter  table stu  add  parents  char(10)

2、增加有完整性约束条件的字段

例:为stu表增加一个非空字段p_phone,类型为char(10);

    alter table stu  add  p_phone  char(10)  not null ;

3、表的第一个位置增加字段

例:在表stu表第一个位置增加char类型字段;

   alter  table stu add  p_phone char(10) first;

4 、在指定位置增加字段

​ 如果在SQL语句中加上“alter 属性名2”,新增加的字段插入在“属性名2”后面

例:在stu表的id列后增加一列p_phone.

  alter  table stu add p_phone char(10) after id;

删除字段

​ 删除字段是指删除已经定义好的表中的某个字段。在表创建好之后,如果发现某个字段需要删除。可以采用将整个表都删除,然后重新创建一张表的做法。这样做是可以达到目的,但必然会影响到表中的数据。而且,操作比较麻烦。MySQL中,ALTER TABLE语句也可以删除表中的字段。其基本语法如下:

  ALTER TABLE  表名  DROP  属性名 ;

例:删除stu表中的id列

  alter  table   stu   drop  id 
修改字段的排列位置

创建表的时候,字段在表中的排列位置就已经确定了。如果要改变字段在表中的排列位置,则需要ALTER TABLE语句来处理。MySQL中,修改字段排列位置的ALTER TABLE语句的基本语法如下:

ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST | AFTER 属性名2;

其中,“属性名1”参数指需要修改位置的字段的名称;“数据类型”参数指“属性名1”的数据类型;“FIRST”参数指定位置为表的第一个位置;“AFTER 属性名2”参数指定“属性名1”插入在“属性名2”之后。

1.字段修改到第一个位置

2.字段修改到指定位置

示例:

1、字段修改到第一个位置

​ first参数可以指定字段为表的第一个字段

例:将stu表中id字段修改为该表的第一个字段

alter  table stu  modify  id   char(10)   first ;

2、字段修改到指定位置

例:把stu表中的Ssex列改到id列后面

 alter  table  stu  modify  Ssex  char(1)  after  id ;

删除表的外键约束

外键是一个特殊字段,其将某一表与其父表建立关联关系。在创建表的时候,外键约束就已经设定好了。由于特殊需要,与父表之间的关联关系需要去除,要求删除外键约束。MySQL中,ALTER TABLE语句也可以删除表的外键约束。其基本语法如下:

ALTER TABLE 表名 DROP FOREIGN KEY 外键 ;

(1)增加外键约束的格式:

 alter table  表名  add constraint  约束名  foreign key(字段名) references   被参照的表名 (被参照的字段名)

例:

alter  table  sc  add  constraint  c_k  foreign key(sno) references stu(id)

(2)删除外键约束的格式:

alter  table  表名  drop  foreign  key  外键名

​ 可以用show create table 表名查询表的外键名,执行该语句后,复制create table 列的内容即可,查询sc表的外键名得到:

CREATE TABLE `sc` ( `sno` char(10) NOT NULL, `cno` char(10) NOT NULL, `grade` int(11) DEFAULT '0', PRIMARY KEY (`sno`,`cno`), 

UNIQUE KEY `sno` (`sno`), 

CONSTRAINT `c_k` FOREIGN KEY (`sno`) REFERENCES `stu` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

​ 从中可以看到外键约束名为c_k

例:删除sc表的外键约束

  alter table  sc drop foreign key c_k

删除没有被关联的普通表

​ MySQL中,直接使用DROP TABLE语句可以删除没有被其他关联的普通表。其基本语法如下:

DROP TABLE 表名 ;

​ 其中,“表名”参数为要删除的表的名称。

例:将删除example5表,SQL代码如下:

DROP TABLE example5 ;

​ 如果代码运行成功,将从数据库中删除example5表。在执行代码之前,先用DESC语句查看是否存在example5表,以便与删除后进行对比。

删除被其他表关联的父表

​ 一些表成为了父表,这些表被其子表关联着。要删除这些父表,情况不像上一节那么简单。

例:删除stu表,该表被sc关联着

 drop  table  stu  ;

代码执行后,结果显示为:

Mysql > drop table stu ;

[Err] 1217 - Cannot delete or update a parent row: a foreign key constraint fails

此时应首先删除外键约束,再删除表,代码如下:

alter table  sc  drop  foreign  key  c_k;

drop table stu 

索引

索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录。索引是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。MySQL的索引包括普通索引、惟一性索引、全文索引、单列索引、多列索引和空间索引等。

索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构。索引可以提高查询的速度。本小节将详细讲解索引的含义、作用、优缺点。索引有起明显的优势,也有其不可避免的缺点。

索引的优点:可以提高查询速度,对于有依赖关系的子表和父表之间的联合查询时,可以提高查询速度;使用分组和排序子句进行查询也可以提高速度。

索引的缺点:创建和维护索引徐英豪耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占用一定的物理空间;增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低。

索引的设计原则

1 选择唯一性索引

唯一性索引的值是唯一的,可以更快速的 通过索引来确定某条记录,例:学生的学号是唯一的,该字段建立唯一索引可以快速确定某个学生的信息。

2 为经常要排序、分组和联合操作的字段建立索引

3 为常作为查询条件的字段建立索引

4 限制索引数目

​ 索引的数目不是越多越好,每个索引都要占用磁盘空间

5尽量使用数据量少的索引

​ 索引值越长,查询速度就越慢

6 尽量使用前缀来索引

​ 如果字段的值很长,最好使用值的前缀来索引。如text和blog类型的字段,进行全文检索会浪费时间,如果只检索字段的前面的若干个字段,可以提高检索速度。

7 删除不再使用或者很少使用的索引

创建表时建立索引

MySQL的索引包括普通索引、惟一性索引、全文索引、单列索引、多列索引和空间索引等。创建表时创建索引:

create table 表名(属性名 数据类型[完整性约束条件],
                   属性名 数据类型[完整性约束条件],
                    …
                   属性名  数据类型 
             [unique| fulltext | spatial] index |key 
           [别名](属性名1  [(长度)][ASC|DESC])  );

Unique:唯一索引

Fulltext:全文索引

Spatial:空间索引

**index |key :**用于指定要创建索引的字段,两者选择其中之一即可,作用相同

**别名:**用于给创建的索引取新名字

**属性1:**指定索引对应的字段的名称,该字段必须为前面定义好的字段;

**长度:**索引的长度,必须是字符串类型才可以使用;

**ASC:**升序排列

**DESC:**降序排列

1 创建表时建立普通索引

 create  table  s(sno int ,
                       sname char(10),
                       sex char(10),
                       index(sno)); 

2 创建唯一性索引
创建唯一索引需要使用unique约束
例:在s表的sno上建立名为index_id的唯一索引,且以升序的形式排列。

     create  table  s(sno int ,
                       sname char(10),
                       sex char(10),
                       unique index2_id(sno  ASC)); 

3 创建全文索引
全文索引只能建立在char,varchar 或text类型字段上,只有MyISAM存储引擎支持全文索引。

create  table  s(sno int ,
                       sname char(10),
                       sex char(10),
              FULLTEXT  INDEX  index3(sno))ENGINE=MyISAM; 

4 创建单列索引
单列索引是在表的单个字段上建立索引.
例:在表s的sno上建立名为s_index的单列索引

  create  table  s(sno char(15),
                       sname char(10),
                       sex char(10),
                       index  index_sno(sno(8)); 

注:sno字段长度为15,而index_sno索引的长度只有8个,这样可以提高查询速度。

5 创建多列索引
在多个字段上建立一个索引,只有查询条件中使用这些字段中的第一个字段,索引才会起作用

 create  table  s(sno char(15),
                       sname char(10),
                       sex char(10),
                       index  index_sname(sname,sex)); 

用show create table 语句查看表结构,可以看到表上有一个多列索引index_sname。

CREATE TABLE `s` (
  `sno` char(15) DEFAULT NULL,
  `sname` char(10) DEFAULT NULL,
  `sex` char(10) DEFAULT NULL,
  KEY `index_sname` (`sname`,`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

5 创建多列索引

用explain 语句可以查看索引的使用情况,只有sname 作为查询条件,显示结果如下:

 explain  select  *  from  s where sname ='ABC'

从查询结果可以看到key 和possible_key都被使用。

如果只用sex作为查询条件,显示结果如下:

在这里插入图片描述

从查询结果可以看到key 和possible_key为null 。

6 创建空间索引

​ 创建空间索引,表的存储引擎必须是myisam类型,而且索引字段必须有非空约束。

**例:**在s表的sname上建立一个index_sp的空间索引

create table  s(sno char(10),
          sname geometry not null,
          sex char(10),
		  spatial index index_sp(sname))ENGINE=MyISAM;

:只有非空的空间数据类型字段才能建立空间索引,常见的空间类型包括:geometry, point , linestring 和polygon.

在已有表上建立索引

在已经存在的表上,可以直接为表上的一个或几个字段创建索引。基本形式如下:

CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX  索引名 ON 表名 (属性名 [ (长度) ] [ ASC | DESC] );

Unique:唯一索引

Fulltext:全文索引

Spatial:空间索引

index :用于指定要创建索引的字段

索引名:用于给创建的索引取新名字

属性名:指定索引对应的字段的名称,该字段必须为前面定义好的字段;

**长度:**索引的长度,必须是字符串类型才可以使用;

**ASC:**升序排列

**DESC:**降序排列

1 创建普通索引

:在表s的sno字段上建立名为 index_id的索引

  create  index  index_id on s(sno)

2 唯一索引

**例:**在表s的sno字段上建立名为 index_id的唯一索引

  create unique  index index_id on s(sno)

3 创建全文索引

:在表s的sno字段上建立名为 index_id的全文索引

create  fulltext   index  index_id  on  s(sno)

创建全文索引的字段必须是char,varchar和text 等类型

4 创建单列索引

:在表s的sno字段上建立名为index_10 的索引

create   index  index_10  on s(sno) 

5 创建多列索引

**例:**在表s的sname,sex上建立多列索引

create  index  index_na  on  s(sno,sex)

6 创建空间索引

**例:**在表s的sno上建立名为 index_na 的空间索引

 create table s(sno char(10),
           sname geometry  not null,
            sex char(10))
create  spatial  index index_sp on s(sname)
用alter table 建立索引

在已经存在的表上,可以通过ALTER TABLE语句直接为表上的一个或几个字段创建索引。基本形式如下:

ALTER TABLE表名 ADD  [ UNIQUE | FULLTEXT | SPATIAL ]  INDEX 索引名(属性名 [ (长度) ] [ ASC | DESC];

参数和前面两种方式的参数一样的。

1 建立普通索引

例: 在s表的sno上建立普通索引

alter  table  s  add  index  index_id(sno) 

2 建立唯一索引

例: 在s表的sno上建立唯一索引

alter table s add unique index index_id(sno)

3 创建全文索引
例:在s表的sno 上建立全文索引

alter    table   s  add   fulltext  index  index_s(sno)  

注: 全文索引只能建立在char,varchar 或者text类型的字段上,而且只有myisam存储引擎才支持全文索引。

4 创建单列索引
例:在s表的sno上建立单列索引

alter   table    s    add   index   index_id(sno)

​ 用show create table s语句即可查询该索引

5 创建多列索引
例:在表s的sname,sex上建立多列索引

alter   table  s  add  index  index_id(sno,sex) 

6 创建空间索引
例:在s表的sname列上建立空间索引

create  table  s(sno  char(10),
               sname  geometry  not null,
               sex char(10))
        	   alter table s add spatial index _sp(sname)
索引的删除

删除索引可以通过drop语句完成

基本形式如下

drop  index  索引名  on  表名 

DML:数据操作语言(insert 、delete、update)

数据库通过插入、更新和删除等方式来改变表中的记录。插入数据是向表中插入新的记录,通过INSERT语句来实现。更新数据是改变表中已经存在的数据,使用UPDATE语句来实现。删除数据是删除表中不再使用的数据,通过DELETE语句来实现。

insert

插入数据是向表中插入新的记录。通过这种方式可以为表中增加新的数据。

MySQL中,通过INSERT语句来插入新的数据。使用INSERT语句可以同时为表的所有字段插入数据,也可以为表的指定字段插入数据。INSERT语句可以同时插入多条记录,还可以将一个表中查询出来的数据插入到另一个表中。

1 为表的所有字段插入数据

​ 通常情况下,插入的新记录要包含表的所有字段。INSERT语句有两种方式可以同时为表的所有字段插入数据。第一种方式是不指定具体的字段名。第二种方式是列出表的所有字段。

注意:insert中自增长的数据可以不写

格式:

insert    into  <表名> [(<属性列1>[<属性列2 >)]
             values(<常量1> [<常量2>])

或:

insert  into <表名> values(常量1,常量2,…,常量n)

常量的个数和数据类型一定要和所给属性的个数以及数据类型匹配

:在sc表中插入一条记录

  insert  into  sc  values('4', 'c', 75) 

:在sc表中插入一条记录

 insert  into sc(sno, cno, grade)  values('5', 'd', 80)

2 为表的指定字段插入数据

如果上一节中讲解的INSERT语句只是指定部分字段,这就可以为表中的部分字段插入数据了。其基本语句形式如下:

 INSERT  INTO  表名(属性1, 属性2,, 属性m)
	VALUES(1,2,, 值m);

:在stu表的sno,ssex,sname,sage列上插入数据

 insert into stu(sno,ssex,sname,sage) values('4','男','d',19)

3 同时插入多条记录

​ 同时插入多条记录是指一个INSERT语句插入多条记录。当用户需要插入好几条记录,用户可以使用上面两个小节中的方法逐条插入记录。但是,每次都要写一个新的INSERT语句。这样比较麻烦。MySQL中,一个INSERT语句可以同时插入多条记录。其基本语法形式如下:

 INSERT  INTO 表名 [ (属性列表) ] 
	VALUES(取值列表1),(取值列表2),
	(取值列表n) ;

**例:**向sc表同时插入3条记录

 insert into sc values('7', 'e', 90),
	('8', 'f' , 80),
 	('9', 'g', 85)  

:向sc表的sno,cno同时插入3条记录

 insert into sc(sno,cno) values('10', 'e'),
	('11', 'f'),
	('12', 'g')

4 将查询结果插入到表中

​ INSERT语句可以将一个表中查询出来的数据插入到另一表中。这样,可以方便不同表之间进行数据交换。其基本语法形式如下:

INSERT  INTO 表名1 (属性列表1) 
	SELECT  属性列表2  FROM  表名2  WHERE 条件表达式;

:属性列表2 和 属性列表1的数据类型一样,如果数据类型不一样,数据库系统会报错。

:将stu表的学号插入到sc表中

 insert into  sc(sno) 
	select sno from stu 

Update

​ UPDATE可用于更新单一行或多行,一切交给WHERE子句决定

注意:如果不加上WHERE子句,SET中子句提到的表中的每行的每列都会被修改为新值。使用UPDATE语句可以取代DELETE与INSERT的组合。

UPDATE语句的语法格式:

UPDATE    table_name 
	SET 
	column_name1 = expr1,
	column_name2 = expr2,
   ...
WHERE
   condition;  

在上面UPDATE语句中:

首先,在UPDATE关键字后面指定要更新数据的表名。

其次,SET子句指定要修改的列和新值。要更新多个列,请使用以逗号分隔的列表。以字面值,表达式或子查询的形式在每列的赋值中来提供要设置的值。

第三,使用WHERE子句中的条件指定要更新的行。WHERE子句是可选的。 如果省略WHERE子句,则UPDATE语句将更新表中的所有行。

:将a号课程的成绩修改为0。

update sc set  grade=0  where cno='a'

:将所有选课成绩修改为0

 update sc set  grade=0  

Delete

格式

  delete  from  表名  where   条件表达式 

:删除stu表中数学系的学生信息

  delete  from  stu  where sdept='MA'

:删除sc表中的所有记录

   delete  from sc

DQL:数据查询语言(select)

查询数据指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。

查询数据是数据库操作中最常用的操作。通过对数据库的查询,用户可以从数据库中获取需要的数据。数据库中可能包含着无数的表,表中可能包含着无数的记录。因此,要获得所需的数据并非易事。MySQL中可以使用SELECT语句来查询数据。根据查询的条件的不同,数据库系统会找到不同的数据。通过SELECT语句可以很方便的获取所需的信息。

MySQL中,SELECT的基本语法形式如下:

SELECT 属性列表 
FROM  表名和视图列表
[ WHERE 条件表达式1 ]
[ GROUP BY 属性名1 [ HAVING 条件表达式2 ] ]
[ ORDER BY 属性名2 [ ASC | DESC ] ]
单表查询

单表查询是指从一张表中查询所需要的数据。查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据。两者的查询方式上有一定的区别。因为单表查询只在一张表上进行操作,所以查询比较简单。本小节将讲解在单表上查询所有的字段、查询指定的字段、查询指定的行、多条件查询、查询结果不重复、给查询结果排序、分组查询和用LIMIT限制查询结果的数量等内容。

1.列出表的所有字段

格式

select  字段名1,字段名2,...,字段名n  from 表名

例:查询学生的个人信息

select  sno , sname , sex , sage from s 

2.使用“*”查询所有字段

格式

select  *  from  表名

例:查询学生的个人信息

select  *  from  s 

3 查询指定字段

格式

select 字段名1,字段名2...,字段名s   from 表名

例:查询学生的学号和姓名

 select  sno , sname  from  s 

4 带条件的查询
格式 :

select  目标列表达式  from 表名  where  条件表达式  (字段名θ{字段名/常量}) 

(1) θ可以为: =, <, >, >=, <=, !=, <>
例:查询学号为”2015144101”的记录

select   *   from    s   where  sno ='2018123112'

​ 例:查询CS系的学生姓名

 select  sname  from  student  where  sdept=‘cs’;

​ 例:查询年龄小于20的学生姓名和年龄

select    sname ,  sage   from  student   Where   sage<20  ;

(2) 指定范围:字段名[not]between {字段名/常量}and{字段名/常量}
例:查询年龄在20—23岁之间的学生的姓名、系别和年龄

Select  sname,sdept,sage  from  student  where sage  between   20 and  23;

(3) 指定集合:in 、not in
例:查询计算机科学系、数学系和信息系学生的姓名和性别

 select   sname,  ssex   From   stu    where   sdept   in('CS','MA','IS');
         select  sname,  ssex  From stu   where sdept not in('CS','MA','IS')

( 4) 匹配字符串 like 、not like
%:任意长度的字符串
-:任意单个字符
例:查询所有姓刘的学生的姓名、学号和性别

select  sname,sno,sex  from  s  Where  sname  like  '刘%'

例:查询姓“欧阳”且全名为3个汉字的学生的姓名

select   sname,sno,sex  from  s  where   sname  like   '欧阳_'

(5 ) 是否为空值 is null、 is not null
​ 例:查询选课成绩为空的学号和课程号

 select   sno ,cno  from  sc  where  grade   is    not  null;

​ 例:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

SELECT  sno ,cno   FROM   SC    WHERE   Grade   IS NULL

(6) 多个查询条件 and 、 or
​ 例:查询计算机系年龄在20岁以下的学生姓名。

 SELECT  Sname  FROM  Student  WHERE  Sdept= 'CS'  AND  Sage<20

​ 例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别

 Select  Sname,   Ssex    from    stu
   Where  Sdept= ' IS ‘  or   Sdept= ' MA’ or  Sdept= ' CS '

(7) 查询结果不重复

----使用distinct关键字删除重复值

:查询选过课的学生学号

select  distinct  sno   from  sc

(8) 对查询结果排序

为了使查询结果顺序满足用户的要求,可以使用order by关键字对记录进行排序,语法规则如下:

 select 目标列表达式 from 表名 where 条件表达式 order by 属性名 ASC | DESC  

属性名:按该字段排序,ASC参数表示按升序的顺序进行排序;DESC参数表示按照降序的顺序进行排列,默认情况按照ASC方式进行排序。

:按照学生年龄升序排列查询学生信息

 select   *   from   stu   order  by   sage  ASC

:按照学生学号降序排列查询学生的学号、姓名、所在系

select  p_phone, sname, sdept from stu  order by  p_phone DESC 

升序排列时,如果排序字段的值为空值时,这条记录将排在最前面,可以理解为空值时是该字段的最小值,而按降序排列时,排序字段为空值的记录将最后显示。MySQL中,可以指定按多个字段A1,A2进行排序,排序过程中,先按照A1字段排序,再按照A2字段排序, A1字段相等的按照A2字段排序。
(9 )分组查询
GROUP BY关键字可以将查询结果按某个字段或多个字段进行分组。字段中值相等的为一组。其语法规则如下:

GROUP  BY  属性名  [ HAVING 条件表达式 ] [ WITH  ROLLUP ]

“属性名”:是指按照该字段的值进行分组。

having条件表达式:用来限制分组后的显示,满足条件表达式的结果将被显示。

with rollup:将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和。

(1)单独使用group by 关键字,查询结果只显示一个分组的一条记录

例:按照stu表的sex字段进行分组查询

select   * ,group_concat(sname)  from   stu  group  by   ssex 

(2)group by 关键字与group_concat()函数一起使用

group by 关键字与group_concat()函数一起使用时,每个分组中指定字段值都显示出来。

p_phoneidSsexSnameSageSdeptgroup_concat(sname)
null2b17MAb,c
1501a18CSa

sex字段取值为“女”的记录是一组,取值为“男”的记录为一组,而且每一组所有人的名字都被查询出来。

(3) group by 关键字与集合函数一起使用,可以通过集合函数计算分组中的总记录、最大值、最小值

例:查询学生表中男女生人数

 select  ssex , count(ssex)   from stu group  by  ssex 

查询结果如下:

ssexcount(ssex)
2
1

count(ssex)计算出了sex字段不同分组的记录数,第一组只有1条记录,第二组共有2条记录。

(4)group by 与having 一起使用
加上“having条件表达式”,可以限制输出的结果,只有满足条件表达式的结果才会显示。

例:查询选课人数大于3的课程号

 select  cno ,count(sno)  from  sc group by cno  having count(sno)>3

“having 条件表达式”:作用于分组后的记录,用于选择满足条件的组。

“where条件表达式”:作用于表或视图,是表和视图的查询条件

(5) 按多个字段进行分组

先按照A1字段进行分组,A1字段值相等时,再按照A2字段进行分组。

例:查询sc表,按照sno, sex分组

 select   *    from  sty    group  by  sno ,  sex 

(6)group by 与with rollup 一起使用

例: 查询每一门课程的选课人数

 select   cno , count(sno) from sc group by  cno with rollup

查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部。这样就需要来限制查询结果的数量。LIMIT是MySQL中的一个特殊关键字。其可以用来指定查询结果从哪条记录开始显示。还可以指定一共显示多少条记录。LIMIT关键字有两种使用方式。这两种方式分别是不指定初始位置和指定初始位置。

1.不指定初始位置

limit关键字不指定初始位置时,记录从第一条记录开始显示。显示记录的条件有limit关键字指定,语法格式如下:

limit 记录数

记录数:表示显示记录的条数。如果“记录数”的值小于查询结果的总记录数,将会从第一条记录开始,显示指定条数的记录。如果“记录数”的值大于查询结果的总记录数,数据库系统会直接显示查询出来的所有记录。

:查询sc表中所有记录,但只显示前两条

 select *  from sc limit 2 

2.指定初始位置

limit关键字可以指定从哪条记录开始显示,并且可以指定显示多少条记录,其语法规则如下:

limit 初始位置, 记录数

**初始位置:**参数指定从哪条记录开始显示

**记录数:**参数表示显示记录的条数

第一条记录的位置是0,第二条记录的位置是1

**例:**查询sc表的所有记录,显示前两条记录

 select  * from sc limit 0 , 2
使用集合函数查询

​ 集合函数包括COUNT()、SUM()、AVG()、MAX()和MIN()。其中,COUNT()用来统计记录的条数;SUM()用来计算字段的值的总和;AVG()用来计算字段的值的平均值;MAX()用来查询字段的最大值;MIN()用来查询字段的最小值。当需要对表中的记录求和、求平均值、查询最大值、查询最小值等操作时,可以使用集合函数。例如,需要计算学生成绩表中的平均成绩,可以使用AVG()函数。GROUP BY关键字通常需要与集合函数一起使用。本节中将详细讲解各种集合函数。

COUNT( )函数:用来统计记录的条数。如果要统计employee表中有多少条记录,可以使用COUNT( )函数。如果要统计employee表中不同部门的人数,也可以使用COUNT( )函数。

例:下面使用COUNT( )函数统计学生表的记录数。

 select   count(*)  from   stu ;

**SUM( )函数:**是求和函数,使用SUM( )函数可以求出表中某个字段取值的总和。

例: 查询学号为001同学的学生成绩。

select sno, sum(grade)  from  sc where  sno=001

例:

 select   d_id,  count(*)   from   examplee  group by d_id; 

**AVG( )函数:**是求平均值的函数。使用AVG()函数可以求出表中某个字段取值的平均值。

:查询学生的平均年龄

  select   avg(sage)  from  stu

:查询每个同学的选课平均成绩。

  select  sno, avg(grade) from  sc group by sno

MAX( )函数: 是求最大值的函数。使用MAX()函数可以求出表中某个字段 取值的最大值。 MAX()函数可以计算字符和字符串的最大值, MAX()函数是使用字符对应的ASCII码进行计算的。

:查询学生的最大年龄

  select max(sage) from stu

:查询sc表中不同科目的最高成绩

select  cno ,max(grade) from sc  group  by cno 

•**MIN( )函数:**是求最小值的函数。使用MIN()函数可以求出表中某个字段取值的最小值。

:查询学生的最小年龄

select  min(sage)  from stu

:查询选课表中各科的最低成绩。

  select cno , min(grade) from sc group by cno 
连接查询

​ 连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或两个以上的表时使用的。当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几个表。例如,学生表中有course_id字段来表示所学课程的课程号,课程表中有num字段来表示课程号。那么,可以通过学生表中的course_id字段与课程表中的num字段来进行连接查询。连接查询包括内连接查询和外连接查询。

内连接查询

内连接查询是一种最常用的连接查询。内连接查询可以查询两个或两个以上的表。为了读者更好的理解,暂时只讲解两个表的连接查询。当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表。当该字段的值相等时,就查询出该记录。

例:查询每个学生及其选修课程的情况。

 select   Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
            from   Student,SC
            where  Student.Sno = SC.Sno;

例:查询每个同学所选课程的课程信息和选课信息

select   *    from   c ,   sc    where   c.cno=sc.cno

外连接查询

​ 外连接查询可以查询两个或两个以上的表。外连接查询也需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录。而且,该字段取值不相等的记录也可以查询出来。外连接查询包括左连接查询和右连接查询。其基本语法如下:

SELECT 属性名列表  
FROMb  表名1   bLEFT | RIGHT JOINb 表名2
ON  表名1.属性名1=表名2.属性名2 ;

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

1 左连接

​ 进行左连接查询,可以查询出“表名1”所指的表中所有记录,“表名2”所指的表中,只能查询出匹配的记录。

:查询选课学生的选课信息和个人信息

select *  from sc  left join stu on sc.sno=stu.sno

2 右连接

: 请用外链接查询每个同学的个人信息和选课信息

select *  from sc  right join stu on sc.sno=stu.sno
复合条件连接查询

​ 在连接查询时,也可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。例如,employee表和department表进行连接查询时,可以限制age字段的取值必须大于24。这样,可以更加准确的查询出年龄大于24岁的员工的信息。

**例:**查询出有补考的学生个人和选课信息。

 select  student.* ,  cno, grade from  student, sc where  grade<60  and  student.sno=sc.sno 

**例:**查询选修2号课程且成绩在90分以上的所有学生的学号、姓名

select  Stu.id,   stu.Sname
 from   Stu,  SC
 where  Stu.id = SC.sno  AND  
SC.Cno= '2'   AND  SC.Grade > 90
子查询

子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取。例如,现在需要从学生成绩表中查询计算机系学生的各科成绩。那么,首先就必须知道哪些课程是计算机系学生选修的。因此,必须先查询计算机系学生选修的课程,然后根据这些课程来查询计算机系学生的各科成绩。通过子查询,可以实现多表之间的查询。子查询中可能包括IN、NOT IN、ANY、ALL、EXISTS、NOT EXISTS等关键字。子查询中还可能包含比较运算符,如“=”、“!=”、“>”和“<”等。

1、带IN关键字的子查询

​ 一个查询语句的条件可能落在另一个SELECT语句的查询结果中。这可以通过IN关键字来判断。例如,要查询哪些同学选择了计算机系开设的课程。先必须从课程表中查询出计算机系开设了哪些课程。然后再从学生表中进行查询。如果学生选修的课程在前面查询出来的课程中,则查询出该同学的信息。这可以用带IN关键字的子查询来实现。

**例:**查询选修2号课程的学生的姓名

 select   Sname  from Stu
	where  id  in
	( select  sno  from  sc where cno= '2' )

:查询选修了1号课程的学生信息

select  *  from stu where  stu.id  in (select sno from sc where cno='1')

**例:**查询与“刘晨”在同一个系学习的学生

select id, Sname, Sdept
	from  Stu
	where Sdept  in
	(select Sdept from  Stu where  Sname='刘晨')

例: 查询选修了课程名为“信息系统”的学生学号和姓名

 select  id ,  Sname   from   Stu         
 	WHERE sno IN
		(SELECT  Sno   
         	FROM  SC       
			 	WHERE  Cno IN
			 (SELECT Cno   FROM c WHERE Cname= '信息系统') )

2、带ANY关键字的子查询

ANY关键字表示满足其中任一条件。使用ANY关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。例如,需要查询哪些同学能够获得奖学金。那么,首先必须从奖学金表中查询出各种奖学金要求的最低分。只要一个同学的成绩高于不同奖学金最低分的任何一个,这个同学就可以获得奖学金。ANY关键字通常与比较运算符一起使用。

**例:**查询其他系中比信息系任意一个(其中某一个)学生年龄大的学生姓名和年龄

SELECT   Sname,Sage  FROM  Student
        WHERE  Sage < ANY (SELECT  Sage
             FROM    Student WHERE  Sdept= ' IS ')
                   AND Sdept <> ' IS ' ;  

例:查询其他系中比信息系任意一个(其中某一个)学生年龄大的学生姓名和年龄

select  Sname,  Sage  from   Stu
    Where  Sage < (select  max(Sage) from   Stu 
        			 Where  Sdept= 'IS')  and Sdept <> 'IS'

3、带ALL关键字的子查询

ALL关键字表示满足所有条件。使用ALL关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。例如,需要查询哪些同学能够获得一等奖学金。首先必须从奖学金表中查询出各种奖学金要求的最低分。因为一等奖学金要求的分数最高。只有当同学的成绩高于所有奖学金最低分时,这个同学才可能获得一等奖学金。ALL关键字也经常与比较运算符一起使用。

**例:**查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。

方法一:用ALL谓词

SELECT  Sname,Sage
   FROM Student
      WHERE Sage < ALL
              (SELECT   Sage
                    FROM    Student
                      WHERE    Sdept= ' IS ')
                         AND Sdept <> ' IS;

例:查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。

方法二:用集函数

SELECT Sname, Sage
	FROM Stu
		WHERE Sage < 
 			(SELECT MIN(Sage)
 				FROM  Stu
 					WHERE  Sdept= 'IS')
						AND Sdept <>'IS';

合并查询结果

合并查询结果是将多个SELECT语句的查询结果合并到一起。因为某种情况下,需要将几个SELECT语句查询出来的结果合并起来显示。例如,现在需要查询公司甲和公司乙这两个公司所有员工的信息。这就需要从公司甲中查询出所有员工的信息,再从公司乙中查询出所有员工的信息。然后将两次的查询结果合并到一起。进行合并操作使用UNION和UNION ALL关键字。使用UNION关键字时,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录。而UNION ALL关键字则只是简单的合并到一起。其语法规则如下:

SELECT语句1
     UNION | UNION ALL
SELECT语句2 
     UNION | UNION ALL.
SELECT语句n ;

例:查询计算机科学系的学生及年龄不大于19岁的学生。

方法一:

SELECT *  FROM Student
WHERE Sdept = 'CS' 
 	UNION 
 	SELECT *  FROM Student WHERE Sage<=19

方法二:

SELECT DISTINCT  *  FROM Student
   WHERE Sdept = 'CS' OR Sage<=19

:查询选课表和学生表中的所有学号

 select sno from stu 
   union all 
 	select sno from sc 

使用 union all ,则重复学号不删除,使用union,则删除重复记录

 select  sno  from  stu 
    union   
select  sno  from  sc 

为表和字段取别名

在查询时,可以为表和字段取一个别名。这个别名可以代替其指定的表和字段。

格式: 表名 表的别名

**例:**查询学生的 学号和姓名

select sno , sname  from  stu  s 

**注:**给表stu取个别名s

:查询先修课程的先修课程

  select  c2.cpno  from c c1,  c c2 where c1.cpno=c2.cno

当查询数据时,MySQL会显示每个输出列的名词。默认的情况下,显示的列名是创建表是定义的列名。有时为了显示结果更加直观,需要一个更加直观的名字来表示这一列。

​ MySQL中为字段取别名的基本形式如下:

属性名 [AS] 别名

**例:**查询学生的学号和姓名,列名分别为“学号”和“姓名”

 select sno as 学号,  sname 姓名 from stu

**注意:**表的别名不能与该数据库的其他表同名,字段的别名不能与该表的其他字段同名。在条件表达式中不能使用字段的别名,否则将会出现Unknown column这样的错误信息。

使用正则表达式查询

正则表达式是用某种模式去匹配一类字符串的一个方式。例如,使用正则表达式可以查询出包含A、B、C其中任一字母的字符串。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。正则表达式可以应用于非常复杂查询。

正则表达式的模式字符含义
.匹配任何单个字符
^匹配字符串的开始部分
$匹配字符串的结束部分
[…]匹配在方括号内的任何字符,可以使用’-’表示范围,如[a-z],[0-9],而且可以混合[a-dXYZ]表示匹配a,b,c,d,X,Y,Z中的任何一个;(注意使用括号以及’|’的方法也可以达到相同的效果,如(a|b|c)匹配a,b,c中的任何一个)
[^ …]此外可以使用’’表示否定,如[a-z]表示不含有a-z中间的任何一个字符;
*表示匹配0个或多个在它前面的字符。如x*表示0个或多个x字符,.*表示匹配任何数量的任何字符
+表示匹配1个或多个在它前面的字符。如a+表示1个或多个a字符。
字符串{N}字符串出现N次,a{5}表示匹配共5个a,a{2,8}表示匹配2~8个a。
字符串{M,N}字符串出现至少M次,最多N次

基本形式:

属性名 regexp ‘匹配方式’

**^:**匹配字符开始的部分

**例:**从stu表sname字段中查询以a开头的记录

 select  *  from stu  where  sname  regexp '^a' 

:查询姓名以“aaa”开头的记录

  select  * from stu  where sname regexp  '^aaa' 

$ :匹配字符结束的部分

:从info表name字段中查询以c结尾的记录

 select * from info where name regexp 'c$'; 

:查询姓名以’L’开头,以’Y’结尾,中间有任意1个字符的记录

  select * from stu where sname REGEXP  '^L.Y$'

[字符集合] 匹配字符集合中的任意字符

:从info表name字段中查询包含c、e、o三个字母中任意一个的记录 .

select  *  from  info  where  name  regexp  '[ceo]' 

[^字符集合] :匹配除了字符集合外的任意字符

:从stu表sname字段中查询包含a-w字母和数字以外字符的记录

   select * from stu  where name regexp '[^a-w0-9]'; 

: 从info表name字段中查询包含’ic’的记录

 select * from stu  where name regexp 'ic'; 

: 从info表name字段中查询包含ic、uc、ab三个字符串中任意一 个的记录

  select *  from stu  where sname regexp 'ic|uc|ab'; 

*: 代表多个该字符前的字符,包括0个或1个

: 从info表name字段中查询c之前出现过a的记录

 select  *  from  stu  where sname regexp  'a*c'; 

+ : 代表多个该字符前的字符,包括1个

: 从stu表sname字段中查询c之前出现过a的记录

   select * from info where name regexp 'a+c';/*(注意比较结果!) */

字符串{N} :字符串出现N次

:从info表sname字段中查询出现过’a’3次的记录

select * from stu where name regexp 'a{3}'; 

字符串{M,N}:字符串最少出现M次,最多出现N次

:从stu表sname字段中查询”ab”出现最少1次最多3次的记录

  select  * from  stu  where  sname  regexp  'ab{1,3}'; 

视图

​ 视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。

​ 视图由数据库中的一个表或多个表导出的虚拟表。其作用是方便用户对数据的操作。

​ 视图是一种虚拟的表。视图从数据库中的一个或多个表导出来的表。视图还可以从已经存在的视图的基础上定义。数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

视图是在原有的表或者视图的基础上重新定义的虚拟表,这可以从原有的表上选取对用户有用的信息。那些对用户没有用,或者用户没有权限了解的信息,都可以直接屏蔽掉。这样做既使应用简单化,也保证了系统的安全。视图起着类似于筛选的作用。

​ MySQL中,创建视图是通过SQL语句CREATE VIEW实现的。其语法形式如下:

CREATE [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE } ]
   VIEW 视图名 [ ( 属性清单 ) ]
AS SELECT 语句
  [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ;

ALGORITHM:表示视图选择算法

UNDEFINED:mysql将自动选择所要使用的算法

MERGE:将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分

TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句

CASCADED :更新视图时要满足所有相关视图和表的条件,该参数为默认值;

LOCAL:更新视图时,要满足该视图本身的定义条件即可

1 在单表上创建视图

​ MySQL中可以在单个表上创建视图,格式如下:

create  view  视图名
	 as  select 语句
	[with [cascaded| local] check option]

cascaded: 表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;

local**😗* 表示更新视图时,要满足该视图本身的定义的条件即可;

注意:使用create view 语句创建视图时,最好加上with check option参数,而且,最好加上cascaded参数,从视图上派生出来的新视图后,更新视图需要考虑其父视图的约束条件,这样可以保证数据的安全性。

建立信息系学生的视图。

CREATE VIEW IS_Student 
 AS  SELECT Sno , Sname , Sage FROM Student 
	WHERE Sdept = 'IS' ; 

注意:视图表的列名和select语句查询出的列名一致,不需要给出视图表的列名

**例:**建立信息系学生的视图。

 CREATE VIEW  IS_Student1 (学号,姓名,年龄)
     AS 
       SELECT  Sno,   Sname,  Sage  FROM    Stu
            WHERE  Sdept= 'IS'

注意: 视图的列名和select语句查询出来的列名不一致时,必须给出视图表中的列名.

**WITH CHECK OPTION:**透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)
例: 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。

 create  view   is_Student
        as 
      select    Sno,Sname,Sage
            from   Student
                where   Sdept= 'IS'
            with  check   option  

2 在多表上创建视图

**例:**建立一个视图sc_student

create  view  sc_student (sno,sname ,cno,grade)
  as  select  sno, sname, cno, grade from stu, sc where stu.sno =sc.sno

​ 查看视图是指查看数据库中已存在的视图的定义。查看视图必须要有show view的权限,mysql数据库下的user表中保存着这个信息。查看视图的方法包括describe语句、show table status语句、show create view 语句和查询information_schema 数据库下的views表等。

1 用describe 语句查看视图基本信息

格式 : describe 视图名

视图名:指所要查看的视图的名称

:查看视图 IS_Student的信息

  describe  IS_Student

2 用 show table satatus 语句查看视图基本信息

格式:

show  table  status  like'视图名'

like : 表示后面匹配的是字符串

**视图名:**指要查看的视图的名称,需要用单引号引起来

​ show table satatus 虽然可以查看视图的基本信息,但是通常很少使用,因为,使用该语句查询视图信息时,各个属性显示的值都是null,只有comment属性显示值为view .

:查询IS_Student视图的信息

show  status  like  'IS_Student'

3 show create view 语句查看视图相信信息

格式:

 show  create view  视图名 

show  create  view  IS_Student 

4 在views表中查看视图详细信息

 select  * from  information_schema.VIEWS

注意: show create view 语句可以查看视图的详细信息,如果希望了解详细信息,可以使用这个语句。所有视图的定义都是存储在information_schema数据库下的views表中,也可以在这个表中查看视图的定义。

5 修改视图

用create or replace view 语句修改视图的语法形式如下:

MySQL中,CREATE OR REPLACE VIEW语句可以用来修改视图。该语句的使用非常灵活。在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。CREATE OR REPLACE VIEW语句的语法形式如下:

create or replace  [ alogorithm= {undefined|  merge |temptable} ]
view   视图名 [ ( 属性清单 ) ]
 	as  select语句
[ with [cascaded| local] check option] ;

5.1用create or replace view语句修改视图

:修改v_stu视图

(1)创建视图v_stu

create  algorithm=temptable
	view   v_stu1( 学号, 姓名, 年龄)
	as  select  sno,  sname,  sage  from  stuent

(2)修改视图

create or replace  algorithm=temptable
	view   v_stu( sno,  sname ,sage)
	as   select  sno,  sname,  sage  from  stuent

Create or replace view 语句不仅可以修改已经存在的视图,也可以创建新的视图。

5.2用alter语句修改视图

​ 在MySQL中,ALTER语句可以修改表的定义,可以创建索引。不仅如此,ALTER语句还可以用来修改视图。ALTER语句修改视图的语法格式如下:

 ALTER [ ALGORITHM = { UNDEFINED | MERGE |  TEMPTABLE } ]
	VIEW 视图名 [ ( 属性清单 ) ]
	AS SELECT语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ] ;

**例:**用alter语句修改v_stu视图

alter view v_stu 
 	as select stu.sno , sname , ssex ,  grade
 from stu,sc where stu.sno = sc.sno 

不可更新的视图

​ 更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为是视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。

以下情况不可更新视图:

(1)视图中包含sum(),count(),max()和min()等函数

:创建一个视图,存储学生表中各性别的学生人数

create  view  stu_view(sex,total)
	as  select  ssex,  count(ssex) from student

(2)视图中包含union, uinon all , distinct , group by和having等关键字

:创建一个视图,存储每门课程的选课学号

 create view sc_view1(sno,cno)
	as select sno, cno from sc group by cno 

(3)常量视图

 create view view_sc
	 as select 'aric' as name ;

​ 因为该视图的name字段个字符串敞亮“Aric”,所以该视图也是不能更新的,使用update 更新时,会报系统错误。

(4)视图中的select中包含子查询

create viewstu_view ( sname)
   as select sname from student where sno in(select sno  from sc where cno ='1') 

(5)由不可更新视图导出的视图

create view worker_view
	 as select * from view_sc

更新视图worker_view

  update  worker_view  set name='abc' 

报错

[Err] 1288 - The target table worker_view of the UPDATE is not updatable

(6)视图对应的表上存在没有默认值的列,而且该列没有包含在在视图里。例如,表中包含name字段没有默认值,但是视图中不包含该字段。则这个视图是不能更新的视图,因为在更新视图时,这个没有默认值的记录将没有值插入,也没有null值插入,数据库系统是不会允许这样的情况出现的,其会组织这个视图的更新。

当视图不需要时,可以将其删除,删除视图时,只能删除视图的定义,不会删除数据,删除一个或多个视图,使用DROP VIEW语句,语法格式 如下:

DROP VIEW [IF EXISTS] 
     View_name [,view_name1]…… 
          [RESTRICT | CASCADE]

说明

View_name:表示要删除的视图名称 ,视图名称可以添加多个,各个名称之间使用逗号隔开

IF EXISTS:判断视图是否存在,如果存在则执行,不存在则不执行;
注意:删除视图,必须拥有DROP权限。

数据库的完整性约束 (mysql教程)

1主键约束

2唯一性约束

例:

create table s(sno varchar(10),
 	sname char(10),
 	unique(sno))

3参照完整性约束

例:

create table sc ( sno char(10),
	cno char(10),
	Grade int ,
	constraint f_c foreign key ( sno ) references s(sno)
                 on delete  restrict
                 on update restrict )

Sc表中的学号一定在s表中存在

删除外键约束:

 alter  table sc   drop  foreign  key f_c

3参照完整性约束

**:

Create table sc(sno char(10),
	cno char(10),
	grade int ,
	primary  key(sno,cno),
	foreign  key(sno)  references s(sno) on update  cascade )

例:更新s12表的时候,sc表中的学号也随之更改

create table s12(sno char(10) primary key)
	insert into s12 values('2015142101')
Create table sc1(sno  char(10),
	cno char(10),
	grade  int,
	primary  key(sno,cno),
	foreign  key(sno)  references s12(sno) on update cascade)

insert into sc1 values('2015142101','1',80)
update s12 set sno ='2015142102' where  sno ='2015142101'

4 check完整性约束

check可以定义为列的完整性约束,也可以定义为表的完整性约束。

语法格式如下:

check(表达式)

:创建一个表student ,包含学号和性别两列,性别只能是男或女 。

create table student
	(sno char(10) not null,
	sex char(10) not null
	check(sex in(‘男’,’女’)) )

4 check完整性约束(无效的)

:创建一个表student,包含学生的学号和出生日期,出生日期必须大于1990年1月1日

create table student (sno char(10),
	birthday date not null 
	check(birthday>1990-01-01))
insert  into  student1 values('2012142101','1990-01-05')

:创建一个学生表student2,只包含学号和性别,并且性别列中的所有值都来源于student 表的性别列中。

Create table student3 (sno char(10) not null , 
                       sex char(10) not null ,
                      check(sex in(select sex from student)))

:创建一个student表,有学号,最好成绩和平均成绩,要求最好成绩必须大于平均成绩。

Create table student (sno char(10),
		max_grade int ,
        avg_grade int ,
        check (max_grade>avg_grade))
 

5 删除完整性约束

​ 如果使用一条drop table语句删除一个表,所有的完整性约束都自动被删除了。被参照表的所有外键也都被删除了,使用alter table语句,完整性可以独立地被删除,而不必删除表本身。删除完整性约束的语法和删除索引的语法一样。

create table sc ( sno char(10),
	cno char(10),
	Grade int ,
	constraint f_c foreign key (sno) references s(sno)
	on delete    restrict
	on update   restrict )

Sc表中的学号一定在s表中存在

删除创建的表sc的外键

    alter  table  sc   drop  foreign  key  f_c 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值