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的语句上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容