MySQL常用语法 以及 MySQL小工具

//MySQL的语法
/*数据类型
int
double 
decimal
char
varchar
text
blob  二进制类型 最大4G
date
time
timestamp 时间戳类型
*/
登录服务器
mysql -uroot -p123 -hlocalhost


退出
exit, quit


切换数据库
use databasename;


显示所有的数据库
show databases;


显示所有表
show tables;


DDL语句


查询表结构
desc tablename;


创建表
create table stu
(
number char(11),
name varchar(50),
age int,
gender varchar(10)
);


添加语句
insert into tablename (属性名....) values(属性值...);
或者
insert into tablename values(所有的属性值);


更新语句
update tablename set 属性名=属性值.... where 条件


删除数据
delete from tablename where 条件


DCL语句 用户的管理


创建用户,默认用root创建
create user 用户名@ip地址 identified by '密码';

create user zhangsan@localhost identified by '123';


给用户授权
grant 权限1,权限2.... on 数据库.* to 用户名@ip地址;

grant all on databasename.* to zhangsan@localhost;(给某个数据库的所有权限)
权限比如
create, update, delete, insert,drop,alter,grant create........


撤销权限(得是root用户)
revoke 权限1,权限2,权限3... on 数据库.* from 用户名@ip地址;
比如
revoke delete on databasename.* from zhangsan@localhost;


查看权限
show grants for 用户名@ip地址


删除用户
drop user 用户名@ip地址;


DQL语句(查询)


查询所有列
select * from 表名;


查询部分列
select 属性名1,属性名2,... from 表名;


去除重复行
select distinct 属性名1,属性名2,... from 表名;


列运算
select 属性名1*1.5 from 表名;
select 属性名1+属性名2 from 表名;


字符串做连续运算, concat()里面可以有多个属性
查询属性名1,前面加个'$'符号
select concat("$", 属性名1) from 表名


转换null值
如果属性是空的,则输出0
select ifnull(属性名, 0) from 表名


给列名起别名
select 属性名1 别名 from 表名


条件控制
用where子句
in
any
all
is null 不可以写成=null
or
and


模糊查询 like
_    匹配一个字符
%    匹配任意个字符
where 属性 like '张_'   查询以张开头的,而且是2个字的;
where 属性 like '张%'   查询所有姓张的
where 属性 like '%张%'  查询所有包含张的


排序
order by语句
order by 属性
order by 属性 asc 升序
order by 属性 desc 降序


可以多个属性排序
属性1升序, 在属性1升序的条件下属性2降序
order by 属性1 asc,属性2 desc;


聚合函数
count(*)  个数  (如果写成是count(1),结果是一样的)
sum(属性)  总和
max(属性)  最大
min(属性)  最小
avg(属性)  平均值


分组查询(按照某个属性分组,分组后,一般是显示跟分组有关的属性,以及聚合函数)
group by 属性
比如查询某个工作的员工数
select job, count(*) from emp group by job;


一般的执行顺序,其中having中只能是聚合函数,where中不能是聚合函数
select 
from 
where
group by
having
order by


分页查询(非常有用)
limit   (方言, 只有mysql有, sqlserver可以用top)
比如从第5行开始,查询3行.
select * from emp limit 4, 3;


查询某页pagecount个
page为当前页,pagecount是要显示几行
select * from emp limit (page-1)*pagecount, pagecount;


在CMD中操作时会遇到编码问题(但cmd中不能更改编码)


MySql的备份与还原


备份,把数据库备份到c盘的a.sql中
mysqldump -uroot -p123 数据库名>c:/a.sql


还原,需先创建数据库,然后再还原
create database 数据库名
mysql -uroot -p123 数据库名<c:/a.sql;


约束


主键约束 primary key
创建表时添加约束
number int primary key
或者
primary key(number)


修改表时添加
alter table emp
add primary key(number)


删除主键约束
alter table emp drop primary key


主键自增长(不能为字符串)
sid int primary key auto_increment


非空约束
not null


唯一约束
unique


外键约束 
constraint 约束名 foreign key(属性) reference 表名(属性)
比如dno引用dept的deptno
constraint fk_emp_dept foreign key(dno) reference dept(deptno)


合并结果集
union    去掉了重复行
union all    没有去掉重复行


比如
select * from emp1
union 
select * from emp2


连接
内连接 
inner join on
比如
标准select * from 表名1 别名1 inner join 表名2 别名2 on 条件
方言select * from 表名1 别名1,表名2 别名2 where 条件


自然连接(找同名同类型的)
select * from 表名1 别名1 natural join 表名2 别名2


外连接
左外连接
left outer join on
右外连接
right outer join on


全外连接
合并左右外连接
select * from 表名1 别名1 left outer join on 表名2 别名2 on 条件
union
select * from 表名1 别名1 right outer join on 表名2 别名2 on 条件


子查询
一般用于from,where中


练习
单表练习


1. 查询出部门编号为30的所有员工
select * from emp where deptno='30'


2. 所有销售员的姓名,编号,和部门编号
select name, empno, deptno from emp where job='销售员'


3. 找出奖金高于工资的员工
select * from emp where sal>comm


4. 奖金高于工资60%的员工
select * from emp where comm>sal*0.6


5. 部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料
select * from emp where (job='经理' and deptno='10') or (job='销售员' and deptno='20')


6. 部门编号为10中所有经理,部门编号为20中所有销售员,还有既不是经理又不是销售员但其工资大于或等于20000的所有员工的详细资料
select * from emp select * from emp where (job='经理' and deptno='10') or (job='销售员' and deptno='20') 
or (job not in('经理', '销售员') and sal>=20000)


7. 无奖金或奖金低于1000的员工
select * from emp where comm is null or comm<1000


8. 名字由3个字组成的员工
select * from emp where name like '___'


9. 2000年入职的员工
select * from emp where hiberanate like '2000-%'


10. 所有员工详细信息,用编号升序排序
select * from emp order by empno


11. 所有员工详细信息,工资降序排序,如果工资相同使用入职日期升序排序
select * from emp order by sal desc, hiberanate asc


12. 每个部门的平均工资
select deptno, avg(sal) 平均工资 from emp group by deptno


13. 每个部门的雇员数量
select deptno,count(*) 数量 from emp group by deptno


14. 每种工作的最高工资,最低工资, 人数
select job, max(sal) 最高工资, min(sal) 最低工资, count(*) 人数 from emp group by job




多表练习
1. 查出至少有一个员工的部门,显示部门编号,部门名称,部门位置,部门人数
select d.deptno, d.deptname, d.loc, e.num 部门人数
from dept d, (selet deptno,count(*) num from emp group by deptno) e
where d.deptno=e.deptno


2. 列出所有员工的姓名以及其直接上级的姓名
select e1.name,e2.name
from emp e1, emp e2
where e1.mgr=e2.empno


select e1.name,ifnull(e2.name, 'BOSS')
from emp e1 left outer join emp e2
where e1.mgr=e2.empno


3. 列出受雇日期早于直接上级的所有员工的编号,姓名,部门名称
select e1.empno, e1.name, d.deptname
from emp e1, emp e2, dept d
  where e1.mgr=e2.empno and e1.hiberanate>e2.hiberanate and d.deptno=e1.deptno


4. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
select *
from emp right outer join dept
on emp.deptno = dept.deptno


5. 列出最低薪金大于15000的各种工作及其从事此工作的员工的人数
select job, count(*) 人数
from emp
group by job
having min(sal) > 15000


6. 列出在销售部门工作的员工的姓名,假定不知道销售部的部门编号
select e.name
from emp e, dept d
where e.deptno=d.deptno and d.name='销售部'


7. 列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导,工资等级
select e.*, d.name, m.name, s.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 s on e.sal between s.losal and s.hisal
where e.sal>(select avg(sal) from emp)


8. 列出与庞统从事相同工作的所有员工及部门名称
select e.*, d.deptname
from emp e, dept d
where e.job=(select job from emp where name='庞统') and e.deptno = d.deptno


9. 列出薪金高于部门30工作的所有员工的薪金的员工姓名和薪金.部门名称
select e.name,e.sal,d.deptname
from emp e, dept d
where e.sal > all(select sal from emp where deptno='30') and e.deptno=d.deptno


或者
select e.name,e.sal,d.deptname
from emp e, dept d
where e.sal > (select max(sal) from emp where deptno='30') and e.deptno=d.deptno


10. 查出年份.利润,年度增长
select y1.year, ifnull(concat((y2.num-y1.num)/y1.num*100,'%'), '0%') 增长
from yea y1 left outer join yea y2
on y1.year=y2.year-1





猜你喜欢

转载自blog.csdn.net/qq_31281327/article/details/78554529