MySql操作

1.mysql常见数据类型

日期和时间数据类型:

类型 说明
date 3字节,日期,格式:2014-09-18
time 3字节,时间,格式:08:42:30
datetime 8字节,日期时间,格式:2014-09-18 08:42:30
timestamp 4字节,自动存储记录修改的时间
year 1字节,年份

数值数据类型:

类型 说明
tinyint 1字节,范围(-128~127)
smallint 2字节,范围(-32768~32767)
mediumint 3字节,范围(-8388608~8388607)
int 4字节,范围(-2147483648~2147483647)
bigint 8字节,范围(+-9.22*10的18次方)

浮点型:

类型 说明
float(m, d) 4字节,单精度浮点型,m总个数,d小数位
double(m, d) 8字节,双精度浮点型,m总个数,d小数位
decimal(m, d) decimal是存储为字符串的浮点数

字符串数据类型:

类型 说明
char(n) 固定长度,最多255个字符
varchar(n) 可变长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

参考自:http://blog.itpub.net/30089851/viewspace-2131189/

2.SQL语句简介

分类 属性
DDL(数据定义语言) create,alter,drop,declare
DML(数据操纵语言) select,delete,update,insert
DCL(数据控制语言) grant,revoke,commit,rollback

3.创建数据表

3.1创建数据库

create database xiaoyao;

3.2切换数据库

use xiaoyao;

3.3创建数据表

create table xiaoyao.xiaoyao_prod(
  id int auto_increment primary key,  //id值,无符号、非空、递增——唯一性,可做主键。
  name varchar(100),
  age  int,
  address varchar(100),
  create_time timestamp default current_timestamp, //设置默认列值
  create_user varchar(100),
  update_time timestamp default current_timestamp on update 
  current_timestamp,
  update_user  varchar(100)
)ENGINE=InnoDB,default charset=utf8;//设置表的存储引擎,一般常用InnoDB和MyISAM;InnoDB可靠,支持事务;MyISAM高效不支持全文检索,设置默认的编码,防止数据库中文乱码
说明创建的数据表 设置字段类型 以及字符集类型

3.4删除数据库

drop database xiaoyao;

3.5使用数据库

use database; #use xiaoyao;

3.6复制数据表

CREATE TABLE tb_name2 SELECT * FROM tb_name;
或者部分复制:
CREATE TABLE tb_name2 SELECT id,name FROM tb_name;

3.7创建临时表

CREATE TEMPORARY TABLE tb_name(这里和创建普通表一样);

3.8展示数据表

show tables;

3.9查看表的结构

DESCRIBE tb_name;  //desc  tablename;
也可以使用:
SHOW COLUMNS in tb_name;     //from也可以,show create table tablename

3.10删除数据表

DROP [ TEMPORARY ] TABLE [ IF EXISTS ] tb_name[ ,tb_name2.......];
实例:DROP TABLE IF EXISTS tb_name;

3.11表重命名

RENAME TABLE name_old TO name_new;
还可以使用:ALTER TABLE name_old RENAME name_new;

3.12修改表结构

ALTER TABLE tb_name ADD[CHANGE,RENAME,DROP] ...要更改的内容...
实例:
ALTER TABLE tb_name ADD COLUMN address varchar(80) NOT NULL;
ALTER TABLE tb_name DROP address;
ALTER TABLE tb_name CHANGE score score SMALLINT(4) NOT NULL;

4.数据操作

4.1插入数据

 如果需要插入个别字段,只需要写几个字段
 insert into xiaoyao.xiaoyao_prod(name,age) values('xiaoyao',18); --id为自增,可以不写

4.2更新数据

update xiaoyao.xiaoyao_prod set age=19,address='shanghai' where name ='xiaoyao'; --更新多个字段需要使用逗号隔开
update ruozedata_prod set address='shenzhen' where name ='xiaoyao' and age=19; --且
update ruozedata_prod set address='shenzhen' where name ='xiaoyao' or age=25; --或

4.2创建表 插入数据练习

--部门表
dept部门表(deptno部门编号/dname部门名称/loc地点)
create table dept (
   deptno numeric(2),
   dname varchar(14),
   loc varchar(13)
);
--插入数据
insert into dept values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept values (20, 'RESEARCH', 'DALLAS');
insert into dept values (30, 'SALES', 'CHICAGO');
insert into dept values (40, 'OPERATIONS', 'BOSTON');
--工资等级表
salgrade工资等级表(grade 等级/losal此等级的最低/hisal此等级的最高)
create table salgrade (
   grade numeric,
   losal numeric,
   hisal numeric
);
--插入数据
insert into salgrade values (1, 700, 1200);
insert into salgrade values (2, 1201, 1400);
insert into salgrade values (3, 1401, 2000);
insert into salgrade values (4, 2001, 3000);
insert into salgrade values (5, 3001, 9999);
--员工表
emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)
工资 = 薪金 + 佣金
create table emp (
   empno numeric(4) not null,
   ename varchar(10),
   job varchar(9),
   mgr numeric(4),
   hiredate datetime,
   sal numeric(7, 2),
   comm numeric(7, 2),
   deptno numeric(2)
);
--插入数据
 insert into emp values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
 insert into emp values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
 insert into emp values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
 insert into emp values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
 insert into emp values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
 insert into emp values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
 insert into emp values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
 insert into emp values (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000, null, 20);
 insert into emp values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
 insert into emp values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
 insert into emp values (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100, null, 20);
 insert into emp values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
 insert into emp values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
 insert into emp values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

4.3检索练习

4.3.1.大于、小于、等于、不等于

select * from emp where sal >3000;
select * from emp where sal <>5000;
select * from emp where sal =5000;

4.3.2模糊查询

select * from emp where ename like '%S%'; --S不知道什么位置
select * from emp where ename like 'S%';  --S开头
select * from emp where ename like '%S';  --S结尾
select * from emp where ename like '__o%';  --第3个字符为o的数据; 占位符_

4.3.3排序

select * from emp order by sal asc ;  --asc升序,默认为升序排序
select * from emp order by sal desc ; --desc降序
select * from emp order by deptno asc,sal desc ; --可以同时使用升降序,针对字段

4.3.4输出行数限制

  select * from emp limit 2;

4.3.4聚合

select deptno,sum(sal) as sumsal
from emp
group by deptno
-- group by 与having count联合使用 group by的字段与select中的字段一致(聚合函数除外)
having sum(sal)>10000;
-- having  对group by 进行过滤

4.3.5数量 最大值等

select count(*) from  emp ;
select max(sal) from  emp ;

4.3.6将函数组合使用

select deptno,job,sum(sal)
from emp
where job='SALESMAN'
group by deptno,job
having sum(sal) >3000
order by sum(sal) desc
limit 1
select
deptno,job,sal
from emp
where job='SALESMAN'
select
deptno,job,sum(sal)
from emp
where job='SALESMAN'
group by deptno,job

4.3.7字段不好识别,可是有别名 as

select name as ‘姓名’ from emp;

4.3.8join

left join:以左表数据为主且最全,右表匹配左表,匹配不到为null
select * from A
left join B
on A.aID = B.bID;
right join:以右表数据为主且最全,左表匹配右表,匹配不到为null
select * from A
right join B
on A.aID = B.bID;
inner join:两张表匹配的数据行才显示 等于关联表操作  
select * from A inner join B on A.aID = B.bID;
等同于
select * from A,B where A.aID = B.bID;

4.3.9删除数据

DELETE FROM tb_name WHERE id=3;

5.其他操作

5.1查看存储所称和函数

select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE'  --存储过程
select `name` from mysql.proc where db = 'your_db_name' and `type` = 'FUNCTION'  --函数
或者使用
show procedure status; --存储过程
show function status;    --函数
如果查看详细的内容:
show create procedure proc_name;
show create function func_name;
创建视图:
CREATE PROCEDURE pro(IN num INT,OUT total INT)
BEGIN
SELECT SUM(score) INTO total FROM tb_name WHERE id=num;
END;//这里的  IN (传递一个值给存储过程),OUT(从存储过程传出一个值),INOUT(对存储过程传入、传出),INTO(保存变量)
调用存储过程
call  pro(13,@total)
select @total; //查看看到结果

5.2查看视图

SELECT * from information_schema.VIEWS  --视图
SELECT * from information_schema.TABLES  --表
视图的作用:
a.简化表之间的联结(把联结写在select中);
b.重新格式化输出检索的数据(TRIM,CONCAT等函数);
c.过滤不想要的数据(select部分)
d.使用视图计算字段值,如汇总这样的值。

5.3查看触发器

方法一:
语法:SHOW TRIGGERS [FROM db_name] [LIKE expr]
实例:SHOW TRIGGERS\G     //触发器
方法二:
对INFORMATION_SCHEMA数据库中的TRIGGERS表查询
SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G

补充操作

1. 查询出部门编号为30的所有员工的编号和姓名

 select empno,ename from emp where deptno=30;

2.查询部门编号为10的所有经理和部门编号为20中所有销售员的详细资料

2.1找出部门标号为10的所有经理
select * from emp where deptno=10 and e.job='MANAGER';
2.2部门编号为20中所有销售人员
select * from emp where deptno=20 and e.job='SALES';
2.3合并
select * from emp
where (deptno=10 and e.job='MANAGER') or
(deptno=20 and e.job='SALES')

3.查询所有员工详细信息, 用工资降序排序,如果工资相同使用入职时间升序排序

3.1使用工资降序排序
select * from emp order by sal desc;
3.2入职时间升序排序
select * from emp order by hiredate;
3.3合并
select * from emp 
group by sal desc,hiredate;
--group by 默认是升序,可以不写,如果是降序,就必须要写
--可以使用 limit 显示多少行 offset 从那几行开始

4.列出最低工资大于1500的各种工作以及从事此工作的员工人数

4.1最低工资大于1500的各种工作
select emp.job from emp where sal>1500;
4.2各个工作的人数
select job,count(*) from emp group by job;
4.3合并
select emp.job,count(emp.job) from emp
group by emp.job having min(emp.sal)>1500;

5. 列出在销售部工作的员工的姓名,嘉定不知道销售部的部门编号。

5.1列出销售部工作的员工的编号
select  ename from emp where deptno=30;
5.2输出销售部的编号
select deptno from dept where dname='SALES';
5.3合并
select ename from emp
where emp.deptno=(
select deptno from dept
where dname='SALES');

6.查询姓名以S开头的\以S结尾\包含S字符\第二个字母为L

开头:select * from emp where ename like 'S%';
结尾:select * from emp where ename like '%S';
含有:select * from emp where ename like '%S%';
第二个字母:select * from emp where ename like '_L%';

7.查询每种工作的最高工资,最低工资,人数

7.1每种工作的最高工资
select job,max(sal) from emp group by job;
7.2每种工作的最低工资
select job,min(sal) from emp group by job;
7.3每种工作的任务
select job,count(*) from emp group by job;
7.4合并
select job,max(sal),mim(sal),count(*) from emp
group by job;

8.列出薪资高于公司平均水平的所有员工工号,姓名,所在部门,上级领导,工资,工资等级

8.1计算公司的平均工资
select avg(sal+ifnull(comm,0)) from emp;
8.2高于平均工资的员工工号,姓名,上级领导,工资
select empno,ename,mgr,sal from emp where (emp.sal+ifnull(common,0))>avg(emp.sal+ifnull(common,0));
8.3员工所在的部门
select dname  from dept,emp where deptno=emp.deptno; 
8.4工资等级
select grade from salgrade where emp.sal between salgrade.losal and salgrade.hisal;
8.5查找领导 自连接
select ename from emp as a left join emp as b on a.mgr=b.empno;
8.6合并
select empno,ename,dname,mgr,(emp.sal+ifnull(common,0)),grade
from emp as e
    left join dept on e.deptno=dept.deptno
    left join emp on e.mgr=emp.empno
    left join salgrade on e.sal between salgrade.losal and salgrade.hisal
where (e.sal+ifnull(common,0))>(select avg(sal+ifnull(common,0)) from emp);

9.列出薪资高于在部门30工作的所有员工的薪资的员工姓名和薪资、部门名称。

9.1部门30的最高工资
select max(sal+ifnull(common,0)) from emp where deptno=30;
9.2员工的名称,薪资,部门
select enam,sal,dname from dept,emp where emp.deptno=dept.deptno;
9.3合并
select ename,sal,dname from dept,emp
where  emp.deptno=dept.deptno and sal>(select max(sal) from emp where deptno=30);
或者
select ename,sal,dname from dept,emp
where  emp.deptno=dept.deptno and sal>all (select sal from emp where deptno=30);
如果是任意员工的话,可以使用下面的方式:
select ename,sal,dname from dept,emp
where  emp.deptno=dept.deptno and sal>any(select max(sal) from emp where deptno=30);
在上面的sql语句中,all表示,要比最大的大才可以,any(或者使用some)表示只要是大于其中一个员工工资就可以

10.union

union会将数据进行去重
union all 会获取重复的数据

如有疑问,可以参考http://www.runoob.com/mysql/mysql-tutorial.html

11.用户管理

11.1创建用户
CREATE USER name IDENTIFIED BY 'xiaoyao';
11.2修改密码
SET PASSWORD FOR name=PASSWORD('123456');
11.3权限管理
SHOW GRANTS FOR name;    //查看name用户权限
GRANT SELECT ON db_name.* TO name;    //给name用户db_name数据库的所有权限
REVOKE SELECT ON db_name.* TO name;    //GRANT的反操作,去除权限;

12.增加表达式

12.1Mysql支持REGEXP的正则表达式:

SELECT * FROM tb_name WHERE name REGEXP '^[A-D]'   //找出以A-D 为开头的name

12.2特殊字符需要转义。

13.MySQL的一些函数

13.1字符串链接——CONCAT()

SELECT CONCAT(name,'=>',score) FROM tb_name

13.2数学函数

AVG、SUM、MAX、MIN、COUNT;

13.3文本处理函数

TRIM、LOCATE、UPPER、LOWER、SUBSTRING

13.4运算符

+、-、*、\

13.5时间函数

DATE()、CURTIME()、DAY()、YEAR()、NOW().....

14.全文检索

请参考:https://www.cnblogs.com/tommy-huang/p/4483684.html

15.触发器

触发器是指在进行某项指定操作时,触发触发器内指定的操作;
15.1支持触发器的语句有DELETE、INSERT、UPDATE,其他均不支持
15.2创建触发器:
CREATE TRIGGER trig AFTER INSERT ON ORDERS FOR EACH ROW SELECT NEW.orser_name;
INSERT语句,触发语句,返回一个值
15.3删除触发器
DROP TRIGGER trig;

你可能感兴趣的:(MySql操作)