MySQL的数据操作1(INSERT、UPDATE、DELETE、SELECT、WHERE、模糊查询)

为数据表增加记录(insert)

  首先创建一个数据库和一个数据表

CREATE DATABASE IF NOT EXISTS test_base DEFAULT CHARACTER SET 'UTF8';

USE test_base;

CREATE TABLE IF NOT EXISTS mytest(
    id INT UNSIGNED AUTO_INCREMENT KEY COMMENT '用户编号',
    username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
    sex ENUM('男','女','保密') NOT NULL DEFAULT '保密' COMMENT '性别',
    age TINYINT UNSIGNED NOT NULL COMMENT '年龄'
)ENGINE=INNODB CHARSET=UTF8;

  要在数据表中添加数据,有以下操作

INSERT mytest VALUE(NULL,'king',1,18);//如果未指定字段名,则所有字段都必须赋值,有自动增长属性的可以赋值为NULL
INSERT mytest VALUES(NULL,'Jhon','男',19),(NULL,'Mike',1,20),(NULL,'Jack',1,26);

INSERT mytest VALUE(NULL,'hing',DEFAULT,18);
INSERT mytest(username,age) VALUE('Mary',17);//指定字段名,其他未指定的字段名必须有默认值或者会自动赋值


INSERT mytest SET username='Black',sex='男',age=19;

INSERT mytest VALUE(DEFAULT,'hung',DEFAULT,18);

//主键id值为NULL时会自动在当前最大id号的基础上加1
//如果king的id号一开始就为2而不是NULL,那么在添加后面的记录时,最大id号变成了2,
//所以在添加后面的记录时是从2开始增长的。
//最终,所有记录中没有id号为1的记录,除非用户自己再添加一个指定id为1的记录。

  最后得到的所有记录如下:

id  username sex age
1   king    男    18
2   Jhon    男    19
3   Mike    男    20
4   Jack    男    26
5   hing    保密  18
6   Mary    保密  17
7   Black   男    19
8   hung    保密  18

INSERT还可以与SELECT一起使用,实现将所查询出来的结果插入到目标表中的功能。




修改已有记录中的字段(update)

  在上面创建的表和记录的基础上,对其中的记录进行修改:

UPDATE mytest SET age=10 WHERE id =1;//将id为1的那一行记录的age字段改为10

UPDATE mytest SET age=age+10,sex=DEFAULT;//对表中所有记录的age字段实现自加10,并将sex设为默认值
                                         //(没有where+范围约束,则默认表中所有记录)

UPDATE mytest SET age=age-15 WHERE id<5;//对表中id小于5的记录的age字段实现自减15


  更新后的结果如下:

id  username sex age
1   king    保密  5
2   Jhon    保密  14
3   Mike    保密  15
4   Jack    保密  21
5   hing    保密  28
6   Mary    保密  27
7   Black   保密  29
8   hung    保密  28

删除已有记录(delete)

  同样,在修改后的数据表的基础上进行操作

DELETE FROM mytest WHERE id=3;//删除id为3的记录,如果不加where,则表中所有记录都会被删除

得到如下结果:

id  username sex age
1   king    保密  5
2   Jhon    保密  14
4   Jack    保密  21
6   Mary    保密  27
7   Black   保密  29

  注意,如果将表中所有记录删除之后,再添加新的记录,其id也是在这个记录表中出现过的最大id号开始增长,即DELETE清空数据表后,不会重置AUTO_INCREMENT的值。
  再执行SHOW CREATE TABLE mytest;语句可以看到当前id自增长的值。
  可以使用语句ALTER TABLE mytest AUTO_INCREMENT =1;手动将其置为1。

  如果想要彻底清空数据表,包括重置AUTO_INCREMENT的值,可以使用如下语句:

TRUNCATE [TABLE] tbl_name;

下面是许多SQL程序员使用 UPDATE 或 DELETE 时所遵循的习惯:

  • 除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE子句的 UPDATE 或 DELETE 语句。
  • 保证每个表都有主键,尽可能像 WHERE 子句那样使用它(可以指定各主键、多个值或值的范围)。
  • 在对 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。
  • 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。

查询

  在上面创建的表和记录的基础上,我们来演示查询操作。
  我们最常用的查询语句是

SELECT * FROM tbl_name;//查询显示该表的所有记录

还有一些更为具体和使用的操作:

SELECT * FROM db_name.tbl_name;//在不进入数据库的情况下,直接查询显示数据表的信息
SELECT 字段名称,...  FROM tbl_name;//显示当前数据表下所有记录的指定字段名称信息
SELECT 字段名称 [AS] 自定义名称 , ...  FROM tbl_name;//在查询显示指定字段记录的基础上,为特定字段赋予新的名称
SELECT 字段名称, ... FROM  tbl_name [AS]  自定义数据表名; // 在查询显示指定字段记录的基础上,为当前数据表赋予新的名称,应用于多表环境下。
SELECT tbl_name.col_name, ... FROM tbl_name;//查询指定表下的指定字段的记录,应用于多表环境下。 

例如输入

SELECT id,username FROM mytest;

输出为:

id  username
7   Black
4   Jack
2   Jhon
1   king
6   Mary

输入:

SELECT id AS '编号', username AS '用户名' FROM mytest;

输出为:

编号  用户名
7   Black
4   Jack
2   Jhon
1   king
6   Mary

查询中的where比较运算符

输入如下:

SELECT id,username FROM mytest
WHERE id = 4;//查找id=4的记录,显示其id和usernae字段

输出

id  username
4   Jack
需要注意,如果where语句中检测的是是否为NULL,那么不能用WHERE col_name = NULL,而是使用WHERE col_name IS NULL

如果要查询的是一个区间内的记录,方法如下:

SELECT id,username,age FROM mytest
WHERE age BETWEEN 18 AND 30;//用BETWEEN...AND...的形式

输出如下:

id  username age
4   Jack    21
6   Mary    27
7   Black   29

如果要查询的是区间外的记录,方法类似:

SELECT id,username,age FROM mytest
WHERE age NOT BETWEEN 18 AND 30;//用NOT BETWEEN...AND...的形式

输出如下:

id  username    age
1   king    5
2   Jhon    14

还可以查询符合指定集合中元素的记录

SELECT id,username,age FROM mytest
WHERE id IN(1,2,3,5,7,9);//查询id在集合(1,2,3,5,7,9)中时的记录

输出如下:

id  username age
1   king    5
2   Jhon    14
7   Black   29

反之,查找不在集合中的记录输入如下:

SELECT id,username,age FROM mytest
WHERE id NOT IN(1,2,3,5,7,9);//查询id不在集合(1,2,3,5,7,9)中时的记录

输出:

id  username  age
4   Jack    21
6   Mary    27

限制集合也可以是字符串等其他数据类型。

逻辑与AND、逻辑或OR

OR和AND的计算优先级:AND > OR

SELECT id,username,age FROM mytest
WHERE id < 5 AND age >20;//查询id小于5且年龄大于20的记录

输出如下:

id  username age
4   Jack    21

以及

SELECT id,username,age FROM mytest
WHERE id < 3 OR age >27;//查询id小于3或年龄大于27的记录

输出:

id  username age
1   king    5
2   Jhon    14
7   Black   29

IN关键字

IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。 IN 取合法值的由逗号分隔的清单,全都括在圆括号中。例如:



此 SELECT 语句检索供应商 1002 和 1003 制造的所有产品。 IN 操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。

其实IN关键字的功能可以用OR来实现,例如上面的例子可以用如下代码实现:


为什么要使用 IN 操作符?
其优点具体如下:

  • 在使用长的合法选项清单时, IN 操作符的语法更清楚且更直观;
  • 在使用 IN 时,计算的次序更容易管理(因为使用的操作符更少);
  • IN 操作符一般比 OR 操作符清单执行更快;
  • IN 的最大优点是可以包含其他 SELECT 语句,使得能够更动态地建立 WHERE 子句。

NOT

WHERE 子句中的 NOT 操作符有且只有一个功能,那就是否定它之后所跟的任何条件。


列出除 1002和1003 之外的所有供应商制造的产品

模糊查询(LIKE + 通配符)

格式如下:

SELECT 字段名称,... FROM tbl_name
WHERE 字段名称 LIKE 模糊查询内容;

%表示任意长度的字符串
_表示任意一个字符

其中%和_就是通配符,通配符方便查找,但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。

关于通配符的一些使用技巧:

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

下面是模糊查询的例子:

SELECT id,username,age FROM mytest
WHERE username LIKE '%c%';//查询名称中含有c的记录(不区分大小写)

如果是%c,则是以c结尾的记录;如果是c%,则是以c为开头的记录。

得到输出:

id  username age
4   Jack    21
7   Black   29

或者

SELECT id,username,age FROM mytest
WHERE username LIKE '____';//查询名称长度为4的记录

输出:

id  username age
1   king    5
2   Jhon    14
4   Jack    21
6   Mary    27

注意,where的条件查找也可以用在delete的语句上。

你可能感兴趣的:(MySQL的数据操作1(INSERT、UPDATE、DELETE、SELECT、WHERE、模糊查询))