为数据表增加记录(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 操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
模糊查询(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