MySQL基础语句二(单表查询)

1、插入数据:

insert into table_name(field1, field2,...fieldn) values (value1,value2,...valuen)

注意:
  • field中的数量和values中数量一致
  • 对应的类型需要对应上
  • 时间用字符串格式
插入多条记录:

insert into table_name(field1, field2,...fieldn) values (value1,value2,...valuen), (value1,value2,...valuen),...... (value1,value2,...valuen);

2、更新数据:

update table_name set filed1=value1, field2=value2 where condition

更新多条数据:

update table_name set field2=value2;

3、删除数据:

delete from table_name where condition

删除所有数据:

delete from table_name;

4、查询数据——单表:

4.1 简单记录查询:

select field1, field2, ...fieldn from table_name;

4.2 查询所有数据信息:

select * from table_name;
避免重复数据查询 - distinct

数学四则运算数据查询:

加(+) 减(-) 乘(*) 除(/) 取余(%)

格式化显示:concat

mysql提供concat()来连接字符串,从而实现数据显示的格式化
例如:select concat(name, "的年薪为:", sal*12) "薪资" from employee;
结果:smith的年薪为:9600.00

4.3 条件记录查询:

condition语句用来控制条件
带关系运算符和逻辑运算符的条件查询:

  • mysql支持的比较运算符:
    大于(>),小于(<),等于(=),不等于(!=),大于等于(>=),小于等于(<=)
  • mysql支持的逻辑运算符:
    AND(&&)逻辑与,OR(||)逻辑或,XOR逻辑异或,NOT(!)逻辑非

带 between and 关键字的条件查询语句
1、按照范围查询:
查询工资范围在1000 - 2000的员工
select name, sal from employee where sal between 1000 and 2000;
换种写法
select name, sal from employee where sal>=1000 and sal<=2000;
2、非范围筛选:
查询工资小于1000 和大于2000的员工
select name, sal from employee where sal not between 1000 and 2000;
select name, sal from employee where sal < 1000 or sal>2000;
带 is null 的条件查询:
is null 用来判断字段的数值是否为空,null 值和空字符串 不是一回事:null代码没有设置值, 空字符串代表了设置了值。只是值是一个空字符串而已。
查询有奖金的员工
select name, comm from employee where comm is not null;
带 in 关键字的条件查询:
in 关键字用来判断字段的数值是否在指定的集合中
查询所有的销售人员和文员
select name, job from employee where job in ("salesman", "clerk");
带 like 的关键字查询:
用来判断字符串中是否包含指定的字符串
like语句支持的通配符:

  1. "_"表示匹配单个字符
  2. "%"表示可以匹配任意长度的字符串,既可以是0个也可以是1个,也可以是多个
    ①查询以A开头的员工
    select name from employee WHERE name LIKE "A%";
    ②查看包含a的员工
    select name from employee WHERE name like "%A%";
    ③查询以n结尾的员工
    select name from employee WHERE name like "%n";
    ④查询第二个字符为m的员工
    select name from employee WHERE name like "_m%";
    ⑥查询不包含m的员工
    select name from employee WHERE name not like "%m%";
    select name from employee WHERE not name like "%m%";
4.4 排序记录查询:

mysql提供了order by来设置查询结果的顺序
select * from table_name where condition order by field1 [asc|desc], field2 [asc|desc]
asc:升序
desc:降序
默认是升序
可以根据单个field排序,也可以根据多个field进行排序。

4.5 限制记录查询:

通过 limit 来限制数量。
select field1,field2...fieldn from table_name where condition limit offset_start, row_count;
offset_start 表示起始偏移量
row_count表示行数
这个在数据分页中很常见
如果limit数量大于结果不会出错

查询comm为null的记录。只显示前两条数据
select * from employee where comm is null limit 2;
显示第二个的两条数据,查询第二页
select * from employee where comm is null limit 2, 2;

4.6 统计函数:
  • count():该统计函数实现统计表中记录的条数
  • avg(): 计算字段的平均值
  • sum(): 计算字段的总和
  • max(): 字段值的最大值
  • min(): 字段的最小值
    ①count
    count(*):统计所有的记录。不管是null值还是非null值
    count(field): 可以对指定字段进行统计,统计时候将忽略null值
    ②avg
    avg会忽视字段为null的记录
    ③sum
    也会忽略为null的记录
注意:如果没有记录, count返回时0, 其他函数返回的是null
4.7 分组记录查询(group by)

select function() from table_name where condition group by field;

注意:

①如果我们分组的字段没有重复值,那么就会退化成全查; 反而性能低,
所以没有必要对没有重复的列进行分组。
②一般情况下分组关键字和统计函数一起使用。
group_concat 显示每个分组中的字段,显示每个分组中的指定字段值
④mysql中使用group by时, 其子句可以是一个字段外,还可以是多个字段,既可以按照多个字段进行分组。

5、having 子句:

  • 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。HAVING 子句可以让我们筛选分组后的各组数据。
  • having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
  • 有些时候having和where一样:
  1. where和having一样的场景
    SELECT name, sal from employee WHERE sal>2000;
    SELECT name, sal from employee HAVING sal>2000;
  2. 能用where,不能用having的场景
    sal,在这种情况下和where的效果是等效的,但是如果我没有select addtime就会报错!!因为
    having是从前面筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。
    SELECT name from employee WHERE sal>2000;
    SELECT name from employee HAVING sal>2000; #错误(因为前面查询中没有sal)
  3. 只能用having,不能用where的情况
    查询平均工资大于2000的部门
    SELECT name, deptno, AVG(sal) as ag from employee GROUP BY deptno HAVING ag>2000;
    where 后面要跟的是数据表里的存在的字段,如果我把ag换成avg(sal)也是错误的!因为表里没有该字段。
    SELECT name, deptno, AVG(sal) as ag from employee GROUP BY deptno WHERE ag>2000 ;#错误
    而having只是根据前面查询出来的是什么就可以后面接什么(比如一些聚合函数这样的“伪字段”)。
    select deptno, avg(sal) average from employee group by deptno;
    select deptno, avg(sal) average, group_concat(name) names, count(name) number from employee group by deptno having avg(sal)>2000;
having和where的区别:

区别一:
where 是数据从磁盘读入内存时候一条一条判断的。
having 是将所有数据读入内存,在分组统计前,根据having的条件再将不符合条件的数据删除。
区别二:
having 子句可以使用字段别名,where不可以用。
区别三:
having可以使用统计函数,where不可用。
having筛选必须是根据前面select字段的值进行筛选。

总结:

where是在列出现之前查询,having是在列出现以后再筛选。
where只能在 group by 前面,顺序不能改变。
group by是分组依据,想获得where条件选择的 只能使用having语句。
having语句不能单独出现前面必须要有group by。

发布了49 篇原创文章 · 获赞 76 · 访问量 2713

猜你喜欢

转载自blog.csdn.net/qq_39783601/article/details/104527281