mysql的下载安装:
https://zhuanlan.zhihu.com/p/87959614
常用的sql
create database 库名
create database 库名 character set 编码
drop database 库名
use 库名
create table 表名( 字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
创建完成后,我们可以查看数据库表
show tables;
查看表的结构
desc 表名
drop table 表名
alter table 表名 add 字段名 类型(长度) [约束]
alter table 表名 modify 要修改的字段名 类型(长度) [约束]
alter table 表名 change 旧列名 新列名 类型(长度) [约束] alter table 表名 drop 列名
rename table 表名 to 新表名
alter table 表名 character set 编码
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
insert into 表名 values(值1,值2,值3……)
乱码问题:
方式二:
set names gbk;
update 表名 set 字段名=值, 字段名=值, 字段名=值……
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件
delete from 表名 where 条件
先准备数据
insert into tbl_user values(null,’老王’,’666’);
删除操作
delete from 表名;
select [distinct] *| 列名,列名 from 表名 [where条件]
select * from product;
select pname,price from product;
select * from product as p;
select pname as p from product
select distinct(price) from product;
insert into product values (null,'李士雪',38,null);
select pname,price+10 from product;
1.添加分类id (alter table product add cid varchar(32);)
2.初始化数据
update product set cid='1';
update product set cid='2' where pid in (5,6,7);
设置外键:
ALTER TABLE product ADD COLUMN category_id INT;
ALTER TABLE product ADD CONSTRAINT product_fk FOREIGN KEY (category_id) REFERENCES category(cid);
多表查询
与主外表有关
Select * from product left/right outer join category on cid=category_id(左右连接);
与主外表无关
Select product.pid,category.cid from product ,category;
基础的sql题
/*1. 查询出部门编号为30的所有员工*/
SELECT * FROM emp WHERE deptno=30;
/**********************************************/
/*2. 所有销售员的姓名、编号和部门编号。*/
SELECT ename,empno,deptno FROM emp WHERE job='销售员'
/**********************************************/
/*3. 找出奖金高于工资的员工。*/
SELECT * FROM emp WHERE comm>sal;
/**********************************************/
/*4. 找出奖金高于工资60%的员工。*/
SELECT * FROM emp WHERE comm>sal*0.6;
/**********************************************/
/*5. 找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。*/
SELECT * FROM emp WHERE (deptno=10 AND job='经理') OR (deptno=20 AND job='销售员');
/**********************************************/
/*6. 找出部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于20000的所有员工详细资料。*/
SELECT * FROM emp
WHERE
(deptno=10 AND job='经理')
OR (deptno=20 AND job='销售员')
OR job NOT IN ('经理','销售员') AND sal>=20000;
/**********************************************/
/*7. 有奖金的工种。*/
SELECT DISTINCT job FROM emp WHERE comm IS NOT NULL;
/**********************************************/
/*8. 无奖金或奖金低于1000的员工。*/
SELECT * FROM emp WHERE comm IS NULL OR comm < 1000;
/**********************************************/
/*9. 查询名字由三个字组成的员工。*/
/**********************************************/
/*10.查询2000年入职的员工。*/
/**********************************************/
/*11. 查询所有员工详细信息,用编号升序排序*/
SELECT * FROM emp ORDER BY empno ASC;
/**********************************************/
/*12. 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序*/
SELECT * FROM emp ORDER BY sal DESC, hiredate ASC
/**********************************************/
/*13. 查询每个部门的平均工资*/
SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
/**********************************************/
/*14. 求出每个部门的雇员数量。*/
SELECT deptno, COUNT(1) FROM emp GROUP BY deptno;
/**********************************************/
/*
15. 查询每种工作的最高工资、最低工资、人数
列:部门、最高工资、最低工资、人数(其中最高工资、最低工资、人数,都是分组信息)
表:emp
条件:无
分组:每种工资是分组信息,最高工资使用max(sal),最低工资使用min(sal),人数使用count(*)
*/
SELECT job, MAX(sal), MIN(sal), COUNT(1) FROM emp GROUP BY job;
/**********************************************/
/*16. 显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于50000,输出结果按月工资的合计升序排列*/
/*
列:工作名称、工资和(分组信息)
表:emp
条件:无
分组:从事同一工作的工资和,即使用job分组
分组条件:工资合计>50000,这是分组条件,而不是where条件
排序:工资合计排序,即sum(sal) asc
*/
SELECT job,SUM(sal) FROM emp GROUP BY job HAVING SUM(sal)>50000 and job not in ('销售员') ORDER BY SUM(sal) ASC;
总结:
1.//一定要是英文字符不能是中文 单引号或是其他的符号都是用英文
2.//SQL语句不区分大小写 无论是表明字段名还是数据库名?
3.写sql语句的时候分析:
列
表
条件
4.模糊查询 一个英文下划线表示一个字符 %表示是n个字符
5.ASC表示升序 DESC表示降序
6.日期类型也可以使用模糊查询
7.ASC表示升序 DESC表示降序
8.再MySQL中日期类型 数字类型的数据都可以进行排序
9.聚合函数
10.NOT IN 表示不相等 =表示相等
11.having 是先查询后过滤 和group by一起使用 where则是 先过滤后查询
sql进阶题
/*
1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。
*/
SELECT z.*,d.dname,d.loc
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z
WHERE z.deptno=d.deptno;
总结:中间有集合函数的内联查询就需要中间先查询出一张临时表
/*
2. 列出薪金比关羽高的所有员工。
*/
SELECT *
FROM emp
WHERE sal > ALL(SELECT sal FROM emp WHERE ename='关羽')
/*
总结:什么时候需要用到子查询 :
条件查询的时候 给出的条件不是直接能够查询出来的字段而是需要通过一次查询才可以获得的
3. 列出所有员工的姓名及其直接上级的姓名
*/
SELECT e.ename, m.ename
FROM emp e LEFT OUTER JOIN emp m ON e.mgr=m.empno mgr:表示直接上级的编号
总结:自己与自己相连:前提是:这张表有两个字段具有相似性 作用:要么获取表中同一字段 不同列的字段值 要么同一字段不同数据的比较
/*
4. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。
*/
SELECT e.empno, e.ename, d.dname
FROM emp e
INNER JOIN emp m ON e.mgr=m.empno
INNER JOIN dept d ON e.deptno=d.deptno
WHERE e.hiredate < m.hiredate;
总结: 三个表的连接 查询的字段涉及多个表
同时 自己连接自己
/*
5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
*/
SELECT d.dname,e.*
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno
/*
6. 列出所有文员的姓名及其部门名称,部门的人数。
*/
select e.ename, z.* from emp e,(select deptno, dname ,count(*) from dept group by dname) z
where e.deptno =z.deptno and e.job='文员'
/*
7. 列出最低薪金大于15000的各种工作及从事此工作的员工人数。
*/
SELECT job,COUNT(*)
FROM emp
GROUP BY job
HAVING MIN(sal)>15000 having 查询之后过滤 过滤函数 与 group by一起使用
注意:1.聚合函数做得到的结果作为字段值的时候 可以取一个时候名字
2,查询的字段名和字段名之间用,隔开
/*
8. 列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。
*/
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
SELECT ename dname
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
WHERE d.dname='销售部'
SELECT e.ename
FROM emp e
WHERE e.deptno = (SELECT deptno FROM dept WHERE dname='销售部');
/*
9. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级。
*/
SELECT * FROM salgrade
SELECT e.*, d.dname,m.ename,g.grade
FROM emp e
LEFT OUTER JOIN dept d ON e.deptno=d.deptno
LEFT OUTER JOIN emp m ON e.mgr=m.empno
LEFT OUTER JOIN salgrade g ON e.sal BETWEEN g.losal AND g.hisal
WHERE e.sal >(SELECT AVG(sal) FROM emp)
两个表之间没有互相对应的字段 但是有 e.sal BETWEEN g.losal AND g.hisal 也可以进行连接 牛逼啊
/*
10.列出与庞统从事相同工作的所有员工及部门名称。
*/
SELECT e.*, d.dname
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
WHERE e.job = (SELECT job FROM emp e WHERE e.ename='庞统')
/*
11.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。
*/
SELECT e.ename,e.sal,d.dname
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
WHERE sal> ALL(SELECT sal FROM emp WHERE deptno=30)
/*
12.列出每个部门的员工数量、平均工资。
*/
SELECT d.dname,COUNT(*) con, AVG(sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY dname
总结:什么时候会用到子查询:
1.查询两张表的字段,带聚合的 :中间有集合函数的内联查询就需要中间先查询出一张临时表
2.条件查询的时候 给出的条件不是直接能够查询出来的字段而是需要通过一次查询才可以获得的
分页查询(查询多条记录往往需要先排序)
分页查询使用的是limit关键字进行查询。它后面有两个参数。第一个参数是起始的位置,第二个参数是每页需要显示的条目数。
主从表数据更新问题
当两张表没有建立任何关系的时候,那么可以随意删除其中任何一张表中的任何记录,但是一旦把两张表建立了关系(主外键约束)之后,一.那么不能删除主表中的数据(这些数据内容在从表中有关联关系的数据),只想执行删除(更新操作),那么就会出现下图中的错误。
要想删除主表中与从表有关联关系的数据,可以这么做:
- 解除主从表的约束关系
- 先删除从表中与主表有关系的数据,再删除主表中的数据。
二.但是都可以进行更新 一种是关系的更新一种是数据的更新。
三.另外,从表也不能添加主表中不存在的数据!
创建表的时候添加外键
create table user(
2 userId int primary key auto_increment,
3 userName varchar(40),
4 pid int,
5 foreign key(pid) references province(pId) (CONSTRAINT fk_emp
这个可以加在前面 这个可加可不加)
6 );
表已经创建好了之后再添加外键
alter table user add foreign key(pid) references province(pId);
关联之后的从表中的外键值一定和主表的主键值 一致 不可能不出现外键值有与主表中主键不一样的地方
常见问题
插入到数据库中的数据出现乱码问题:
step1、数据库要设置正确的字符集
create database jsd1406db
default character set utf8
step2、jdbc驱动要能够正确的编码和解码(java语言内存使用unicode编码)
插入数据时(编码),查询数据时(解码)
jdbc:mysql://localhost:3306/jsd1406db?useUnicode=true&characterEncoding=utf8
通知数据库如何编码
了解一下:
字符集转换的过程:character_client => connection => server/database=>character_result
如何防止插入的数据为中文但是查询出来确实英文的情况:
- character_set_client:你发送的数据必须与client指定的编码一致!!!服务器会使用该编码来解读客户端发送过来的数据;(插入的时候 修改数据的时候)
- character_set_results:响应的编码,即查询结果返回给客户端的编码。这说明客户端必须使用result指定的编码来解码;(查询数据的时候)
控制台的编码只能是GBK,而不能修改为UTF8,这就出现一个问题。客户端发送的数据是GBK,而character_set_client为UTF8,这就说明客户端数据到了服务器端后一定会出现乱码。既然不能修改控制台的编码,那么只能修改character_set_client为GBK了。
服务器发送给客户端的数据编码为character_set_result,它如果是UTF8,那么控制台使用GBK解码也一定会出现乱码。因为无法修改控制台编码,所以只能把character_set_result修改为GBK。
- 修改character_set_client变量:set character_set_client=gbk;
- 修改character_set_results变量:set character_set_results=gbk;
设置编码只对当前连接有效,这说明每次登录MySQL提示符后都要去修改这两个编码,但可以通过修改配置文件来处理这一问题:配置文件路径:D:\Program Files\MySQL\MySQL Server 5.1\ my.ini
Mysql 数据库的my.ini对数据库进行的基本的设置(编码,连接数,端口号)
同理Tomcat Oracle及其其他的一些文件也是如此