四、表记录操作

四、表记录操作

4.1、添加记录

INSERT 语句有两种语法形式,分别是 INSERT…VALUES 语句和 INSERT…SET 语句。

(1) INSERT…VALUES语句

INSERT [INTO] <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];
  1. 指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。

  2. INSERT 语句后面的列名称顺序可以不是 表定义时的顺序,即插入数据时,不需要按照表定义的顺序插入,只要保证值的顺序与列字段的顺序相同就可以。

  3. 使用 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 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值。
posted @ 2022-05-21 16:09  xiaohaoge  阅读(57)  评论(0编辑  收藏  举报