MySQL- CRUD-单表查询
一、INSERT 添加
公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]);
示例:
CREATE TABLE `goods` (
id INT ,
good_name VARCHAR(10),
price DOUBLE );
#添加数据
INSERT INTO goods (id,good_name,price ) VALUES (20,'华为手机', 2000);
·细节说明
1.插入的数据应与字段的数据类型相同。比如把‘abc'添加到int类型会错误
2.数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
3.在values中列出的数据位置必须与被加入的列的排列位置相对应。
4.字符和日期型数据应包含在单引号中。
5.列可以插入空值[前提是该字段允许为空],insert into table value(null)
6.insert into tab_name (列名..) values(),(),() 形式添加多条记录
INSERT INTO goods (id,good_name,price)VALUES (31,'三星手机',2000),(40,'小米手机',2000),(50,'vivo手机',2000);
7.如果是给表中的所有字段添加数据,可以不写前面的字段名称
INSERT INTO goods VALUES (30,'华为手机', 2000);
8.默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错
二、UPDATE 更新
UPDATE tbl name
SET col_namel=exprl [, col_name2=expr2 ..]
[WHERE where definition]
特别注意,一定要写where条件, 更新一时爽,交付火葬场! (强烈建议备份好数据)
#给101员工的工资增加1000
UPDATE employee SET salary = salary+1000 where id = 101;
三、DELETE 删除
特别注意,一定要写where条件, 更新一时爽,交付火葬场! (强烈建议备份好数据)
公式 delete from tbl_name
[WHERE where definition]
delete from tbl_name
[WHERE where definition]
1.如果不使用where子句,将删除表中所有数据。
2.Delete语句不能删除某一列的值(可使用update设为null或者")
3.使用delete语句仅删除记录,不删除表本身。如要删除表,使用droptable语句。drop table表名;
四、SELECT 添加
1、公式:
SELECT [DISTINCT] *|{columnl,column2.column3..} FROM tablename;
解释:DISTINCT 表示筛掉重复数据,
示例:
CREATE TABLE student (
id INT NOT NULL DEFAULT 1,
`name` varchar(20) not null default '',
chinese float not null default 0.0,
english float not null default 0.0,
math float not null default 0.0 );
insert into student values (1,'曹操',77,89,85);
insert into student values (2,'刘备',80,89,90);
insert into student values (3,'孙权',87,79,86);
insert into student values (4,'诸葛亮',88,89,90);
insert into student values (5,'郭嘉',82,89,85);
insert into student values (6,'周瑜',79,89,99);
insert into student values (7,'荀彧',79,90,80);
#查询所有学生成绩
select * from student;
#查询所有学生姓名及对应的英语成绩
select `name`, english from student;
#查询所有英语成绩并除去重复的值
select distinct english from student;
2、使用表达式对查询的列进行运算
SELECT *|{columnl |expression, column2 |expression,..}
FROM tablename;
3、别名
select colunm_name as 别名 from table_name;
#统计所有学生的总分
select name, (chinese+english+math) from student;
#给所有学生的总分加十分
select name, (chinese+english+math+10) from student;
#使用别名表示学生分数
select name, (chinese+english+math+10) AS TOTAL_SCORE from student;
4、where子句中,经常使用的运算符
#查询姓名为荀彧的学生成绩
select name, (chinese+english+math) from student where name = '荀彧';
#查询英语成绩大于等于90分的同学
select name, (chinese+english+math) from student where english >=90;
#查询总分大于200分的所有同学
select name, (chinese+english+math) from student where (chinese+english+math) >200;
#查询math大于60分且id>90的学生成绩
select name, (chinese+english+math) from student where math >60 and id <3;
#查询总分大于200分且数学成绩小于语文成绩的孙姓同学
select name, (chinese+english+math) from student where (chinese+english+math) >200 and math < chinese and `name` like '孙%';
#1、查询英语分数在80 - 90 之间的同学
select * from student where english between 80 and 90
#2查询数学分数为89,90,91的同学
select * from student where math in (89,90,91);
#3查询所有姓李的学生成绩
select * from student where `name` like '李%';
#4查询数学分>80,语文分>80的同学
select * from student where math>80 and chinese >80;
#1查询语文分数在70 - 80之间的同学
select * from student where chinese between 70 and 80;
#2查询总分为189,190,191的同学
select * from student where (chinese+english+math) in (189,190,191);
#3查询所有姓孙 或者 姓曹 的学生成绩
select * from student where `name` like '孙%' or `name` like '曹%';
#4查询数学比语文多30分的同学
select * from student where (math-chinese)>30;
5、使用order by子句排序查询结果。
公式: SELECT columnl,column2. column3..
FROM table
order by column asc|desc, ...;
1.Order by指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名。
2.Asc升序[默认]、Desc降序
3.ORDER BY子句应位于SELECT语句的结尾。
#对数学成绩排序后输出【升序】
select math from student order by math;
#对总分按从高到底的顺序输出
select (chinese+english+math) as total_score from student order by total_score;
#对姓刘的学生成绩(总分)排序输出(升序)
select (chinese+english+math) as total_score from student where `name` like '刘%' order by total_score;
五、查询增强
先建立三张表并添加测试数据
#新建一张部门表
create table dept (
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname varchar(20) not null default '',
loc varchar(13) not null default '');
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
#新建一张员工表
create table emp (
empno MEDIUMINT unsigned not null default 0,
ename varchar(20) not null default '', /* 名字*/
job varchar(9) not null default '',
mgr mediumint unsigned , /* 上级编号*/
hiredate date not null, /* 入职时间*/
sal decimal (7,2) not null , /* 薪水*/
comn decimal(7,2), /* 红利*/
deptno MEDIUMINT unsigned not null default 0); /* 部门编号*/
INSERT INTO emp VALUES (7369,'SMITH','CLERK', 7902, '1990-12-17', 800.00, NULL , 20);
INSERT INTO emp VALUES ( 7499,'ALLEN' , 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN', 7698,'1991-2-22', 1250.00, 500.00, 30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER', 7839,'1991-4-2', 2975.00, NULL, 20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839,'1991-5-1', 2850.00, NULL, 30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1997-4-19', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT' , NULL, '1991-11-17' , 5000.00, NULL,10);
INSERT INTO emp VALUES (7844,'TURNER', 'SALESMAN', 7698, '1991-9-8', 1500.00, NULL, 30);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK' , 7698, '1991-12-3', 950.00, NULL, 30);
INSERT INTO emp VALUES (7902,'FORD', 'ANALYST', 7566, '1991-12-3', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7934,'MILLER' , 'CLERK', 7782,'1992-1-23', 1300.00,NULL, 10) ;
SELECT * from emp;
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, -- 级别
losal DECIMAL(17,2) NOT NULL, -- 该级别最低工资
hisal DECIMAL(17,2) NOT NULL); -- 该级别最高工资
RENAME TABLE salgradegrade TO salgrade;
INSERT INTO salgrade VALUES(2, 1201, 1400);
INSERT INTO salgrade VALUES(3,1401, 2000);
INSERT INTO salgrade VALUES(4, 2001, 3000);
INSERT INTO salgrade VALUES(5,3001,9999);
INSERT INTO salgrade VALUES(1,700,1200);
使用where子句
?如何查找1992.1.后入职的员工
SELECT * from emp where hiredate>'1992-1-1';
如何使用like操作符
%:表示0到多个字符 _:表示单个字符
?如何显示首字符为S的员工姓名和工资
SELECT ename,sal FROM emp where ename like 'S%';
?如何显示第三个字符为大写O的所有员工的姓名和工资如何显示
SELECT ename,sal FROM emp where ename like '__O%';
没有上级的雇员的情况 (IS NULL,注意在java中用的是等号,mysql用的是is)
SELECT * from emp where mgr IS NULL;
查询表结构
DESC emp;
使用order by 子句
?如何按照工资的从低到高的顺序,显示雇员的信息(order by 子句默认是升序)
SELECT * from emp ORDER BY sal;
? 按照部门号升序而雇员的工资降序排列,显示雇员信息
SELECT * from emp ORDER BY deptno asc,sal desc;
六、分页查询
需求背景:
当我们有很多数据时,例如上万条数据, 需要展示到前端页面,那么我们一次性肯定展示不完,需要一页一页地展示。在客户端请求下一页时,服务器再查询下一页的数据并返回。
基本语法: select.….limit start,rows
表示从start+1行开始取,取出rows行,start 从0开始计算
示例:
数据表接上文。
-- 按雇员的id号升序取出,每页显示3条记录,请分别显示第1页,第2页,第3页
-- 按雇员的id号升序取出,每页显示3条记录,请分别显示第1页,第2页,第3页
select * from emp order by empno limit 0,3;
select * from emp order by empno limit 3,3;
select * from emp order by empno limit 6,3;
-- 推导公式
select * from emp
order by empno
limit 每页显示记录数* (第几页-1),每页显示记录数
七、分组增强
-- 显示每种岗位的雇员总数、平均工资。
select count(*),AVG(sal) from emp order by job ;
-- 显示雇员总数,以及获得补助的雇员数。
select count(*) , count(comn) from emp;
-- 扩展 统计没有获得补助的雇员数
select count(*) , count(IF(comn is null,1,null)) from emp;
select count(*) , count(*)-count(comn) from emp;
-- 显示管理者的总人数。
select count(mgr) from emp;
-- 显示雇员工资的最大差额。
select MAX(sal)-MIN(sal) from emp;
八、多子句查询
分组的总结
?如果select语句同时包含有group by,having,limit
order by那么他们的顺序是group by,having,orderby,limit
多子句顺序 (一定要按照这个顺序)
SELECT columnl, column2. column3.. FROM table
group by column
having condition
order by column
limit start, rows;
理解: mysql数据库在底层应该 最先要分组, 然后给各个分组排序,最后limit再取出页。having就不用说了,having是一定在group by 后的。