C++学习路线(数据库部分)四

表的插入

插入数据记录是常见的数据操作,可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录,该SQL语句可以通过如下4种方式使用:插入完整数据记录、插入部分数据记录、插入多条数据记录和插入JSON结构的数据记录(暂且不讲)。

  1. 插入完整数据记录

在MySQL中插入完整的数据记录可通过SQL语句INSERT来实现,其语法形式如下:

INSERT INTO tablename(field1, field2, field3, ..., fieldn) VALUES(value1, value2, value3, ..., valuen);

可以缩写为:

INSERT INTO tablename VALUES(value1, value2, value3, ..., valuen);

参数: tablename表示所要插入完整记录的表名,参数fieldn表示表中的字段名字,参数valuen表示所  要插入的数值,并且参数fieldn与参数valuen一一对应。

mysql> create database school;   #创建数据库school  

mysql> use school;   #选择数据库school  

mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class, 并建立包含id,teacher字段的多列索引  

mysql> show create table class;  #查看表定义  

mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin');  # 插入完整记录

mysql> insert into class values(2, '二班', 'Rock');   # 方式二,完整插入可缩写

  1. 插入部分数据记录

语法形式:

INSERT INTO tablename(field1, field2, field3, ..., fieldn) VALUES(value1, value2, value3, ..., valuen);

注意: 如果域没有设定默认值,也没有设定为自增长,则插入记录时必须插入值

mysql> create database school;   #创建数据库school  

mysql> use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql> show create table class;  #查看表定义  

mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin');  # 插入完整记录

mysql> insert into class (name, teacher)values('二班', 'Rock');   # 插入部分记录

  1. 插入多条数据记录

语法形式:

INSERT INTO tablename(field1, field2, field3, ..., fieldn)

VALUES(value11, value12, value13, ..., value1n),   

(value21, value22, value23, ..., value2n),          

... ....                                             

(valuen1, valuen2, valuen3, ..., valuenn);           

mysql> create database school;   #创建数据库school  

mysql> use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql> show create table class;  #查看表定义  

mysql> insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny');  # 插入多条记录

  1. 更新特定数据记录

在MySQL中更新特定数据记录可通过SQL语句UPDATE来实现,其语法形式如下:

UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, ..., fieldn = valuen)

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny');  # 插入多条记录

mysql> update class set teacher = '如花老师' where teacher = 'Rock';  #通过teacher 字段匹配更新记录       

mysql> update class set teacher = '如花老师' where id = 2;  #通过id 字段匹配更新记录

    WHERE CONDITION;   

上述语句中,参数tablename表示所要更新数据记录的表名,参数field表示表中所要更新数值的字段名字,参数valuen表示更新后的数值,参数CONDITION指定更新满足条件的特定数据记录。

  1. 更新所有数据记录

在MySQL中更新特定数据记录可通过SQL语句UPDATE来实现,其语法形式如下:

UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, ..., fieldn = valuen)

    WHERE CONDITION;        

UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, ..., fieldn = valuen) ;

在上述语句中,参数tablename表示所要更新数据记录的表名,参数field表示表中所要更新数值的字段名字,参数valuen表示更新后的数值,参数CONDITION表示满足表tablename中的所有数据记录,或不使用关键字WHERE语句。

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny');  # 插入多条记录

mysql> update class set teacher = '如花老师' ;  #把所有记录的teacher列改成如花老师        

       或   

mysql> update class set teacher = '如花老师' where 1=1;  

  1. 删除所有数据记录

在MySQL中删除所有数据记录同样可通过SQL语句DELETE来实现,其语法形式如下:

DELETE FROM tablename WHERE CONDITION;          

DELETE FROM tablename;

在上述语句中,为了删除所有的数据记录,参数CONDITION需要满足表tablename中所有数据记录,如id>0; 或者无关键字WHERE语句。

  1. 删除所有数据记录

在MySQL中删除所有数据记录同样可通过SQL语句DELETE来实现,其语法形式如下:

DELETE FROM tablename WHERE CONDITION;          

DELETE FROM tablename;

在上述语句中,为了删除所有的数据记录,参数CONDITION需要满足表tablename中所有数据记录,如id>0; 或者无关键字WHERE语句。

例如:所有老师带的班级都毕业了,从class 表中删除!

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny');  # 插入多条记录

mysql> delete from class ;  #直接删除所有记录       

mysql> delete from class where id > 0;  #通过id 字段删除匹配的所有记录

作业:设计游戏用户信息表

回顾下Jack 要实现的用户登陆模块,具体需求如下:

  • 游戏玩家访问游戏客户端,通过客户端界面输入用户名和密码
  • 在游戏玩家点击确认后,客户端连接至数据库服务器对用户名和密码进行确认

如果验证成功,则 玩家可以进入大厅,如果失败,则不允许进入

请帮Jack 设计好相应的数据库表,并插入少量样例数据!

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

表的查询

查询所有字段数据查询指定字段数据避免重复数据查询对结果进行排序和分组等查询

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

SELECT field1 field2 … fieldn

    FROM tablename

    [WHERE CONDITION1]

    [GROUP BY fieldm [HAVING CONDITION2]]

    [ORDER BY fieldn [ASC|DESC]]

其中,filed1~fieldn参数表示需要查询的字段名;tablename参数表示表的名称;CONDITION1参数表示查询条件;fieldm参数表示按该字段中的数据进行分组;CONDITION2参数表示满足该表达式的数据才能输出;fieldn参数指按该字段中数据进行排序。排序方式由ASC和DESC两个参数指出;ASC参数表示按升序的顺序进行排序,是默认参数;DESC参数表示按降序的顺序进行排序。

1.  列出表的所有字段

通过SQL语句SELECT列出表的所有字段,具体语法形式如下:

    SELECT field1,field2,…,fieldn FROM tablename;  

其中,filed1~fieldn参数表示需要查询的字段名;tablename参数表示表的名称。

2. “*”符号表示所有字段

查询所有字段数据,除了使用上面的方式外,还可以通过符号“*”来实现,具体语法形式如下:

     SELECT * FROM tablename;     

其中,符号“*”表示所有字段名;tablename参数表示表的名称。与上一种方式相比,“*”符号方式的优势比较明显,即可用该符号代替表中的所有字段,但是这种方式不够灵活,只能按照表中字段的固定顺序显示,不能随便改变字段的顺序。

3.查询指定字段数据

查询指定字段数据,只需修改关键字SELECT后的字段列表为指定字段即可。

    SELECT field1,field2,…,fieldn FROM tablename;   

例如,从班级表中查询班主任字段,SQL语句如下所示。

    SELECT teacher FROM class;    

如果关键字SELECT后面的字段不包含在所查询的表中,那么MySQL会报错。

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录

mysql> select teacher from class ;  #查询class表中的teacher 域

insert into class(id , name , teacher) values(1 , '123' , '123'),(2,'1233','123');

4. DISTINCT查询  

当在MySQL中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复数据,MySQL提供了DISTINCT功能,SQL语法如下:

    SELECT DISTINCT field1,field2,…,fieldn FROM tablename;   

在上述语句中,关键字DISTINCT去除重复的数据。下面将通过一个具体的示例来说明如何实现查询不重复数据。

执行SQL语句SELECT,在数据库school中查询班级 class teacher字段的数据。具体步骤如下:

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录

mysql> select teacher from class ;  #查询class表中的teacher 域,包含重复记录

mysql> select distinct teacher from class ;  #查询class表中的teacher 域,去重   

 

  1.  IN查询

有的时候,当我们需要查询的目标记录限定在某个集合中的时候,在MySQL中可以使用关键字IN来实现,关键字IN可以实现判断字段的数值是否在指定集合,该关键字的具体语句形式如下:

    SELECT field1,field2,…,fieldn   

    FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);   

注:参数fieldn表示名称为tablename的表中的字段名,参数valuen表示集合中的值,通过关键字IN来判断字段fieldm的值是否在集合(value1,value2,value3,…,valuen)中,如果字段fieldm的值在集合中,就满足查询条件,该记录会被查询出来,否则不会被查询出来。

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录   

mysql> select * from class where teacher in ('Martin','Rock') ;  #查询class表中的teacher 域是martin 和Rock 的记录   

使用NOT IN可以反向查询非集合中的数据

    SELECT field1,field2,…,fieldn   

FROM tablename WHERE filedm NOT IN(value1,value2,value3,…,valuen);

集合查询的注意: 集合中慎用 NULL

在具体使用关键字IN时,查询的集合中如果存在NULL,则不会影响查询,NULL 存不存在的效果都一样但如果使用关键字NOT IN,查询的集合中如果存在NULL,则不会查询到任何的结果。

  1.  BETWEEN AND查询

当我们需要查询指定范围内的数据(如: id 从0 到 100)的时候,MySQL提供了关键字BETWEEN AND,用来实现判断字段的数值是否在指定范围内的条件查询。该关键字的具体语法形式如下:

    SELECT field1,field2,…,fieldn  

    FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue  

在上述语句中,参数fieldn表示名称为tablename的表中的字段名,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,那么满足查询条件,该记录会被查询出来,否则不会被查询出来。

BETWEEN minvalue AND maxvalue,表示的是一个范围间的判断过程,只针对数字类型。

  1. 符合范围的数据记录查询

通过关键字BETWEEN和AND设置查询范围,以实现查询语文成绩(字段Chinese)在80和90之间的学生,具体SQL如下

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date  date);       #创建成绩表 grade   

mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04');  # 插入多条记录   

mysql> select * from class where chinese between  80 and 90 ;  #查询成绩表中语文成绩在80 和 90 之间的学员记录

mysql> select * from grade where create_date between '2020-05-01' and '2020-06-04'

2. 不符合范围的数据记录查询

通过关键字NOT设置反向查询非查询范围条件,具体SQL语句如下:

    SELECT name,chinese   

FROM grade WHERE Chinese NOT BETWEEN 85 AND 90;  

上面语句等同于:

select name,chinese from grade where chinese <85 or chinese >90;

  1. LIKE模糊查询

当我们只想用字符串中间的一部分特征查找含有特征字串的信息时,MySQL提供了关键字LIKE来实现模糊查询,需要使用通配符,具体语法形式如下:

    SELECT field1,field2,…,fieldn  

    FROM tablename WHERE fieldm LIKE value;    

在上述语句中,参数tablename表示表名,参数fieldn表示表中的字段名字,通过关键字LIKE来判断字段field的值是否与value字符串匹配,如果相匹配,则满足查询条件,该记录就会被查询出来;否则就不会被查询出来。

在MySQL中,字符串必须加上单引号('')和双引号(″″)。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符。LIKE关键字支持的通配符如表5-1所示。

  1. 查找某个字段含有‘三’字的记录:

SELECT * FROM class WHERE teacher LIKE ‘%三%’;

注意:  将会把teacher字段为“三”,“张三”,“张猫三”、“三脚猫”,“唐三藏”等等“三”的记录全找出来

2.查找teacher字段中既有“三”又有“猫”的记录,请使用and条件

SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%猫%’;

3.查询teacher字段中既有“三”又有“猫”的记录,同时“猫”在“三”之后的记录

SELECT * FROM class WHERE teacher LIKE ‘%三%猫%’;

4.只找出“唐三藏”这样teacher为三个字且中间一个字是“三”的;

SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;

注意:_表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文  字符)

5.只找出“三脚猫”这样teacher为三个字且第一个字是“”的;

SELECT * FROM class WHERE teacher LIKE ‘三__’;

讲了这么多,咱来实战一把:

1. 带有“%”通配符的查询

(1)查询字段teacher中以字母Ma开头的数据记录,具体SQL语句如下:

    SELECT teacher FROM class WHERE teacher LIKE '%Ma%';

(2)MySQL不区别大小写,上述SQL语句可以修改如下:

    SELECT * FROM class WHERE teacher LIKE 'MA%';

(3)如果想查询不是以字母Ma开头的全部老师,可以执行逻辑非运算符(NOT),具体SQL语句如下

    SELECT teacher FROM class WHERE teacher NOT LIKE '%ar%';

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table class(id int UNIQUE AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64));       #创建表class,指定id 字段自增长  

mysql>  insert into class(id, name, teacher) values(1, '一班', 'Martin'),(2,'二班', 'Rock'),(3, '三班', 'Janny'),(4,'四班', 'Janny');  # 插入多条记录

mysql> SELECT teacher FROM class WHERE teacher LIKE '%Ma%';  #查询class表中的teacher 域,包含重复记录   

mysql> SELECT name FROM class WHERE  name NOT LIKE '%ar%';  

2. 带有“_”通配符的查询

(1)查询字段teacher中第二个字母为A的数据记录,具体SQL语句如下:

    SELECT * FROM class WHERE teacher LIKE '_A%';

(2)如果想查询第二个字母不是A的全部老师,可以执行逻辑非运算符(NOT),具体SQL语句如下:

    SELECT * FROM class WHERE NOT teacher LIKE '_A%';

(3)如果想查询第二个字母不是A的全部老师,也可以用以下SQL语句查询:

    SELECT * FROM class WHERE teacher NOT LIKE '_A%';

3.使用LIKE关键字查询其他类型数据

(1)执行SQL语句SELECT,查询grade表字段english带有数字9的全部学生,具体SQL语句如下:

    SELECT name,english FROM grade WHERE english LIKE '%9%';

(2)对于LIKE关键字,如果匹配“%%”,就表示查询所有数据记录。

    SELECT name FROM grade WHERE name LIKE '%%';

mysql>  create database school;   #创建数据库school  

mysql>  use school;   #选择数据库school  

mysql> create table grade(id int UNIQUE AUTO_INCREMENT, name varchar(128) NOT NULL, math tinyint unsigned, chinese tinyint unsigned, english tinyint unsigned, create_date  date);       #创建成绩表 grade   

mysql> insert into grade values(1, '甲', 80, 87, 91,'2020-02-03'),(2,'乙', 72, 64, 89,'2020-05-01'),(3, '丙', 54, 69, 87,'2020-04-21'),(4,'丁', 78, 79, 89, '2020-06-04');  # 插入多条记录   

mysql>  select * from grade where english like '9_' ;  #查询英语成绩是90 - 99 的记录

猜你喜欢

转载自blog.csdn.net/weixin_45169583/article/details/143349591