##数据库

  • 学习如何对数据进行增删改查操作

SQL

  • Structured Query Language 结构化查询语言, 此语言是用于程序员和数据库软件进行交流的语言

insert into user values("刘德华",50);

DBMS

  • DataBaseManagementSystem: 数据库管理系统(俗称数据库软件)
  • 常见的数据库管理系统(DBMS)
  • MySQL: Oracle公司产品, MySQL08年被Sun公司收购, Sun公司09年被Oracle收购. 开源产品 市占率第一
  • Oracle: Oracle公司产品, 闭源产品, 性能最强 价格最贵 市占率第二
  • SQLServer: 微软公司产品, 闭源产品, 市占率第三
  • DB2: IBM公司产品 ,闭源产品
  • SQLite: 轻量级数据, 安装包只有几十k ,只具备基础的增删改查功能

如何连接数据库执行SQL语句

  • 执行SQL语句之前需要先和数据库软件进行链接
  1. 从开始菜单中找到MariaDB或MySQL文件夹 展开后找到 MySQL Client 然后输入密码回车
  1. 如果使用的Linux或苹果系统 打开终端 然后输入 mysql -uroot -p 回车 然后输入密码回车
  1. 显示下图内容 代表成功
  1. 退出命令 exit;

数据库中如何保存数据

  • 数据库中以表为单位保存数据,表是存在于数据库之中, 保存数据则需要先建库再建表

SQL语句格式要求:

  1. 以;结尾
  1. 不区分大小写
  1. 可以包含空格和换行

数据库相关SQL

  1. 查询所有数据库
  • 格式: show databases;
  1. 创建数据库
  • 格式: create database 数据库名 charset=utf8/gbk;
  • 举例:
  • create database db1;
  • create database db2 charset=utf8;
  • create database db3 charset=gbk;
  • show databases;
  1. 查看数据库信息
  • 格式: show create database 数据库名;
  • 举例:
  • show create database db1;
  • show create database db2;
  • show create database db3;
  1. 删除数据库
  • 格式: drop database 数据库名;
  • 举例:
  • drop database db2;
  • drop database db3;
  1. 使用数据库
  • 执行表相关和数据相关的SQL语句之前必须使用了某一个数据库 否则会报错.
  • 格式: use 数据库名;
  • 举例:
  • use db1;

数据库相关练习题:

1. 创建 mydb1和mydb2 数据库 字符集分别为utf8和gbk

create database mydb1 charset=utf8;

create database mydb2 charset=gbk;

  1. 查询所有数据库检查是否创建成功

show databases;

  1. 检查两个数据库的字符集是否正确

show create database mydb1;

show create database mydb2;

  1. 先使用mydb2 再使用 mydb1

u

use mydb1;

  1. 删除两个数据库

drop database mydb1;

drop database mydb2;

表相关的SQL语句

  • 执行表相关的SQL语句必须提前使用了某个数据库,否则会报错

use db1;

  1. 查询所有表
  • show tables;
  1. 创建表
  • 格式: create table 表名(字段1名 类型,字段2名 类型)charset=utf8/gbk;
  • 举例:
  • create table person(name varchar(50), age int);
  • create table hero(name varchar(50),money int,type varchar(10))charset=utf8;
  • create table student(name varchar(50),chinese int,math int,english int)charset=gbk;
  • show tables;
  1. 查看表信息
  • 格式: show create table 表名;
  • show create table student;
  1. 删除表
  • 格式: drop table 表名;
  • drop table student;
  1. 修改表名
  • 格式: rename table 原名 to 新名;
  • 举例:
  • rename table person to p;
  1. 查看表字段
  • 格式: desc 表名; desc = description 描述
  • 举例:
  • desc p;

表相关练习题:

1. 创建数据库mydb3 字符集gbk 并使用

create database mydb3 charset=gbk;

use mydb3;

2. 创建t_hero英雄表, 有名字和年龄字段 默认字符集

create table t_hero(name varchar(20),age int);

3. 修改表名为hero

rename table t_hero to hero;

4. 查看表的字符集

show create table hero;

5. 查询表字段

desc hero;

6. 删除表

drop table hero;

7. 删除数据库

drop database mydb3;

表相关SQL(续)

use db1;

create table emp(name varchar(50));

  1. 添加表字段
  • 最后面添加格式: alter table 表名 add 字段名 类型;
  • 最前面添加格式: alter table 表名 add 字段名 类型 first;
  • 在xxx字段的后面添加格式: alter table 表名 add 字段名 类型 after xxx;
  • 举例:
  • alter table emp add age int;
  • alter table emp add id int first;
  • alter table emp add gender varchar(5) after name;
  • desc emp;
  1. 删除表字段
  • 格式: alter table 表名 drop 字段名;
  • 举例:
  • alter table emp drop gender;
  • alter table emp drop age;
  1. 修改表字段
  • 格式: alter table 表名 change 原名 新名 新类型;
  • 举例:
  • alter table emp change name age int;
  • alter table emp change id name varchar(50);

表相关SQL语句回顾:

  1. 查询所有表 show tables;
  1. 创建表 create table t1(name varchar(20),age int)charset=utf8/gbk;
  1. 查询表信息 show create table t1;
  1. 表字段 desc t1;
  1. 删除表 drop table t1;
  1. 修改表名 rename table t1 to t2;
  1. 添加表字段 alter table t1 add age int first/after xxx;
  1. 删除表字段 alter table t1 drop age;
  1. 修改表字段 alter table t1 change 原名 新名 新类型;

表相关练习题:

  1. 创建数据库mydb4 字符集utf8并使用

create database mydb4 charset=utf8;

use mydb4;

  1. 创建teacher表 有名字字段

create table teacher(name varchar(50));

  1. 添加表字段: 最后添加age 最前面添加id , age前面添加salary工资

alter table teacher add age int;

alter table teacher add id int first;

alter table teacher add salary int after name;

  1. 删除age字段

alter table teacher drop age;

  1. 修改表名为t

rename table teacher to t;

  1. 删除表

drop table t;

  1. 删除数据库

drop database mydb4;

数据相关SQL

  • 执行数据相关的SQL 必须已经使用了某一个数据库并且已经创建了保存数据的表
  • 建库建表

create database mydb5 charset=utf8;

use mydb5;

create table person(name varchar(50),age int)charset=utf8;

  1. 往表中插入数据(增)
  • 全表插入格式: insert into 表名 values(值1,值2,....);

insert into person values("Tom",18);

  • 指定字段插入格式: insert into 表名(字段1名,字段2名) values(值1,值2);

insert into person(name) values("Jerry");

  • 批量插入数据:

insert into person values("lilei",28),("hanmeimei",28);

insert into person(name) values("aa"),("bb"),("cc");

  • 插入中文数据:

insert into person values("刘德华",50);

如果执行上面SQL语句报如下错误

执行 set names gbk; 可以解决

  1. 查询数据
  • 格式: select 字段信息 from 表名 where 条件;
  • 举例:
  • select name from person;
  • select name,age from person;
  • select * from person;
  • select name from person where age=28;
  • select * from person where name='刘德华';
  1. 修改数据
  • 格式: update 表名 set 字段1名=值,字段2名=值 where 条件;
  • 举例:
  • update person set name="杰瑞" where name='Jerry';
  • update person set name="张学友",age=30 where name="刘德华";
  • update person set age=50 where name="aa";
  • update person set age=88 where age=28;
  • update person set age=10 where age is null;

    • 删除数据
  • 格式: delete from 表名 where 条件;
  • 举例:
  • delete from person where age=88;
  • delete from person where name="张学友";
  • delete from person where age>10;
  • delete from person;

数据相关SQL语句回顾

  1. 增: insert into 表名(字段1名,字段2名) values(值1,值2),(值1,值2),(值1,值2);
  2. 查: select 字段信息 from 表名 where 条件
  3. 改: update 表名 set 字段名=值 where 条件
  4. 删: delete from 表名 where 条件;

综合练习题 :

1. 创建数据库day1db 字符集utf8并使用

create database day1db charset=utf8;

use day1db;

2. 创建t_hero表, 有name字段 字符集utf8

create table t_hero(name varchar(20));

3. 修改表名为hero

rename table t_hero to hero;

4. 最后面添加价格字段money, 最前面添加id字段, name后面添加age字段

alter table hero add money int;

alter table hero add id int first;

alter table hero add age int after name;

5. 表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888

insert into hero values(1,'李白',50,6888),(2,'赵云',30,13888),(3,'刘备',25,6888);

6. 查询价格为6888的英雄名

select name from hero where money=6888;

7. 修改刘备年龄为52岁

update hero set age=52 where name='刘备';

8. 修改年龄小于等于50岁的价格为5000

update hero set money=5000 where age<=50;

9. 删除价格为5000的信息

delete from hero where money=5000;

10. 删除表, 删除数据库

drop table hero;

drop database day1db;

数据类型

 整数: int(m) 和 bigint(m) , bigint等效java中的long, m代表显示长度,举例m=5,存18 查询到 00018 , 需要补零的话必须使用zerofill关键字

create table t1(age int(5) zerofill);

insert into t1 values(18);

select * from t1;

        浮点数: double(m,d) m代表总长度,d代表小数长度 54.432 m=5 d=3

create table t2(price double(5,3));

insert into t2 values(45.2312312123);

insert into t2 values(455.231); //报错

    字符串

  • char(m): 固定长度字符串 , m=5 存abc 占5个字符长度 , 应用场景: 当存储长度固定时,比如存储性别char(1) , 最大字符长度255
  • varchar(m):可变长度字符串, m=5 存abc 占3个字符长度, 最大值65535但是建议保存255以内长度的数据
  • text(m):可变长度字符串, 最大值65535 建议保存长度大于255的数据
  1. 日期
  • date: 只能保存年月日
  • time: 只能保存时分秒
  • datetime: 保存年月日时分秒, 最大值9999-12-31, 默认值为null
  • timestamp(时间戳:保存1970年1月1日到现在的毫秒数):保存年月日时分秒, 最大值2038-1-19 , 默认值为当前系统时间(当赋值为null时触发默认值)
  • 举例:

create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);

insert into t_date values("2022-06-09",null,null,null);

insert into t_date values(null,"16:16:20","2011-11-22 10:20:30",null);

select * from t_date;

主键约束 primary key

  • 约束: 创建表时给表字段添加的限制条件
  • 主键: 表示数据唯一性的字段称为主键
  • 主键约束: 限制主键的值唯一且非空
  • 举例:

create table t5(id int primary key,name varchar(30));

insert into t5 values(1,"a");

insert into t5 values(2,"b");

insert into t5 values(2,"c"); //重复报错

insert into t5 values(null,"d"); //不能为null 报错

主键约束+自增 primary key auto_increment

  • 当字段设置为自增后 插入null值时会触发自增
  • 自增规则: 从历史最大值+1
  • 举例:

create table t6(id int primary key auto_increment,name varchar(50));

insert into t6 values(null,"a");

insert into t6 values(null,"b");

insert into t6 values(10,"c");

insert into t6 values(null,"d");

delete from t6 where id>=10;

insert into t6 values(null,"e");

综合练习题:

Plain Text

1. 创建数据库newdb1, 字符集utf8并使用

create database newdb1 charset=utf8;

use newdb1;

2. 在数据库中创建员工表emp 字段:id,name,sal(工资),deptId(部门id) 字符集utf8

create table emp(id int primary key auto_increment,name varchar(50),sal int,deptId int)charset=utf8;

3. 创建部门表dept 字段:id,name,loc(部门地址) 字符集utf8

create table dept(id int primary key auto_increment,name varchar(50),loc varchar(50))charset=utf8;

4. 部门表插入以下数据: 1 神仙部 天庭 2 妖怪部 盘丝洞

insert into dept values(null,'神仙部','天庭'),(null,'妖怪部','盘丝洞');

5. 员工表插入一下数据: 1 悟空 5000 1 , 2 八戒 2000 1 ,

3 蜘蛛精 8000 2 , 4 白骨精 9000 2

insert into emp values(null,'悟空',5000,1),(null,'八戒',2000,1),(null,'蜘蛛精',8000,2),(null,'白骨精',9000,2);

6. 查询工资6000以下的员工姓名和工资

select name,sal from emp where sal<6000;

7. 修改神仙部的名字为取经部

update dept set name="取经部" where name="神仙部";

8. 给员工表添加奖金comm字段

alter table emp add comm int;

9. 修改员工表中部门id为1的 奖金为500

update emp set comm=500 where deptId=1;

10. 把取经部的地址改成五台山

update dept set loc="五台山" where name="取经部";

11. 修改奖金字段为性别gender字段 类型为varchar(5)

alter table emp change comm gender varchar(5);

12. 修改孙悟空和猪八戒性别为男

update emp set gender="男" where deptId=1;

13. 删除没有性别的员工

delete from emp where gender is null;

14. 删除性别字段

alter table emp drop gender;

15. 删除表 和 删除数据库

drop table emp;

drop table dept;

drop database newdb1;

idea中配置数据库相关内容

  1. 配置用户和密码, 下载驱
  1. 点击Test Connection 如果现实绿色对勾 不管有任何提示都不用管直接点击OK
  1. 如果点击Test Connection 出现以下红色报错

在URL后面添加以下内容

  • 如果执行包含中文的SQL语句出错将下面url改成如下内容

jdbc:mysql://localhost:3306?characterEncoding=utf8&serverTimezone=Asia/Shanghai

除了idea以外 推荐使用SQLYog(图标是个小海豚)

数据库SQL语句的分类

  • DDL: 数据定义语言, 包括数据库相关和表相关的SQL,
  • truncate table 表名; 删除表并创建新表
  • DML: 数据操作语言,包括:增删改查相关的SQL语句
  • DQL: 数据查询语言,包括:select查询相关
  • TCL: 事务控制语言,包含和事务相关的SQL语句
  • DCL: 数据控制语言, 包含创建用户以及用户权限分配相关SQL

导入*.sql批处理文件

  1. 从老师工程中把emp.zip压缩文件复制到某个盘的根目录下面并解压到当前文件夹
  1. 在命令行客户端中 执行source F:/emp.sql;
  • 执行show tables;
  • 如果经过测试出现中文乱码问题 执行 set names utf8; 或 set names gbk;

比较运算符 > < >= <= = !=和<>

  1. 查询工资大于等于3000的员工姓名,工资和工作

select name,sal,job from emp where sal>=3000;

  1. 查询1号部门的员工姓名,工资,部门id

select name,sal,dept_id from emp where dept_id=1;

  1. 查询程序员的名字和工资

select name,sal from emp where job="程序员";

  1. 查询员工表中不是销售的员工姓名和工作(两种写法)

select name,job from emp where job!="销售";

select name,job from emp where job<>"销售";

and 和 or 和 not

  • and: 等效java中的&&, 需要多个条件同时满足时使用
  • or: 等效java中的|| , 多个条件满足一个时使用
  1. 查询1号部门工资高于2000的员工信息

select * from emp where dept_id=1 and sal>2000;

  1. 查询3号部门或工资等于5000的员工信息

select * from emp where dept_id=3 or sal=5000;

  1. 查询出CEO和项目经理的名字

select name from emp where job="CEO" or job="项目经理";

  1. 查询有奖金的销售名字和奖金

select name,comm from emp where comm>0 and job="销售";

is null 和 is not null

  1. 查询有上级领导的员工姓名和领导id

select name,manager from emp where manager is not null;

  1. 查询没有上级领导的员工姓名和领导id

select name,manager from emp where manager is null;

between x and y两者之间(包含x和y)

  1. 查询工资在2000到3000之间的员工信息

select * from emp where sal>=2000 and sal<=3000;

select * from emp where sal between 2000 and 3000;

  1. 查询工资在2000到3000之外的员工信息

select * from emp where sal not between 2000 and 3000;

in(x,y,z)

  • 当查询某个字段的值等于多个值的时候使用
  1. 查询工资等于1500,3000和5000的员工姓名和工资

select name,sal from emp where sal=1500 or sal=3000 or sal=5000;

select name,sal from emp where sal in(1500,3000,5000);

  1. 查询工作不是销售和程序员的信息

select * from emp where job not in("销售","程序员");

distinct去重

  • 去掉重复的数据
  1. 查询员工表中出现了哪几种不同的工作

select distinct job from emp;

  1. 查询员工表中出现了哪几个部门的id

select distinct dept_id from emp;

综合练习题

  1. 查询2号部门工资高于1000的员工信息

select * from emp where dept_id=2 and sal>1000;

  1. 查询3号部门或工资等于5000的员工信息

select * from emp where dept_id=3 or sal=5000;

  1. 查询工资在1000到2000之间的员工姓名和工资

select name,sal from emp where sal between 1000 and 2000;

  1. 查询工资不等于3000和5000的员工信息

select * from emp where sal not in(3000,5000);

  1. 查询1号部门有哪几种不同的工作

select distinct job from emp where dept_id=1;

模糊查询like

  • %: 代表0或多个未知字符
  • _:代表1个未知字符
  • 举例:
  • 以x开头 x%
  • 以x结尾 %x
  • 包含x %x%
  • 第二个字符是x _x%
  • 以x开头以y结尾 x%y
  • 第三个是x倒数第二个是y __x%y_
  1. 查询姓孙的员工信息

select * from emp where name like "孙%";

  1. 查询名字以精结尾的员工姓名

select name from emp where name like "%精";

  1. 查询工作中包含销售的员工信息

select * from emp where job like "%销售%";

  1. 查询工作中第二个字是售的员工姓名和工作

select name,job from emp where job like "_售%";

  1. 查询名字中包含僧 并且工资高于2000的员工姓名和工资

select name,sal from emp where name like "%僧%" and sal>2000;

  1. 查询1号和2号部门中工作以市开头的员工信息

select * from emp where job like "市%" and dept_id in(1,2);

排序 order by

  • 格式: order by 字段名 asc升序(默认)/desc降序;
  1. 查询员工姓名和工资,按照工资升序排序

select name,sal from emp order by sal;

select name,sal from emp order by sal desc;

  1. 查询工资高于2000的员工姓名和工资, 按照工资降序排序

select name,sal from emp where sal>2000 order by sal desc;

  1. 查询每个员工的姓名,工资和部门id 按照部门id升序排序,如果部门id一致则按照工资降序

select name,sal,dept_id from emp order by dept_id,sal desc;

分页查询

  • 格式: limit 跳过的条数,请求的条数(每页的条数)
  • 跳过的条数= (请求的页数-1)*每页的条数
  • 举例:
  • 查询第一页的5条数据(1-5) limit 0,5
  • 查询第2页的5条数据(6-10) limit 5,5
  • 查询第5页的5条数据 limit 20,5
  • 查询第8页的10条数据 limit 70,10
  • 查询第7页的8条数据 limit 48,8
  1. 查询工资最低的3个人的信息

select * from emp order by sal limit 0,3;

  1. 查询工资最高的员工信息

select * from emp order by sal desc limit 0,1;

  1. 按照入职日期排序 查询第2页的3条数据

select * from emp order by hiredate limit 3,3;

  1. 按照工资升序排序查询第3页的2条数据

select * from emp order by sal limit 4,2;

综合练习题

1. 查询员工表中3号部门工资高于1500的员工信息

select * from emp where dept_id=3 and sal>1500;

2. 查询2号部门员工或者没有领导的员工信息

select * from emp where dept_id=2 or manager is null;

3. 查询有领导的员工姓名,工资按照工资降序排序

select name,sal from emp where manager is not null order by sal desc;

4. 查询2号和3号部门的员工姓名和入职日期hiredate按照入职日期降序排序

select name,hiredate from emp where dept_id in(2,3) order by hiredate desc;

5. 查询名字中包含僧和包含精的员工姓名

select name from emp where name like "%僧%" or name like "%精%";

6. 查询工资高于2000的工作有哪几种?

select distinct job from emp where sal>2000;

  1. 查询工资升序第4页的2条数据

select * from emp order by sal limit 6,2;

别名

select name as "名字" from emp;

select name "名字" from emp;

select name 名字 from emp;

聚合函数

  • 通过聚合函数可以对查询的多条数据进行统计查询
  • 有哪些统计方式?
  • 平均值avg
  • 最大值max
  • 最小值min
  • 求和sum
  • 计数count
  • 平均值avg()
  • 查询1号部门的平均工资

select avg(sal) from emp where dept_id=1;

  • 最大值max()
  • 查询1号部门的最高工资

select max(sal) from emp where dept_id=1;

  • 最小值min()
  • 查询1号部门的最低工资

select min(sal) from emp where dept_id=1;

  • 求和sum()
  • 查询程序员的工资总和

select sum(sal) from emp where job="程序员";

  • 计数count(*)
  • 查询员工表的人数

select count(*) from emp;

聚合函数练习题

  1. 查询销售的平均工资

select avg(sal) from emp where job="销售";

  1. 查询程序员的最高工资

select max(sal) from emp where job="程序员";

  1. 查询名字包含精的员工数量

select count(*) from emp where name like "%精%";

  1. 查询和销售相关的工作一个月工资总和

select sum(sal) from emp where job like "%销售%";

  1. 查询2号部门的最高工资和最低工资起别名

select max(sal) 最高工资, min(sal) 最低工资 from emp where dept_id=2;

分组查询group by

  • 可以将某个字段相同值的数据划分为一组,然后以组为单位进行统计查询
  • 如果题目中出现每个或每种这样的关键字 并且查询的内容为聚合函数的结果
  1. 查询每个部门的平均工资

select dept_id,avg(sal) from emp group by dept_id;

  1. 查询每个部门的最高工资

select dept_id,max(sal) from emp group by dept_id;

  1. 查询每种工作的平均工资

select job,avg(sal) from emp group by job;

  1. 查询每个部门工资高于2000的人数

select dept_id,count(*) from emp where sal>2000 group by dept_id;

  1. 查询每种工作的最低工资

select job,min(sal) from emp group by job;

  1. 查询1号部门和2号部门的人数

select dept_id,count(*) from emp where dept_id in(1,2) group by dept_id;

  1. 查询平均工资最高的部门id和平均工资

select dept_id,avg(sal) from emp group by dept_id order by avg(sal) desc limit 0,1;

having关键字

  • where后面只能写普通字段条件,不能写聚合函数条件
  • having后面专门写聚合函数条件,而且需要和group by分组查询结合使用,写在group by 的后面
  1. 查询每个部门的平均工资,要求平均工资大于2000

select dept_id,avg(sal) from emp group by dept_id having avg(sal)>2000;

select dept_id,avg(sal) a from emp group by dept_id having a>2000;

  1. 查询每种工作的人数,只查询人数大于1的

select job,count(*) c from emp group by job having c>1;

  1. 查询每个部门的工资总和,只查询有领导的员工, 并且要求工资总和大于5400.

select dept_id,sum(sal) s from emp where manager is not null group by dept_id having s>5400;

  1. 查询每个部门的平均工资, 只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的

select dept_id,avg(sal) a from emp where sal between 1000 and 3000 group by dept_id having a>=2000;

各种查询相关的关键字顺序

  • select 字段信息 from 表名 where 普通字段条件 group by 分组字段名 having 聚合函数条件 order by 排序字段名 limit 跳过条数,请求条数.

子查询(嵌套查询)

  • 可以将一条SQL语句查询的结果当做另外一条SQL语句条件的值
  1. 查询工资大于2号部门平均工资的员工信息

select avg(sal) from emp where dept_id=2;

select * from emp where sal>(select avg(sal) from emp where dept_id=2);

  1. 查询工资高于程序员最高工资的员工信息

select max(sal) from emp where job="程序员";

select * from emp where sal>(select max(sal) from emp where job="程序员");

  1. 查询工资最高的员工信息

select * from emp where sal=(select max(sal) from emp);

  1. 查询和孙悟空相同工作的员工信息

select * from emp where job=(select job from emp where name="孙悟空") and name!="孙悟空";

  1. 查询工资最低的员工的同事们的信息(指同一部门)
  • 得到最低工资

select min(sal) from emp;

  • 通过最低工资得到拿最低工资人的部门id

select dept_id from emp where sal=(select min(sal) from emp);

  • 通过部门id查询员工

select * from emp where dept_id=(select dept_id from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);

练习题

1. 查询工资大于等于3000的员工姓名和工资

2. 查询1号部门的员工姓名和工作

3. 查询不是程序员的员工姓名和工作(两种写法)

4. 查询奖金等于300的员工姓名,工资和工作

5. 查询1号部门工资大于2000的员工信息

6. 查询3号部门或工资等于5000的员工信息

7. 查询出CEO和项目经理的名字

8. 查询工资为3000,1500和5000的员工信息

9. 查询工资不等于3000,1500和5000的员工信息

10. 查询工资在1000到2000之间的员工信息

11. 查询工资在1000到2000以外的员工信息

12. 查询有领导的员工姓名和领导id

13. 查询没有领导的员工姓名和领导id

14. 查询员工表中出现了哪几种不同的工作

15. 查询员工表中出现了那几个部门的id

16. 查询姓孙的员工姓名

17. 查询名字最后一个字是精的员工信息

18. 查询工作中包含销售的员工信息

19. 查询工作中第二个字是售的员工信息

20. 查询名字中包含僧的员工并且工资高于2000的员工信息

21. 查询1号和2号部门中工作以市开头的员工信息

22. 查询所有员工的姓名和工资 按照工资升序排序

23. 查询所有员工的姓名和工资 按照工资降序排序

24. 查询所有员工姓名 工资和部门id 按照部门id降序排序,如果部门id一致则按照工资升序排序

25. 查询员工表中3号部门工资高于1500的员工信息

26. 查询2号部门员工或者没有领导的员工信息

27. 查询有领导的员工姓名,工资按照工资降序排序

28. 查询2号和3号部门的员工姓名和入职日期hiredate 按照入职日期降序排序

29. 查询名字中包含僧和包含精的员工姓名

30. 查询工资高于2000的工作有哪几种?

31. 查询工资最高的前三个员工

32. 查询员工表按照id排序, 第2页的5条数据

33. 查询员工表按照id排序, 第3页的4条数据

34. 查询3号部门工资最低的员工姓名和工资

35. 查询工作不是人事的员工中工资降序第二页的3条数据

36. 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)

37. 给3号部门所有员工涨薪5块钱

38. 查询没有领导的员工和3号部门的员工,工资降序取前三条

39. 查询2号部门的最高工资

40. 查询有领导的员工中工资在1000到2000之间的人数

41. 查询3号部门的工资总和

42. 查询程序员和销售的总人数

43. 查询1号部门有领导的员工的平均工资

44. 查询1号部门的最低工资和最高工资

45. 查询和销售相关的工作人数

46. 查询工资不是1500和3000的员工人数

47. 查询1号部门出现了哪几种工作

48. 查询名字包含精的员工数量

49. 查询和销售相关的工作一个月工资总和

50. 查询2号部门的最高工资和最低工资起别名

51.查询每个部门的平均工资

  1. 查询每种工作的平均工资
  1. 查询每个部门的最高工资
  1. 查询每种工作的最低工资
  1. 查询每个部门工资高于2000的人数
  1. 查询每个部门有领导的员工人数
  1. 查询1号部门每种工作的最低工资
  1. 查询平均工资最高的部门id和平均工资
  1. 查询每个部门的平均工资,要求平均工资大于2000
  1. 查询每种工作的人数,只查询人数大于1的
  1. 查询每个部门的工资总和,只查询有领导的员工, 并且要求工资总和大于5400.
  1. 查询每个部门的平均工资, 只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的
  1. 查询工资大于2号部门平均工资的员工信息
  1. 查询工资高于程序员最高工资的员工信息
  1. 查询工资最高的员工信息
  1. 查询孙悟空的部门信息(用到dept部门表)
  1. 查询和孙悟空相同工作的其它员工信息
  1. 查询最低工资员工的同事信息(同事代表同一部门)
  • 可以对查询的字段进行+-*/运算

36. 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)

select name,sal,sal*5 年终奖 from emp;

37. 给3号部门所有员工涨薪5块钱

update emp set sal=sal+5 where dept_id=3;

  1. 查询孙悟空的部门信息(用到dept部门表)

select dept_id from emp where name="孙悟空";

select * from dept where id=(select dept_id from emp where name="孙悟空");

关联关系

  • 指创建表时,表和表之间存在的业务关系
  • 有哪几种关系:
  • 一对一:有AB两张表,A表中的一条数据对应B表中的一条数据, 同时B表中的一条数据也对应A表中的一条数据
  • 一对多:有AB两张表, A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据对应A表中的一条数据
  • 多对多:有AB两张表, A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据也对应A表中的多条数据
  • 如果两张表之间存在关联关系,如何建立关系?
  • 一对一: 可以在两张关系表中任何一个表里面添加建立关系的字段,指向另外一张表的主键
  • 一对多: 在一对多的两张表里面的表示"多"的表中添加建立关系的字段指向另外一张表的主键
  • 多对多:需要创建一个单独的关系表,关系表中两个字段分别指向另外两张表的主键

关联查询

  • 同时查询多张表数据的查询方式称为关联查询
  • 关联查询包括: 等值链接, 内连接和外连接

关联查询之等值链接

  • 格式: select * from A,B where 关联关系 and 其它条件
  1. 查询每个员工的姓名和对应的部门名

select e.name,d.name

from emp e,dept d where e.dept_id=d.id;

  1. 查询工资高于2000的员工姓名,工资和部门信息

select e.name,e.sal,d.*

from emp e,dept d where e.dept_id=d.id and sal>2000;

关联查询之内连接

  • 内连接和等值链接作用一样,查询到的都是两个表的交集数据,查询不到交集以外的数据

insert into emp(name,sal) values("灭霸",5);

  • 格式: select * from A join B on 关联关系 where 条件
  1. 查询每个员工的姓名和对应的部门名

select e.name,d.name

from emp e join dept d on e.dept_id=d.id;

  1. 查询工资高于2000的员工姓名,工资和部门信息

select e.name,sal,d.*

from emp e join dept d on e.dept_id=d.id

where sal>2000;

外连接

  • 作用:查询一张表的全部和另外一张表的交集数据
  • 格式:select * from A left/right join B on 关联关系 where 条件;
  1. 查询所有员工名和对应的部门名

select e.name,d.name

from emp e left join dept d on e.dept_id=d.id;

  1. 查询所有部门名称,地点和对应的员工姓名和工资,只查询有领导的员工

select d.name,loc,e.name,sal

from emp e right join dept d on dept_id=d.id where e.manager is not null;

如何查询多对多表中的数据

  • 创建表:

create table student(id int primary key auto_increment,name varchar(50))charset=utf8;

create table teacher(id int primary key auto_increment,name varchar(50))charset=utf8;

create table t_s(tid int,sid int);

  • 插入数据

insert into teacher values(null,"苍老师"),(null,"传奇哥");

insert into student values(null,"小明"),(null,"小红"),(null,"小绿"),(null,"小狗"),(null,"小黄");

insert into t_s values(1,1),(1,5),(1,4),(2,2),(2,3),(2,1),(2,5);

苍老师:小明,小黄,小狗

传奇哥: 小红,小绿,小明,小黄

  1. 查询每个老师名字和对应的学生名字

select t.name,s.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid;

  1. 查询苍老师的学生都有谁?

select s.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid where t.name="苍老师";

  1. 查询小明的老师是谁?

select t.name

from teacher t join t_s ts on t.id=ts.tid

join student s on s.id=ts.sid where s.name="小明";

关联查询总结:

  • 如果查询的是多张表中的数据则使用关联查询:(等值链接,内连接和外连接)
  • 如果查询的是多张表的交集数据,则使用等值链接或内连接(推荐)
  • 如果查询的是一张表的全部和其它表的交集数据则使用外连接

JDBC

  • 作用: 通过Java代码执行所学的SQL语句
  • JavaDataBaseConnectivity: Java数据库链接
  • JDBC是Sun公司提供的一套专门用于Java语言和数据库进行连接的API(Application Programma Interface应用程序编程接口)
  • Sun公司为了避免Java程序员每一种数据库软件都学习一套新的方法, 通过JDBC接口将方法名定义好,各个数据库厂商根据此接口中的方法名写各自的实现类(jar包(驱动)), 这样Java程序员只需要掌握JDBC接口中方法的调用即可访问任何数据库, 即使在工作中换了数据库软件,代码也不需要发生改变.

如何通过JDBC和数据库软件进行链接并执行SQL语句

  1. 创建maven工程
  1. 在工程的pom.xml文件中添加MySQL驱动的依赖 和修改jdk和字符集
  • 从苍老师文档服务器中 pom.xml常用配置中找到以下内容

Plain Text

<properties>

<!-- 设置 JDK 版本为 1.8 -->

<maven.compiler.target>1.8</maven.compiler.target>

<maven.compiler.source>1.8</maven.compiler.source>

<!-- 设置编码为 UTF-8 -->

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<maven.compiler.encoding>UTF-8</maven.compiler.encoding>

</properties>

<!--添加MySQL相关的依赖,Maven会通过此依赖找到对应的jar包文件下载到工程中-->

<dependencies>

<!-- 连接MySQL数据库的依赖 -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.15</version>

</dependency>

</dependencies>

  1. 修改完pom.xml文件后需要点击刷新maven的图标
  1. 如果pom.xml文件中报错,此时检查jar文件是否已经出现如果没有出现则需要检查maven是否成功配置, 如果已经成功配置仍然有报错, 则删除.m2文件夹下的repository文件夹 然后重新刷新maven 解决, 如果以上操作全部做了 仍然没有jar文件 则联系项目经理
  1. 创建Demo01.java类文件, 在main方法中添加以下代码

Plain Text

//1.建立链接 异常抛出

Connection conn =

DriverManager.getConnection(

"jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false","root","root");

System.out.println("链接对象:"+conn);

//2.创建执行SQL语句的对象

Statement s = conn.createStatement();

//3.执行SQL语句 execute=执行

s.execute("create table jdbct1(id int)");

//4.关闭资源 断开链接

conn.close();

System.out.println("执行完成!");

Statement执行SQL语句的对象

  • execute("sql"); 可以执行任意sql语句,但是推荐执行DDL(数据定义语言,包括数据库相关和表相关)
  • int row = executeUpdate("sql"); 执行增删改, 此方法的返回值为生效的行数
  • ResultSet rs = executeQuery("sql"); 执行查询相关的SQL语句, ResultSet对象里面装着查询回来的结果.

DBCP数据库连接池

  • DataBaseConnectionPool: 数据库连接池
  • 作用: 将链接重用,避免频繁的开关链接所带来的资源浪费.
  • 如何使用数据库连接池?
  • 在pom.xml文件中添加连接池相关的依赖

Plain Text

<!-- 数据库连接池 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.1.21</version>

</dependency>

  • 相关代码:

Plain Text

//创建表示连接池的对象

DruidDataSource ds = new DruidDataSource();

//设置链接数据库的信息

ds.setUrl("jdbc:mysql://localhost:3306/empdb?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false");

ds.setUsername("root");

ds.setPassword("root");//写自己的密码

//设置初始连接数量

ds.setInitialSize(3);

//设置最大连接数量

ds.setMaxActive(5);

//从连接池中获取链接 异常抛出

Connection conn = ds.getConnection();

System.out.println("连接对象:"+conn);

注册功能

  • 创建表:

use empdb;

create table user(id int primary key auto_increment,username varchar(30),password varchar(30),nick varchar(30));

  • 字符串的拼接

"aa"+username+"bb"+password+"cc"+nick+"dd"

insert into user values(null,tom,123456,汤姆);

目录

MySQL的基础用法

增删改查

查询相关的内容

主键约束


SQL注入

  • SQL注入是往本应该传值的地方,传递进去了SQL语句导致原有SQL语句的逻辑发生改变,这个过程称为SQL注入

where username='xxx' and password='' or '1'='1'

  • SQL注入漏洞是网站的低级漏洞,但是危害比较大, 黑客可以利用此漏洞对网站进行攻击

PreparedStatement

  • 通过PreparedStatement执行SQL语句可以避免出现SQL注入漏洞
  • 内部原理: 使用PreparedStatement 可以起到预编译的作用, 可以将编译SQL语句的时间点提前(从之前执行SQL语句时编译提前到创建时), 编译时间点提前可以将SQL语句中业务逻辑部分编译好(将业务部分锁死),之后将用户输入的内容替换到SQL语句时,用户输入的内容只能以值的形式添加到SQL语句中,不会影响原有SQL语句的判断逻辑,所以避免了SQL注入的漏洞
  • 执行setString()方法替换?时 会自动给字符串添加引号,并且用户输入的字符串中出现了引号关键字时会进行转义操作 password=''' or ''1''=''1'

数据库常见错误列表

  1. 未开启数据库服务
  • 在此电脑上右键->管理->服务和应用程序->找到MySQL或MariaDB 右键启动
  1. 用户名或密码错误
  1. SQL语句拼写错误
  1. 创建或删除数据库时存在的错误
  1. 主键值插入错误

MySQL的基础汇总(包含60道练习题)~~相关推荐

  1. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  2. python基础知识选择题-99道经典练习题助你全面掌握python基础知识,附技巧答案...

    不知何时,全民学python已经达到了高潮!有很对人都在问,python这么火,学了之后到底能做什么了? 对于这个问题,我只想说一句:python真的无所不能: 它是人工智能的首选语言,主流有一下方向 ...

  3. mysql经典45道题_MySQL查询 45道练习题

    SQL查询45道练习题 1.查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,class from student 2.查询教师所有的单位即不 ...

  4. 100道练习题,玩转Numpy模块!(上)

    100道练习题,玩转Numpy模块!(上) Numpy 介绍 Numpy 是 Python 做数据分析所必须要掌握的基础库之一.以下为入门 Numpy 的100题小练习,原为 github 上的开源项 ...

  5. MySQL知识点整理汇总

    文章目录 前言 一.数据库与SQL 1. 数据库与数据库管理系统 2. 关系数据库 3. MySQL语句的种类 4. MySQL语句的基本书写规则 二.MySQL语句的两大顺序 1. MySQL 语句 ...

  6. 八、MySQL 常用函数汇总(1)

    文章目录 一.函数 1.1 函数简介 1.2 不同DBMS函数的差异 二.数学函数 2.1 绝对值函数ABS(x)和返回圆周率的函数PI() 2.2 平方根函数SQRT(x)和求余函数MOD(x,y) ...

  7. 狂神Java面试题总结:基础及语法169道

    狂神Java面试题总结:基础及语法169道 收集整理:秦疆 联系方式QQ:24736743 微信:qinlvejiang 答案来源收集与互联网,部分内容经供参考,代码全部为手写验证通过. 1~20 1 ...

  8. Mysql常用基础命令操作实战

    目录 一    启动与关闭MySQL    3 1.1    单实例MySQL启动与关闭方法    3 ※1※    常规启动关闭数据库方式(推荐)    3 1.2    多实例MySQL启动与关闭 ...

  9. MySQL(基础技能)

    MySQL(基础技能) 一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access. ...

  10. Python100道练习题(1-50)

    大家好,我们学完Python基础后,最好的巩固方法就是拿一些练习题练手,综合所学内容,这里给大家分享下网上大神整理的100道Python测试题,非常经典,如果大家发现什么错误,欢迎在评论区指出,记得点 ...

最新文章

  1. Superset配置impala数据源
  2. CRM one order性能调优指南
  3. C语言输出最后一个空格去掉,新人提问:如何将输出时每行最后一个空格删除...
  4. c语言乘法表 m*(9-i),C语言做九九乘法表.doc
  5. c语言中const对于define优点,为什么大多数C开发人员使用define而不是const?
  6. 8.1 Ext JS应用测试概览
  7. 403 forbidden nginx_5,Logstash正则提取Nginx日志 - pwcc
  8. Mybatis的简单增删查改(CRUD)
  9. 解决leetcode题目乱码问题
  10. AdapterView及子类(一)
  11. 计算机主机报警 声,电脑开机报警声音大全
  12. html校验邮箱格式,正则验证邮箱格式
  13. 【高德LBS开源组件大赛】回眸微博的足迹
  14. AD那些事儿——4层板画法
  15. 溯源供应链引擎APS的历史(蔡颖)
  16. 专业系统开发流程有多少步骤?如何进行系统开发?
  17. 星星之火OIer:手机网络
  18. trunc和round区别
  19. CSP 202109-4 收集卡牌
  20. 二叉树的层序遍历-Java

热门文章

  1. 这个计算机到底是咋入门的(1.0)胡学友修改版
  2. python 猜词游戏(文本文件、数据库、csv)
  3. springboot-1-搭建一个springboot项目
  4. 矿工罢工?官方砸盘?FIL暴跌!Filecoin上线后的魔幻7天
  5. FIL世界全新板块——DeFi震撼来袭
  6. SEO专家祝鹏:浅谈SEO操作思路及技巧
  7. 【复习】Listening and Reading Comprehension
  8. 奶瓶(beini) 又一蹭网神器 1.2.2增强版带600万密码字典
  9. APP离线后,通过SystemClock.elapsedRealtime()校正时间
  10. matlab求解常微分方程的实验,实验五 - - 用matlab求解常微分方程