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;