单表数据记录的插入
插入数据
- 在使用数据库之前,数据库表中必须有数据,我们需要使用INSERT语句向数据库表中插入数据
插入数据的方式
- 插入完整的记录
- 插入记录的一部分
- 插入多条记录
- 插入另一个查询的结果
为表的所有列插入数据
INSERT INTO table_name(column_list) VALUES (value_list);
- 其中列清单column_list可以省略不写,但在插入值时,要按照列清单column_list的顺序一样
为表的指定列插入数据
- 为表的指定列插入数据,就是在INSERT语句中只向部分列中插入值,而其他没有指定值得列所插入的数据为表定义时的默认值
同时插入多条记录
- INSERT 语句可以同时向数据表中插入多条记录,插入时指定多个值列表,每个值列表之间用逗号隔开,基本语法格式如下:
INSERT INTO table_name(column_list) VALUES (values_list1), (values_list2), …, (value_listn);
将查询结果插入到表中
- insert可以将select语句查询的结果插入到表中,语法如下:
INSERT INTO table_name1(column_list1) SELECT(column_list2) FROM table_name2 WHERE (condition);
设置自动编号
设置表的属性值自动增加,语法格式如下:
列名 数据类型 AUTO_INCREMENT
- 注:AUTO_INCREMENT约束的字段可以是任何整数类型(tinyint, smallint, int等)
举例:
CREATE TABLE bookcategory(
category_id int primary key auto_increment,
category varchar(20) not null unique,
parent_id int not null
);
- 自增列的初始值默认是1,每添加一条记录,自动增长1
- 在建表时可用“AUTO_INCREMENT=n” 选项来指定一个自增的初始值
指定一个自增长初始值
为已有的表添加自增列
CREATE TABLE bookcategory(
category_id int primary key,
category varchar(20) not null unique,
parent_id int not null
);
- alter table bookcatecategory modify category_id int auto_increment;
如果有外键链接,则需要删除链接再为表添加自增列,然后再恢复两表的外键关联
修改自增列的起始值
CREATE TABLE bookcategory(
category_id int primary key auto_increment,
category varchar(20) not null unique,
parent_id int not null
);
- alter table bookcategory auto_increment = n;
- 修改后auto_increment列起始值从n开始
去掉自增列
alter table bookcategory modify category_id int;
单表数据记录的更新
- MySQL中使用UPDATE语句更新表中的记录:
- 更新特定的行
- 更新所有的行
- 语法格式:
UPDATE table_name
SET column_name1 = value1,
column_name2 = value2, … ,
column_namen = valuen
WHERE (condition);
- 如果没有添加where条件,则更新所有行
单表记录的删除
- 使用delete语句删除满足条件的记录,语法格式如下:
DELETE FROM table_name [WHERE (condition)];
- 当添加where条件时,删除的是满足条件的记录,如果不添加where条件,删除的是所有的记录
- 如果想删除表中的所有记录,还可以使用TRUNCATE TABLE语句,TRUNCATE将直接删除原来的表,再重新创建一个表,因为truncate删除的是表而不是记录,所以要比delete快,其语法结构为:
TRUNCATE TABLE table_name;
单表数据记录的查询
基本查询语句
- MySQL从数据表中查询数据的基本语句为SELECT语句
- 语法结构:
SELECT select_expr [, select_expr … ] //可以一列也可以多列
[
FROM table_references //指定查询的数据表
[WHERE condition] //需要满足的条件
[GROUP BY {col_name | position} [ASC | DESC], … ] //对结果进行分组
[HAVING where_condition] //对分组结果过滤,相当于二次分组
[ORDER BY {col_name | expr | position} [ASC | DESC], … ] //对结果进行排序
[LIMIT {[offset,] row_count | row_count OFFSET offset}] //限定数据行的行数
]
查询所有列
- 在SELECT语句中使用星号“ * ”通配符查询所有列
- 如:SELECT * FROM bookinfo;
- 在SELECT语句中指定所有列
- 如:SELECT book_id, book_category_id FROM bookinfo;
查询指定列
- 查询单个列
- 如:SELECT book_id FROM bookinfo;
- 查询多个列
- 如:SELECT book_id, book_category_id FROM bookinfo;
查询指定记录
- 在SELECT 语句中通过WHERE字句,对数据进行过滤,语法格式为:
SELECT columnName1, columnName2, , , columnNamen
FROM tbName
WHRER selectCondition;
查询结果不重复
- 在SELECT 语句中可以使用DISTINCE关键字指示MySQL消除重复的记录值
SELECT DISTINCT columnName FROM tbName;
查询空值
- 在SELECT 语句中使用IS NULL子句,可以查询某列内容为空记录
- 如:SELECT * FROM readerinfo WHERE age IS NULL;
对查询结果进行分组
- 分组查询是对数据按照某个或多个列进行分组
[GROUP BY columnName] [HAVING <条件表达式>];
-
查询结果分组
-
GROUP BY columnName
-
GROUP BY通常和聚合函数一起使用,例如:MAX(), MIN(), SUM(), AVG(), COUNT()
-
例:
-
SELECT count(*) FROM readerinfo WHERE age= 20;
-
SELECT age, count(*) FROM readerinfo GROUP BY age;
-
使用HAVING过滤分组
[HAVING <条件表达式>]
HAVING 限定显示记录所需满足的条件,只有满足条件的分组才会被显示
- 例:SELECT age FROM readerinfo GROUP BY age HAVING count(age) > 2;
对查询结果排序
- MySQL中可以通过ORDER BY 子句对查询的结果进行排序
ORDER columnName [ASC | DESC]
- ASC : 升序
- DESC :降序
-
单列排序
-
按照指定的某个列进行排序,默认升序
-
例:SELECT * FROM readerinfo ORDER BY balance;
-
多列排序
-
按照多个列进行排序,默认升序
-
不指定升降序的情况下,多列排序是在单列排序中,对存在相同数值的区块再次排序
-
例:SELECT * FROM readerinfo ORDER BY balance, age;
-
指定排序方向
-
排序分为升序和降序,默认为升序
-
升序:ASC
-
降序:DESC
-
例:SELECT * FROM readerinfo ORDER BY balance ASC, age DESC;
用LIMIT限制查询结果的数量
- LIMIT关键字可以返回指定位置的记录
- 语法格式:LIMIT [位置偏移量, ] 行数
- 说明:第一条记录的位置偏移量为0,第二条为1,,,,以此类推
- 例:
- 显示读者信息表的钱3行记录
- SELECT * FROM readerinfo LIMIT 3;
- 显示从第三条记录开始后的2条读者信息记录
- SELECT * FORM readerinfo LIMIT 2, 2;