创建库、表
创建学生信息库:
mysql> create database students;
创建学生信息表:
mysql> use students;
mysql> create table if not exists students(
-> id int unsigned primary key auto_increment comment '用户的主键',
-> sn int not null unique comment '学生的学号',
-> name varchar(20) not null,
-> qq varchar(20) unique
-> );
查看结果:
mysql> desc students;
插入数据
单行数据 + 全列插入:
mysql> insert into students values(100,10000,'蔡徐坤',NULL);
mysql> insert into students values(101,10001,'陈立农',NULL);
多行数据 + 指定列插入:
mysql> insert into students (id,sn,name) values
-> (102,20001,'范丞丞'),
-> (103,20002,'黄明昊'),
-> (104,20003,'林彦俊'),
-> (105,20004,'朱正廷');
查看插入结果:
mysql> select * from students;
修改(update)
update用于对查询到的结果进行列值更新
目前的qq是NULL,可以修改:
mysql> update students set qq = '11111' where name = '蔡徐坤';
mysql> update students set qq = '22222' where name = '陈立农';
mysql> update students set qq = '33333' where name = '范丞丞';
查看结果:
上述直接修改,接下来也可以在插入时检测自动更新
再次插入,检测到数据冲突自动更新(id冲突):
mysql> insert into students (id,sn,name,qq) values (100,10000,'蔡徐坤',11111) on duplicate key update qq='11112';
结果:冲突代表一次affected,修改代表第二次affected:
Query OK, 2 rows affected (0.00 sec)
这种方法常用于不确定该条目是否存在,但是你又想去修改它的数据。作用其实相当于replace
replace的功能是如果没检测到冲突,就直接插入,如果有冲突,就将该行全部删掉,再重新插入。
查找
SQL查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select
distinct > order by > limit
select
一般不使用全部搜索,因为数据可能会过于庞大:
mysql> select * from students;
- 通常使用指定列搜索:
mysql> select id,sn,name from students;
也可以调整顺序:
mysql> select id,name,sn from students;
- 搜索自定义字段,但必须是一个可计算表达式:
mysql> select id,sn+10 from students;
mysql> select id,sn+id from students;
- 给自定义列起别名
mysql> select id,sn+id id加学号 from students;
- 去重
mysql> select distinct xxx from students;
where
- 比较运算符
LIKE:模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
- 逻辑运算符
- AND----多个条件必须都为 TRUE(1),结果才是 TRUE(1)
- OR----任意一个条件为 TRUE(1), 结果为 TRUE(1)
- NOT----条件为 TRUE(1),结果为 FALSE(0)
where条件是最先查找的,所以别名不可用于where条件中,因为此时的别名还未生成。
因此where条件中必须是表达式
查找id小于103的字段:
mysql> select id,sn from students where id<103;
id = 10x的字段:
mysql> select id from students where id like '10%';
也可以使用’_'来严格匹配某个字段
多表查询
实际开发中往往数据来自不同的表,所以需要多表查询。多表查询其实也和单表查询一样,不过是在组合出来的新的表里进行单表查询。
多表查询顾名思义就是需要多张表来共同完成。
- 例如某公司的管理系统中,要求显示雇员名,雇员工资及所在部门的名字。雇员名和雇员工资在EMP表中,而部门名字在DEPT中。
所以我们可以先联表查询:
select * from EMP,DEPT;
这样筛选出来是未匹配好的全部数据,也就是将两个表直接拼接而成,所以我们应该加上条件筛选:
select ename, sal, dname from EMP, DEPT where EMP.deptno = DEPT.deptno;
- 显示部门号为10的部门名,员工名和工资
select ename, sal,dname from EMP, DEPT where EMP.deptno = DEPT.deptno and DEPT.deptno = 10;
- 显示各个员工的姓名,工资,及工资级别(在salgrade表中)
select ename, sal, grade from EMP, salgrade where sal between losal and hisal;
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询
- 显示SMITH同一部门的员工
为什么叫单行子查询呢,因为筛选的条件只有一行一列。对于本例首先要找smith的部门:
select deptno from EMP where ename='smith';
此时得到的结果就只有一列,后续再进行筛选,所以是单行子查询。
再筛选:
select * from EMP WHERE deptno = (select deptno from EMP where ename='smith');
多行子查询
上面说了单行子查询是因为第一次筛选出来的条件只有一行一列,那么多行子查询就是有多行单列
- 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
由于10号部门的岗位不止一个,所以可能会有多个相同的岗位,那么就会产生多行子查询。
首先是查询10号部门的岗位:
select distinct job from emp where deptno=10;
这里会产生多条单列的不同岗位的信息,所以后续筛选就叫做多行子查询。
再筛选,凡是符合初筛出来的条件的,再筛选一遍:
- in关键字
select ename,job,sal,deptno from emp where job in (select distinct job from emp where deptno=10) and deptno!=10;
- all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename, sal, deptno from EMP where sal > all(select sal from EMP where deptno=30);
为什么不能像下面这样写呢?因为初筛的结果是多条,所以要满足大于所有部门=30的员工的工资这一条件:
select ename, sal, deptno from EMP where sal > (select sal from EMP where deptno=30);
当然这里也可以用max函数来筛选。
- any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
这个关键字只需要满足初筛后的一个条件即可返回
select ename, sal, deptno from EMP where sal > any(select sal from EMP where deptno=30);
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
- 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
首先筛选smith的部门和岗位:
select deptno, job from EMP where ename='SMITH'
此时产生单行多列的结果,再次筛选:
select ename from EMP where (deptno, job)=(select deptno, job from EMP where ename='SMITH') and ename != 'SMITH';
自连接
自连接是指在同一张表连接查询,相当于自己的表和自己的表做笛卡尔积
显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno)文章来源:https://www.toymoban.com/news/detail-433470.html
- 可以使用子查询
select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');
- 自连接
由于此时的员工和领导都在员工表里,所以可以将emp表重命名两份文章来源地址https://www.toymoban.com/news/detail-433470.html
select leader.empno,leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename='FORD';
到了这里,关于MySQL基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!