发布时间:2025-12-09 16:08:02 浏览次数:15
初学数据库的基本概念
MySQL数据库的使用(一)-数据库的增删改查
MySQL数据库的使用(二)-表的增删改查
在昨天的内容上继续SQL的使用,内容主要是如何添加内容到表中,删除,更改,查看等内容,还有一些常用的类型说明。
语句、字句、关键字是可以大写,也可以小写的,这个没关系,规范写的话,可以使用大写,而表名、数据库名、列这些信息只能用小写来写。
数据类型是定义列中可以存储什么数据以及该数据实际怎样存储的基本规则;
数据类型用于以下的目的:
数据类型允许限制可存储在列中的数据;
数据类型允许在内部更有效地存储数据;
数据类型允许变换排序顺序。
因此在使用数据类型时,往往要注意选择正确合适的数据类型,避免浪费了系统的性能以及无法写入内容的可能性。
数据类型一共分为四类,一类是数值类型,一类是字符串类型,一类是日期类型,还有一个是二进制数据类型。
数值类型
我猜不会真有人去记上面的数字,虽然说类型是比较重要的一项内容,其实只需要了解什么情况用到什么类型的数值就行了,需要用到的时候再回头来看看。
带有数值类型的列在添加内容的时候,是不需要加单引号的,这点可以了解一下。
字符串类型:(直接上图了)
字符串类型有两点是比较重要的,第一个是插入的内容需要带有单引号,否则数据库会报错,第二是设定字段的类型时,需要填写内容的长度信息,否则也会出现报错的情况。
example:
日期和时间类型:
这个类型是专门用来存储日期和时间的值。
二进制数据类型可存储任何数据(包括二进制的信息),如图像、多媒体、字处理文档等信息。
下面继续来讲数据库添加数据的使用。
在表中添加行的内容,需要使用到insert开头的语句
insert into 表名 values(内容1,内容2);example:
mysql> create table students(id int,name varchar(30));Query OK, 0 rows affected (0.19 sec)mysql> insert into students values(1,'zhangsan');Query OK, 1 row affected (0.06 sec)mysql> select * from students;+------+----------+| id | name |+------+----------+| 1 | zhangsan |+------+----------+1 row in set (0.00 sec)已经成功插入了一条数据库记录在表中;如果还需要继续往下添加内容,还是一样使用这条语句。
mysql> insert into students values(2,'lisi');Query OK, 1 row affected (0.00 sec)mysql> select * from students;+------+----------+| id | name |+------+----------+| 1 | zhangsan || 2 | lisi |+------+----------+2 rows in set (0.00 sec)一次性插入多行该如何操作呢;
mysql> insert into students values(3,'wangwu'),(4,'chenliu'),(5,'wangqi');Query OK, 3 rows affected (0.04 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> insert into students values(6,'tangba'),-> (7,'lijiu');Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0可以并排一次性写完,也可以切换到下一行来写,一般情况下,如果内容较多,可以换行来写,只要每写完一行后加上一个逗号即可。
单独给某一列添加内容
mysql> insert into students(name) values('葫芦娃1号');Query OK, 1 row affected (0.01 sec)mysql> select * from students;+------+---------------+| id | name |+------+---------------+| 1 | zhangsan || 2 | lisi || 3 | wangwu || 4 | chenliu || 5 | wangqi || 6 | tangba || 7 | lijiu || NULL | 葫芦娃1号 |+------+---------------+8 rows in set (0.00 sec)为什么会出现NULL的字样呢,内容不是为空呢,因为再次之前只在name的字段中添加了内容,其实这个是因为Default这个默认值为NULL。
那么是否可以修改这个内容值呢,结果肯定是可以的,我们接下来对id的默认值进行修改,在不添加id这列时,显示20。
好,已经设置了id字段的默认值,接下来继续;
mysql> insert into students(name) values('葫芦娃二号');Query OK, 1 row affected (0.02 sec)mysql> select * from students;+------+-----------------+| id | name |+------+-----------------+| 1 | zhangsan || 2 | lisi || 3 | wangwu || 4 | chenliu || 5 | wangqi || 6 | tangba || 7 | lijiu || NULL | 葫芦娃1号 || 20 | 葫芦娃二号 |+------+-----------------+9 rows in set (0.00 sec)不填写id时,默认值已经变成了20。
还有一种方式,可以让字段是必填项,也就是不能显示是null(空值);可以使用'not null' ,我们这次来修改name的字段,让他成为一个必填项。
mysql> alter table students modify name varchar(30) not null;Query OK, 0 rows affected (0.35 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc students;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | int | YES | | 20 | || name | varchar(30) | NO | | NULL | |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)修改了null后,再次查看字段信息name这一行null的yes修改成no,继续来进行测试;
mysql> insert into students(name) values('');Query OK, 1 row affected (0.00 sec)mysql> insert into students(name) values('葫芦娃三号');Query OK, 1 row affected (0.00 sec)mysql> insert into students(id) values(10);ERROR 1364 (HY000): Field 'name' doesn't have a default valuemysql> select * from students;+------+-----------------+| id | name |+------+-----------------+| 1 | zhangsan || 2 | lisi || 3 | wangwu || 4 | chenliu || 5 | wangqi || 6 | tangba || 7 | lijiu || NULL | 葫芦娃1号 || 20 | 葫芦娃二号 || 20 | || 20 | 葫芦娃三号 |+------+-----------------+11 rows in set (0.00 sec)看到这里就很奇怪,不是说修改了null(空值)后,内容不会为空吗,可是有一行出现了为空的内容。
数据库中的空值实际上指的是null,形式上为空的内容,它实际上还是有内容的,只是显示不了。
实际上,我们可以设置一个主键,让其的值唯一,玩过王者荣耀或者一些游戏的时候,都知道写名称的时候,有时候与其他人的名称相同会提示已经有这个名称了,需要更换名称,其实这个相当于设置了主键,让结果唯一,那么我们来看下这个怎么使用。
我们重新创建一个新表;
往里面写入内容;
mysql> desc store;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int | NO | PRI | NULL | auto_increment || shop | varchar(30) | NO | | NULL | |+-------+-------------+------+-----+---------+----------------+2 rows in set (0.00 sec)mysql> insert into store(shop) values('apple');Query OK, 1 row affected (0.02 sec)mysql> select * from store;+----+-------+| id | shop |+----+-------+| 1 | apple |+----+-------+1 row in set (0.00 sec)可以看到ID值默认生成了1,那么继续这样写入
mysql> insert into store(shop) values('pear');Query OK, 1 row affected (0.01 sec)mysql> insert into store(shop) values('banana');Query OK, 1 row affected (0.02 sec)mysql> select * from store;+----+--------+| id | shop |+----+--------+| 1 | apple || 2 | pear || 3 | banana |+----+--------+3 rows in set (0.00 sec)看到结果一直是以当前n+1的方式,总会是上一个的数字加一,我们第四个内容给他定义一个id,看是按它的方式走,还是按我们的方式走。
mysql> insert into store(id,shop) values(10,'orange');Query OK, 1 row affected (0.00 sec)mysql> select * from store;+----+--------+| id | shop |+----+--------+| 1 | apple || 2 | pear || 3 | banana || 10 | orange |+----+--------+4 rows in set (0.00 sec)由此可见,还是手动定义的优先级高于系统定义的。
此时若继续写入内容,是在id为3的基础上写入呢,还是继续从10开始往下n+1呢
结果很明显,在10的基础上继续往下+1。
如果将表的记录清空,auto_increment的值还会继续往下n+1吗
来看看两种不同的清空方式
先来看delete的方式
语句
example:
mysql> delete from store;Query OK, 5 rows affected (0.00 sec)mysql> select * from store;Empty set (0.00 sec)mysql> insert into store(shop) values('Codlin');Query OK, 1 row affected (0.02 sec)mysql> select * from store;+----+--------+| id | shop |+----+--------+| 12 | Codlin |+----+--------+1 row in set (0.00 sec)delete是没有办法清除auto_increment值的,这个值还在继续往下n+1的叠加。
语句
truncate table 表名;example:
mysql> truncate table store;Query OK, 0 rows affected (0.11 sec)mysql> desc store;+-------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+----------------+| id | int | NO | PRI | NULL | auto_increment || shop | varchar(30) | NO | | NULL | |+-------+-------------+------+-----+---------+----------------+2 rows in set (0.01 sec)mysql> select * from store;Empty set (0.01 sec)mysql> insert into store(shop) values('Cumquat');Query OK, 1 row affected (0.00 sec)mysql> select * from store;+----+---------+| id | shop |+----+---------+| 1 | Cumquat |+----+---------+1 row in set (0.00 sec)重新写入一行信息,id的值结果为1,使用truncate语句是可以重置auto_increment值。
注意:truncate会清除表的所有数据。如果只想清除auto_increment值 归零,不要使用该命令。
自始至终,写入内容的语法只有一条,而接下来将的查看内容语句、字句较多,还请耐心查看,我会尽量将目录分多一些,这样回头查看语句的时候亦可比较方便查询。
检索表的内容是用到的频率比较高,特别是在后期,我认为比新建还要更常用,所以我们讲的细一些,也由简到难这样的方式来写。
检索一列的内容;
检索多列内容;
mysql> select id,shop from store;+----+---------+| id | shop |+----+---------+| 1 | Cumquat |+----+---------+1 row in set (0.00 sec)检索所有列的内容
mysql> select * from store;+----+---------+| id | shop |+----+---------+| 1 | Cumquat |+----+---------+1 row in set (0.00 sec)使用通配符*表示显示所有的内容,Linux有些内容在mysql中同样适用。
使用上面那条select语句,默认是显示所有的内容,如果内容中有出现重复的,或者有多行重复的,可以使用DISTINCT关键词来去重复。
语句
example:
mysql> select * from store;+------+--------+| id | name |+------+--------+| 2 | apache || 3 | pear || 4 | orange || 3 | apple || 5 | banana || 4 | orange |+------+--------+6 rows in set (0.00 sec)mysql> select distinct id from store ;+------+| id |+------+| 2 || 3 || 4 || 5 |+------+4 rows in set (0.00 sec) mysql> select distinct * from store ;+------+--------+| id | name |+------+--------+| 2 | apache || 3 | pear || 4 | orange || 3 | apple || 5 | banana |+------+--------+5 rows in set (0.03 sec)有一行没有显示出来,与上面的信息对比,是id为4的内容,必须两行都出现相同重复的内容才会distinct去重。
select语句返回所有匹配的行,它们可能是指定表中的每一行,为了返回第一行或前几行,可使用LIMIT字句;
select 列 from 表名 LIMIT 显示多少行;example:
mysql> SELECT * FROM books LIMIT 3;+-----+-----------------------------+---------+-----------------------------+-------+------------+-----------+------------+| bId | bName | bTypeId | publishing | price | pubDate | author | ISBN |+-----+-----------------------------+---------+-----------------------------+-------+------------+-----------+------------+| 1 | 网站制作直通车 | 2 | 电脑爱好者杂志社 | 34 | 2004-10-01 | 苗壮 | 7505380796 || 2 | 黑客与网络安全 | 6 | 航空工业出版社 | 41 | 2002-07-01 | 白立超 | 7121010925 || 3 | 网络程序与设计-asp | 2 | 北方交通大学出版社 | 43 | 2005-02-01 | 王玥 | 75053815x |+-----+-----------------------------+---------+-----------------------------+-------+------------+-----------+------------+3 rows in set (0.00 sec)这个语句使用select语句检索所有列,LIMIT 3指示MySQL返回不高于3行内容。
如果要从第三行开始显示五行内容,使用LIMIT字句一样可行;
使用LIMIT后跟着的是2,5,才会显示从3开始往下5行内容,这个是因为检索第一行实际要写的数字是0,而检索第二行要写的数字是1。
完全限定的表名是使用表名和列的来检索内容,相当于是全路径的方式检索;一起来看下语句
SELECT 表名.列名 FROM 数据库名.表名; mysql> SELECT books.bname FROM book.books LIMIT 3;+-----------------------------+| bname |+-----------------------------+| 网站制作直通车 || 黑客与网络安全 || 网络程序与设计-asp |+-----------------------------+3 rows in set (0.00 sec)后面可能会有一些情况是需要用到完全限定名的,所以可以提前先了解一下它的用法。
让数据表中的内容可以按照我们设定的方式进行排序,可以使用order by这个字句,根据需要排序的内容检索出相应的数据。
SELECT 列名 FROM 表名 ORDER BY 列名;example:
mysql> SELECT bid,bname FROM books ORDER BY bid LIMIT 3;+-----+-----------------------------+| bid | bname |+-----+-----------------------------+| 1 | 网站制作直通车 || 2 | 黑客与网络安全 || 3 | 网络程序与设计-asp |+-----+-----------------------------+3 rows in set (0.01 sec)内容默认是以升序的方式进行排序,也就是从小到大的方式,当然也可再加上ASC,这个亦是表示升序的意思;
mysql> SELECT bid,bname FROM books ORDER BY bid asc LIMIT 3;+-----+-----------------------------+| bid | bname |+-----+-----------------------------+| 1 | 网站制作直通车 || 2 | 黑客与网络安全 || 3 | 网络程序与设计-asp |+-----+-----------------------------+3 rows in set (0.02 sec)按降序的方式进行排序,需要使用到DESC这个关键字
mysql> SELECT bid,bname FROM books ORDER BY bid DESC LIMIT 3;+-----+----------------------------------------------------+| bid | bname |+-----+----------------------------------------------------+| 44 | XML 完全探索 || 43 | ASP 3初级教程 || 42 | SQL Server 7.0数据库系统管理与应用开发 |+-----+----------------------------------------------------+3 rows in set (0.00 sec)如果想在多个列上进行降序排序,必须对每个列都指定DESC的关键词;
mysql> SELECT bid,bname,btypeid FROM books ORDER BY bid DESC,btypeid DESC LIMIT 3;+-----+----------------------------------------------------+---------+| bid | bname | btypeid |+-----+----------------------------------------------------+---------+| 44 | XML 完全探索 | 2 || 43 | ASP 3初级教程 | 2 || 42 | SQL Server 7.0数据库系统管理与应用开发 | 1 |+-----+----------------------------------------------------+---------+3 rows in set (0.00 sec)过滤数据一样是使用select这个语句,再加上WHERE字句指定搜索条件。
SELECT 列名 FROM 表名 WHERE 列名 操作符 值;这样看它的语句不是很明白,那么用一个案例来说明下;
example:
显示出BID为20的内容了;
除了=的操作符,实际上还有很多用来过滤数据的操作符,以图表的显示:
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| BETWEEN | 在指定的两个值之间 |
操作符有了,那就多举几个例子,方便理解where字句的使用;
mysql> SELECT bid,bname,btypeid FROM books WHERE btypeid > 3;+-----+----------------------------------------+---------+| bid | bname | btypeid |+-----+----------------------------------------+---------+| 2 | 黑客与网络安全 | 6 || 4 | pagemaker 7.0短期培训教程 | 9 || 5 | 黑客攻击防范秘笈 | 6 || 8 | Internet操作技术 | 7 || 11 | Auto CAD职业技能培训教程 | 10 || 13 | 自己动手建立企业局域网 | 8 || 16 | Illustrator 10完全手册 | 9 || 17 | FreeHand 10基础教程 | 9 || 20 | Auto CAD 3D模型大师 | 10 || 21 | Linux傻瓜书 | 4 || 24 | Auto CAD 2000 应用及实例基集锦 | 10 || 27 | Delphi 5程序设计与控件参考 | 5 || 28 | 活学活用Delphi5 | 5 || 33 | Auto CAD R14 中文版实用教程 | 10 || 39 | lllustrator 9宝典 | 9 |+-----+----------------------------------------+---------+15 rows in set (0.00 sec)mysql> SELECT bid,bname,btypeid FROM books WHERE btypeid < 2;+-----+----------------------------------------------------+---------+| bid | bname | btypeid |+-----+----------------------------------------------------+---------+| 25 | Access 2000应用及实例基集锦 | 1 || 41 | SQL Server 2000 从入门到精通 | 1 || 42 | SQL Server 7.0数据库系统管理与应用开发 | 1 |+-----+----------------------------------------------------+---------+3 rows in set (0.00 sec)显示除了Btypeid为2的内容
mysql> SELECT bid,bname,btypeid FROM books WHERE btypeid <> 2 LIMIT 3;+-----+---------------------------------+---------+| bid | bname | btypeid |+-----+---------------------------------+---------+| 2 | 黑客与网络安全 | 6 || 4 | pagemaker 7.0短期培训教程 | 9 || 5 | 黑客攻击防范秘笈 | 6 |+-----+---------------------------------+---------+3 rows in set (0.00 sec)还可以用来显示一个范围的内容,显示Bid1到5的内容。
mysql> SELECT bid,bname,btypeid FROM books WHERE bid BETWEEN 1 AND 5;+-----+---------------------------------+---------+| bid | bname | btypeid |+-----+---------------------------------+---------+| 1 | 网站制作直通车 | 2 || 2 | 黑客与网络安全 | 6 || 3 | 网络程序与设计-asp | 2 || 4 | pagemaker 7.0短期培训教程 | 9 || 5 | 黑客攻击防范秘笈 | 6 |+-----+---------------------------------+---------+5 rows in set (0.05 sec)显示除了这个范围以外的其他内容,可以在BETWEEN前面加上NOT,相当于显示的值取反。
mysql> SELECT bid,bname,btypeid FROM books WHERE bid NOT BETWEEN 1 AND 5 LIMIT 3;+-----+------------------------------+---------+| bid | bname | btypeid |+-----+------------------------------+---------+| 6 | Dreamweaver 4入门与提高 | 2 || 7 | 网页样式设计-CSS | 2 || 8 | Internet操作技术 | 7 |+-----+------------------------------+---------+3 rows in set (0.00 sec)相同用法,其实只用AND也可以实现这个效果,一起来看下这个语句;
mysql> SELECT bid,bname,btypeid FROM books WHERE bid >= 1 AND bid <= 5;+-----+---------------------------------+---------+| bid | bname | btypeid |+-----+---------------------------------+---------+| 1 | 网站制作直通车 | 2 || 2 | 黑客与网络安全 | 6 || 3 | 网络程序与设计-asp | 2 || 4 | pagemaker 7.0短期培训教程 | 9 || 5 | 黑客攻击防范秘笈 | 6 |+-----+---------------------------------+---------+5 rows in set (0.00 sec)要显示固定几个值的内容也可以实现,可以使用or这个关键字;
显示bid为10,20,30的内容
与上面or显示效果一样的,可以使用in关键句,这个使用起来比较容易,不需要重复写要等于的值。
mysql> SELECT bid,bname,btypeid FROM books WHERE bid IN (10,20,30);+-----+-------------------------------+---------+| bid | bname | btypeid |+-----+-------------------------------+---------+| 10 | 3D MAX 3.0 创作效果百例 | 3 || 20 | Auto CAD 3D模型大师 | 10 || 30 | 3DS MAX 4横空出世 | 3 |+-----+-------------------------------+---------+3 rows in set (0.00 sec)前面介绍所有操作符都是针对已知项进行过滤的。但是如果碰到你不知道哪个值怎么写或者说只记得个大概前缀,那么就可以使用LIKE这个操作符来检索了。
与LIKE一起搭配使用的还有这个通配符(%),在搜索内容时,%可以用来标识任何字符出现的次数。
比如说我要找一本关于Linux的书,但是我不知道它的全名,就可以使用like来模糊检索相关的内容;
mysql> SELECT bid,bname,btypeid FROM books WHERE bname LIKE '%linux%';+-----+----------------+---------+| bid | bname | btypeid |+-----+----------------+---------+| 21 | Linux傻瓜书 | 4 |+-----+----------------+---------+1 row in set (0.00 sec)另外一个通配符是下划线_。下划线的用途与%一样,但下划线只匹配单个字符而非多个字符。
mysql> SELECT bid,bname,btypeid FROM books WHERE bname LIKE '____防范秘笈';+-----+--------------------------+---------+| bid | bname | btypeid |+-----+--------------------------+---------+| 5 | 黑客攻击防范秘笈 | 6 |+-----+--------------------------+---------+1 row in set (0.00 sec)还有一种查询方式是子查询,可以通过查询另外一个表的内容得出的结果,显示给前面要查询的值,一起来看下如何使用。
mysql> select bid,bname from books where bid=(select btypeid from category where btypename='网络技术');+-----+--------------------------+| bid | bname |+-----+--------------------------+| 7 | 网页样式设计-CSS |+-----+--------------------------+1 row in set (0.00 sec)表中的记录信息如果出现写错了,可以不用执行删除这个语句,可以直接通过更新,让它更换成其他的内容。一起来看下怎么使用的。
UPDATE 表名 SET 列='要修改的内容' where 第几行;example:
ID为4的内容修改成Bryony
删除行的内容是使用delete语句,一起来看下它的用法。
DELETE FROM 表名 WHERE 删除的行;example·:
删除name带有apache的行;
还可以用来删除一定范围的数值;删除4-5的值;
mysql> DELETE FROM store WHERE id BETWEEN 4 and 5;Query OK, 3 rows affected (0.03 sec)mysql> select * from store;+------+-------+| id | name |+------+-------+| 3 | pear || 3 | apple |+------+-------+2 rows in set (0.00 sec)数据库表行的内容虽然说还有很多内容,一次肯定是写不完的,数据库还可以使用正则表达式,直接在数据库计算字段,游标,触发器等等内容,后面继续讲,如果觉得内容还行的,可以点赞支持一下!