MySQL基本查询

表的增删改查

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)
一般都是这几个,前面学习中也用到了,现在我们来详细看看

create

数据库的创建和表的创建都要使用这个关键字
案例: 创建数据库: **create database '库名';**创建表:create table '表名'( ...);

insert 插入数据

比如先创建学生表:
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);建表时SQl中的关键字大小写都行
单行数据+全列插入
注意:下面写的所有SQL语句中带'[ ]'在写时可以省略
insert [into] student(表名) [(id,sn,name,qq)] values (100, 10000, '唐三藏', NULL);
多行数据+全列插入
insert [into] student(表名) [(id,sn,name,qq)] values (101, 10001, '曹操', NULL),('102',20000,'孙悟空',NULL),(),()...

只需要加个逗号然后再写数据, 但是不是如果不是全列插入而是指定列插入的话就要注意插入的数据对上相应的字段,指定列的意思是:[(id,sn,name,qq)],可以是(sn,name,qq)或者你想插入哪个都行,所以要注意插入的数据对应相应的字段

replace 替换

就是在插入数据的时候把insert 变为replace就行,后面跟insert插入数据一样的写法,但是在插入的数据中如果是主键或唯一键的数据与原表的数据有冲突,那就会删掉有冲突的数据再插入进去
比如:(接着插入上面的学生表) replace [into] student values (101,'10003','猪八戒',NULL);,插入的话因为id是主键,想插入的数据中id=101与原表的曹操的id冲突,那就会先删除曹操的那一列数据再插入这个数据·

Retrieve

select语句
比如我们先创建表插入数据再做查询:
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
全列查询
-- 通常情况下不建议使用 * 进行全列查询 -- 1. 查询的列越多,意味着需要传输的数据量越大; -- 2. 可能会影响到索引的使用
select * from exam_result; '*'加了这个就是查询表全列的数据
指定列查询
比如这张表你只想看id和姓名的话: select id,name from exam_result;
查询为表达式
就是你可以查询的数据可以加减乘除,比如: select id,name,english+10 from exam_result; 它不会改变你原表中的数据只是在你写了当前语句后向你展示,比如查询结果为:

你再查询原表时还是原来数据,因为你只是表达式而不是等式

为查询的结果起别名

select id [as] '别名名称' from exam_result

为查询的结果去重

select distinct math from exam_result; 如果有相同的数学成绩它只会保留一个
where条件语句
它的作用跟编程语言的if的效果差不多,在查询数据加where之后就会是以后面的条件筛选数据展示出来

常用的运算符:


举个样例:select * from exam_result where math>80; 这样就会显示数学成绩大于80的数据,后面的运算符用法差不多,自己可以试试

结果排序:

用法为: order by '列名' (降序(desc),升序(asc));,结果会按照你指定的列名的大小来排序,如果会升序,就是从小到大排,降序就是从大到小,默认为升序,所以如果须要升序排序的话可以省略asc
比如查询数学成绩并按数学成绩排降序: select math from exam_result order by math desc

筛选分页结果:

关键字为 limit ,limit 0,1 这个的意思为从第一列开始,查询一列,前面那个数字表示从第几列开始可以说是按下标来计算的 ,后面的那个数字表示你要查询几条数据,如果你默认从第一列开始可以省略那个0,limit 1

update

语法:UPDATE table_name SET column = expr [, column = expr ...]

WHERE ...\] \[ORDER BY ...\] \[LIMIT ...

用法说明:就是你可以更新某一列值,比如把孙悟空的数学成绩改为80,update exam_result set math = 80 where name='孙悟空'

delete

删除表: delete from '表名' 删除孙悟空的考试成绩: delete from exam__result where name='孙悟空'

聚合函数

就是在做查询时我们可以使用这些函数方便我们查询时方便统计,比如查询数学成绩的总分 select math, sum(math) from exam_result ;

group by的使用

在select中使用group by 子句可以对指定列进行分组查询
案例:准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)
EMP员工表
DEPT部门表
SALGRADE工资等级表
先展示最重要的员工表emp

group by的用法就是你要以哪个列名进行对这个表进行分组,相当于把一个表分为多个表,比如我执行: select deptno from group by deptno ,它就能把deptno中的数据相同的分为一组,也可以说是以deptno为准分为了多个子表,并且这些子表也能再分子表的子表
也可以搭配聚合函数一起使用,相当于先分组在进行聚合统计, 比如: 查询每个部门的平均工资: select deptno,avg(sal)from group by deptno

having和where的使用区别

having跟where应用是条件语句,可以当作筛选条件,但是它们的执行顺序不同

这里先我们可以先总结表不是存在磁盘上的表才是表,我们做的所有SQL语句得到的查询结果均是表

一般having会与group by 一起使用,比如查询平均工资低于2000的部门和它的平均工资: select deptno avg(sal) as myavg from emp group by deptno having ,myavg<2000; 这个having的执行顺序是等表做完一系列SQl语句时才执行它,也就是说等把每个部门的平均工资作为表之后再以having的条件筛选出最后的结果表, 而where是在表生成之前就要执行的条件筛选

所以要看情况使用having和where或结合在一起使用
下面是创建雇员信息表的代码,你可以复制过去,创建之后你可以敲一敲这些语句自己感受一下

CREATE database IF NOT EXISTS scott DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE scott;

DROP TABLE IF EXISTS dept;

CREATE TABLE dept (
deptno int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
dname varchar(14) DEFAULT NULL COMMENT '部门名称',
loc varchar(13) DEFAULT NULL COMMENT '部门所在地点'

);

DROP TABLE IF EXISTS emp;

CREATE TABLE emp (
empno int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
ename varchar(10) DEFAULT NULL COMMENT '雇员姓名',
job varchar(9) DEFAULT NULL COMMENT '雇员职位',
mgr int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
hiredate datetime DEFAULT NULL COMMENT '雇佣时间',
sal decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
comm decimal(7,2) DEFAULT NULL COMMENT '奖金',
deptno int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'

);

DROP TABLE IF EXISTS salgrade;

CREATE TABLE salgrade (
grade int(11) DEFAULT NULL COMMENT '等级',
losal int(11) DEFAULT NULL COMMENT '此等级最低工资',
hisal int(11) DEFAULT NULL COMMENT '此等级最高工资'

);

insert into dept (deptno, dname, loc)

values (10, 'ACCOUNTING', 'NEW YORK');

insert into dept (deptno, dname, loc)

values (20, 'RESEARCH', 'DALLAS');

insert into dept (deptno, dname, loc)

values (30, 'SALES', 'CHICAGO');

insert into dept (deptno, dname, loc)

values (40, 'OPERATIONS', 'BOSTON');

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

insert into salgrade (grade, losal, hisal) values (1, 700, 1200);

insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);

insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);

insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);

insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

相关推荐
Agent手记5 小时前
安全生产巡检全流程自动化与隐患预警方案:2026工业Agent落地实战指南
数据库·人工智能·安全·ai·自动化
whn19775 小时前
查询日期报错,参数DATETIME_FMT_MODE
数据库·sql
Gauss松鼠会5 小时前
GaussDB(DWS) GUC参数修改、查看
java·数据库·sql·数据库开发·gaussdb
米高梅狮子6 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
滴滴答答哒6 小时前
.NET Core 基于 AOP + Polly 实现数据库死锁自动重试
数据库·.netcore·sqlsugar
yuzhiboyouye6 小时前
所有的 SQL 都要经过 Explain 优化,是什么意思
数据库·sql
洛水水6 小时前
Redis 实现限流功能的几种方法
数据库·redis·缓存
l1t6 小时前
DeepSeek总结的postgresql 数据分析师 vs width_bucket()
数据库·postgresql
米高梅狮子6 小时前
Redis
数据库·redis·mysql·缓存·docker·容器·github