Create、Read、Update、Delete
3.1 插入数据-insert into(插入行)
insert into 表名 (可以省略)values (不可省略的内容)
mysql> insert into teacher (id, name, phone, address) values(1,'Frank', '188888888', 'ShangHai');
Query OK, 1 row affected (0.00 sec)
注意细节:
1.插入的数据应与字段的数据类型相同
2. 数据的长度应在列的规定范围内
3. 在 values 中列出的数据位置必须与被加入的列的排列位置相对应
4. 字符和日期型数据应包含在单引号中
5. 列可以插入空值[前提是该字段允许为空]
6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
8. 默认值default的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
-- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给 null
-- 如果我们希望指定某个列的默认值,可以在创建表时指定
-
数据的自动添加:NULL
mysql> insert into teacher values(NUll,'Tom',NULL,NULL);
Query OK, 1 row affected (0.00 sec)
mysql> select * from teacher;
+----+-------+-----------+----------+
| id | name | phone | address |
+----+-------+-----------+----------+
| 1 | Frank | 188888888 | ShangHai |
| 2 | Tom | NULL | NULL |
+----+-------+-----------+----------+
-
default的使用
mysql> insert into teacher values(NULL, 'Jerry',Null, default);
Query OK, 1 row affected (0.00 sec)
mysql> select * from teacher;
+----+-------+-----------+----------+
| id | name | phone | address |
+----+-------+-----------+----------+
| 1 | Frank | 188888888 | ShangHai |
| 2 | Tom | 100000000 | Nanjing |
| 3 | Jerry | NULL | 暂时未知 |
+----+-------+-----------+----------+
3 rows in set (0.00 sec)
-
插入数据可以省略自增的字段值
mysql> insert into teacher (name, phone, address)values('Jerry',Null, default);
Query OK, 1 row affected (0.00 sec)
mysql> select * from teacher;
+----+-------+-----------+----------+
| id | name | phone | address |
+----+-------+-----------+----------+
| 1 | Frank | 188888888 | ShangHai |
| 2 | Tom | 100000000 | Nanjing |
| 3 | Jerry | NULL | 暂时未知 |
+----+-------+-----------+----------+
3 rows in set (0.00 sec)
-
一次性插入多条数据:逗号分隔
mysql> insert into teacher values(NULL, 'TOM_1', NULL, default),(NULL, 'Jerry_1', NULL, default);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from teacher;
+----+---------+-----------+----------+
| id | name | phone | address |
+----+---------+-----------+----------+
| 1 | Frank | 188888888 | ShangHai |
| 2 | Tom | 100000000 | Nanjing |
| 3 | Jerry | NULL | 暂时未知 |
| 4 | TOM_1 | NULL | 暂时未知 |
| 5 | Jerry_1 | NULL | 暂时未知 |
+----+---------+-----------+----------+
5 rows in set (0.00 sec)
3.2 删除数据-delete from、truncate、drop(删行)
delete from 表名 where 选定的字段名称=你要删除的字段相应信息;
mysql> delete from teacher where id = 9;
// 条件删除
mysql> delete from teacher where id > 4;
// 删除表
mysql> drop table 表名; // 完全删除,表不存在
mysql> delete from 表名; // 数据删除(即删除所有记录),表结构存在
// 清空表
mysql> truncate table 表名; // 数据删除,表结构存在
1.drop:删除内容和定义,释放空间,表的结构也删除了,即删除整个表;
delete:删除内容、释放空间但不删除定义,但一行一行删除,效率低;
truncate:删除内容、释放空间但不删除定义,类似销毁表后,在克隆一个完全一样的新的空表,速度快。
2. 对于自增的字段,delete表后再添加数据,id在原基础上增加,但truncate从1开始。
3. delete不能删除某一列的值,可使用Update设为null或""
4. 整列删除(包括字段):alter table 表名 drop 字段;
3.3 更新数据-update
update 表名 set 要修改的字段名=要修改成的数据 where 定位字段名=相应数据;
mysql> update teacher set name='Frank' where id=3;
注意细节:
-
更改多个数据用逗号分隔:
update 表名 set 要修改的字段名=要修改成的数据,要修改的字段名=要修改成的数据,··· where 定位字段名=相应数据
mysql> update teacher set name='Frank',phone=123456,address='ShangHai' where id = 3;
-
条件更新:
updata 表名 set 要修改的字段名=要修改成的数据 where 定位字段名=相应数据 or 定位字段名=相应数据
mysql> update teacher set name='Frank' where id=1 or id=2;
-
全部更新:没有where
mysql> update teacher set name='Tom'; // 会让所有数据的name为tom
3.4 查询数据-select(查的是列)
select 要查询的字段名 from 表名;
SELECT DISTINCT 要查询的字段名 FROM 表名; # DISTINCT可选,即是否对查询结果去重
mysql> select phone from teacher;
+--------+
| phone |
+--------+
| NULL |
| NULL |
| 123456 |
+--------+
3 rows in set (0.00 sec)
-
多个字段查询:
select 要查询的字段名,要查询的字段名··· from 表名
mysql> select name ,phone from teacher;
+------+--------+
| name | phone |
+------+--------+
| Tom | NULL |
| Tom | NULL |
| Tom | 123456 |
+------+--------+
3 rows in set (0.00 sec)
-
全部查询:*
select * from 表名
mysql> select * from teacher;
+----+------+--------+----------+
| id | name | phone | address |
+----+------+--------+----------+
| 1 | Tom | NULL | 暂时未知 |
| 2 | Tom | NULL | 暂时未知 |
| 3 | Tom | 123456 | ShangHai |
+----+------+--------+----------+
3 rows in set (0.00 sec)
-
使用表达式对查询的列进行运算
# 统计每个学生的总分
SELECT `name`, (chinese+english+math) FROM student;
-
使用 as 取别名
SELECT `name` AS '名字', (chinese + english + math) AS total_score
FROM student;
-
order by 排序查询结果
排序列,放在末尾
Asc:升序,默认
Desc:降序
-
分组查询group by :对列进行分组查询,having 对分组后的结果进行过滤
GROUP by 用于对查询的结果分组统计, having 子句用于限制分组显示结果。
# 显示每个部门的平均工资和最高工资
SELECT AVG(sal), MAX(sal) , deptno FROM emp GROUP BY deptno;
# 显示平均工资低于 2000 的部门号和它的平均工资
SELECT AVG(sal), deptno FROM emp GROUP BY deptno HAVING AVG(sal) < 2000;
-
分页查询LIMIT
综合练习:
-- 请统计各个部门 group by 的平均工资 avg,
-- 并且是大于 1000 的 having,并且按照平均工资从高到低排序, order by
-- 取出前两行记录 limit 0, 2
SELECT deptno, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
HAVING avg_sal > 1000
ORDER BY avg_sal DESC
LIMIT 0,2;
3.5 where 子句
常用运算符:
LIKE:%表示0到多个字符,_表示单个字符
# 查询英语分数在 80-90 之间的同学,betweenand是闭区间
SELECT * FROM student WHERE english BETWEEN 80 AND 90;
# 查询数学分数为 89,90,91 的同学
SELECT * FROM student WHERE math IN (89, 90, 91);
# 查询所有姓李的学生成绩(模糊查询)
SELECT * FROM student WHERE `name` LIKE '李%';
# 查询总分大于 200 分 并且 数学成绩小于语文成绩,的姓赵的学生
SELECT * FROM student
WHERE (chinese + english + math) > 200 AND math < chinese AND `name` LIKE '赵%;
参考:http://t.csdnimg.cn/wdHJs 、韩顺平