四、表记录操作
四、表记录操作
4.1、添加记录
INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句。
(1) INSERT…VALUES语句
INSERT [INTO] <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];
指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
INSERT 语句后面的列名称顺序可以不是 表定义时的顺序,即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。
使用 INSERT…VALUES 语句可以向表中插入一行数据,也可以插入多行数据;
案例:
INSERT employee (name,gender,birthday,salary,department) VALUES ("",1,"1985-12-12",8000,"教学部"), ("summer",1,"1987-08-08",5000,"保安部"), ("junue",1,"1990-06-06",20000,"销售部");
(2) INSERT…SET语句
INSERT INTO <表名> SET <列名1> = <值1>, <列名2> = <值2>, …
此语句用于直接给表中的某些列指定对应的列值,即要插入的数据的列名在 SET 子句中指定。对于未指定的列,列值会指定为该列的默认值。
4.2、查询记录
标准语法:
-- 查询语法: SELECT *|field1,filed2 ... FROM tab_name WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 -- Mysql在执行sql语句时的执行顺序: -- from where select group by having order by
准备数据:
CREATE TABLE emp( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), gender ENUM("male","female","other"), age TINYINT, dep VARCHAR(20), city VARCHAR(20), salary DOUBLE(7,2) )character set=utf8; INSERT INTO emp (name,gender,age,dep,city,salary) VALUES ("hao","male",24,"教学部","河北省",8000), ("xiao","male",34,"销售部","山东省",8000), ("ge","male",28,"销售部","山东省",10000), ("summer","female",22,"教学部","北京",9000), ("lisi", "male",24,"教学部","河北省",6000), ("root", "male",32,"运营部","北京",12000), ("zhangsan", "male",38,"运营部","河北省",7000), ("Echo", "male",19,"运营部","河北省",9000), ("yibai", "female",24,"销售部","北京",9000);
4.2.1、查询字段(select)
mysql> SELECT * FROM emp; +----+--------+--------+------+--------+--------+----------+ | id | name | gender | age | dep | city | salary | +----+--------+--------+------+--------+--------+----------+ | 1 | hao | male | 24 | 教学部 | 河北省 | 8000.00 | | 2 | xiao | male | 34 | 销售部 | 山东省 | 8000.00 | | 3 | ge | male | 28 | 销售部 | 山东省 | 10000.00 | | 4 | summer | female | 22 | 教学部 | 北京 | 9000.00 | | 5 | lisi | male | 24 | 教学部 | 河北省 | 6000.00 | | 6 | root | male | 32 | 运营部 | 北京 | 12000.00 | | 7 | zhangsan | male | 38 | 运营部 | 河北省 | 7000.00 | | 8 | Echo | male | 19 | 运营部 | 河北省 | 9000.00 | | 9 | yibai | female | 24 | 销售部 | 北京 | 9000.00 | +----+--------+--------+------+--------+--------+----------+ mysql> SELECT name,dep,salary FROM emp; +--------+--------+----------+ | name | dep | salary | +--------+--------+----------+ | hao | 教学部 | 8000.00 | | xiao | 销售部 | 8000.00 | | ge | 销售部 | 10000.00 | | summer | 教学部 | 9000.00 | | lisi | 教学部 | 6000.00 | | root | 运营部 | 12000.00 | | zhangsan | 运营部 | 7000.00 | | Echo | 运营部 | 9000.00 | | yibai | 销售部 | 9000.00 | +--------+--------+----------+
4.2.2、where语句
-- where字句中可以使用: -- 比较运算符: > < >= <= <> != between 80 and 100 值在10到20之间 in(80,90,100) 值是10或20或30 like 'hao%' /* pattern可以是%或者_, 如果是%则表示任意多字符,此例如唐僧,唐国强 如果是_则表示一个字符唐_,只有唐僧符合。两个_则表示两个字符:__ */ -- 逻辑运算符 在多个条件直接可以使用逻辑运算符 and or not -- 正则 SELECT * FROM emp WHERE emp_name REGEXP '^yu'; SELECT * FROM emp WHERE name REGEXP 'n$';
练习:
-- 查询年纪大于24的员工 SELECT * FROM emp WHERE age>24; -- 查询教学部的男老师信息 SELECT * FROM emp WHERE dep="教学部" AND gender="male";
4.2.3、order:排序
按指定的列进行,排序的列即可是表中的列名,也可以是select语句后指定的别名。
-- 语法: select *|field1,field2... from tab_name order by field [Asc|Desc] -- Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。
练习:
-- 按年龄从高到低进行排序 SELECT * FROM emp ORDER BY age DESC ; -- 按工资从低到高进行排序 SELECT * FROM emp ORDER BY salary; -- 先按工资排序,工资相同的按年龄排序 SELECT * FROM emp ORDER BY salary,age;
4.2.4、group by:分组查询
GROUP BY 语句根据某个列对结果集进行分组。分组一般配合着聚合函数完成查询。
常用聚合(统计)函数
max()
:最大值。min()
:最小值。avg()
:平均值。sum()
:总和。count()
:个数。
在MySQL的SQL执行逻辑中,where条件必须放在group by前面!也就是先通过where条件将结果查询出来,再交给group by去分组,完事之后进行统计,统计之后的查询用having。
练习:
-- 查询男女员工各有多少人 SELECT gender 性别,count(*) 人数 FROM emp GROUP BY gender; -- 查询各个部门的人数 SELECT dep 部门,count(*) 人数 FROM emp GROUP BY dep; -- 查询每个部门最大的年龄 SELECT dep 部门,max(age) 最大年纪 FROM emp GROUP BY dep; -- 查询每个部门年龄最大的员工姓名 SELECT * FROM emp5 WHERE age in (SELECT max(age) FROM emp5 GROUP BY dep); -- 查询每个部门的平均工资 SELECT dep 部门,avg(salary) 最大年纪 FROM emp GROUP BY dep; -- 查询教学部的员工最高工资: SELECT dep,max(salary) FROM emp11 GROUP BY dep HAVING dep="教学部"; -- 查询平均薪水超过8000的部门 SELECT dep,AVG(salary) FROM emp GROUP BY dep HAVING avg(salary)>8000; -- 查询每个组的员工姓名 SELECT dep,group_concat(name) FROM emp GROUP BY dep; -- 查询公司一共有多少员工(可以将所有记录看成一个组) SELECT COUNT(*) 员工总人数 FROM emp;
4.2.5、limit:记录条数限制
SELECT * from emp limit 1; SELECT * from emp limit 2,5; -- 跳过前两条显示接下来的五条纪录 SELECT * from emp limit 2,2;
4.2.6、distinct:查询去重
SELECT distinct salary from emp order by salary;
4.3、更新记录
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ]
4.4、删除记录
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
<表名>
:指定要删除数据的表名。ORDER BY
子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。WHERE
子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。LIMIT
子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。