mysql库的操作
show databases//查看所有数据库
information_schema
mysql
performance_schema//这三个库不能随便删
create database mydbl(数据库的名)//创建数据库
show create database mydb1//查看mydb1的创建方式
//创建mydb2库,指定字符集为gbk; 两种写法
create database mydb2 character set gbk;
create database mydb2 charset gbk;
//修改mydb1的字符集为utf8
alter database mydb1 character set utf8;
//要求对输入数据进行检查,要求为utf8格式
create database mydb3 character set utf8 collate utf8_general_ci;
//删除数据库mydb2
drop database mydb2
mysql表的操作
//创建表
//建表需要先选库 //两种写法
use mydb1;
create table tl(id int ,name varchar(30));
create table mydb1.tl(id int ,name varchar(30));
//增加一个字段
alter table tl add sal int;
也可以写成 alter table tl add column sal int;
//显示表
desc tl;
修改字段属性
alter table tl modify column name varchar(40);//column可加可不加
更改字段名字同时改类型
alter table tl change comm comm2 double;//将comm改为comm2 并且类型改了
//删除表字段
alter table tl drop column comm2;
//查看表是怎么创建的 创建方式
show create table tl;
显示
CREATE TABLE `tl` (
`id` int(11) DEFAULT NULL,
`name` varchar(40) DEFAULT NULL,
`sal` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
engine= InonoDB是默认引擎,高速模式,支持事务,默认情况下不开启。
表名大小写敏感 字段不区分大小写 库名大小写敏感
//重命名表 需要加table 关键字
rename table tl to t2;
//删除表 mysql 不支持回收站,直接删除,不能加purge
drop table t2;
mysql数据的操作
先创建一个表 然后往里面插数据
create table employee(id int ,name varchar(20),sex int,birthday date,salary double ,entry_date date,resume text);
插数据两种方式
insert into employee values(1,"叶井",1,'1983-04-27',15000,'2012-06-24','一个大牛');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(1,"傅红雷",1,'1984-02-22',10000,'2012-07-24','一个中牛');
查询表中的数据
select * from employee;
修改表中的数据
update employee set resume='一个小牛'where id=3;
删除表中的数据
delete from employee where name ='陆小佳';
mysql组函数相关
练习题
create table student(id int ,name varchar(20),chinese int ,english int ,math int);
-- insert into student(id,name,chinese,english,math) values(1,'黄真',80,85,90);
-- insert into student(id,name,chinese,english,math) values(2,'归辛树',90,95,95);
-- insert into student(id,name,chinese,english,math) values(3,'李寻欢',80,96,96);
-- insert into student(id,name,chinese,english,math) values(4,'叶芽',81,97,85);
-- insert into student(id,name,chinese,english,math) values(5,'袁承志',85,84,90);
-- insert into student(id,name,chinese,english,math) values(6,'何红药',92,85,87);
-- insert into student(id,name,chinese,english,math) values(7,'何铁手',75,81,80);
-- insert into student(id,name,chinese,english,math) values(8,'夏雪宜',77,80,79);
-- insert into student(id,name,chinese,english,math) values(9,'任我行',95,85,85);
-- insert into student(id,name,chinese,english,math) values(10,'岳不群',94,85,84);
-- alter table student add class_id int;
--修改表中的数据
--比如把id号小于5的class_id 改成1
update student set class_id=1 where id<=5;
或者update student set class_id=ceil(id/5);//ceil取整函数;
--求各班平均成绩
select avg(english),class_id from student group by class_id; //avg求平均,group by 以什么为分组
--求各班总成绩
select sum(chinese+math+english),class_id from student group by class_id;
--求总成绩大于1300的班级
select sum(chinese+math+english),class_id from student group by class_id having sum(chinese+math+english)>1300;
mysql日期函数_数字函数_字符函数
select 3+5*20 from dual;//dual 确实是一张表.是一张只有一个字段,一行记录的表.
2.习惯上,我们称之为'伪表'.因为他不存储主题数据.
3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.
--查看当前时间
select now() from dual;
函数原型 DATE_ADD(date2,INTERVAL d_value d_type)在date2中加上日期或时间
DATE_SUB(date2,INTERVAL d_value d_type)在date2上减去一个时间
昨天 今天 明天
select date_add(now(),interval -1 day),now(),date_add(now(),interval 1 day)from dual;
ADDTIME(date2,time_interval) 将time_interval加到date2
加一分钟
select addtime(now(),'0:1:0'),now()from dual;
字符串相关函数
select concat('hello','mysql','haha','hehe')from dual;//concat将字符串连接起来
utf字符串,汉子占3个字节
select length('hello中国') from dual;
数字相关函数
CONV(number 2,from_base,to_base);进制转换
select conv(10,10,2),conv(10,10,16)from dual;
mysql转换函数
在mysql中没有to_date函数,进行日期转换需要使用date_format()来代替。
select date_format('1982-11-17','%Y-%m-%d')from dual;//%Y大写的Y是四位1982 %y小写的是两位82 %m是两位比如07 %c是一位比如7
字符串转日期
select str_to_date('2013-6-04 05:14:15' , '%Y-%c-%d %h:%i:%s') from dual;
select addtime(str_to_date('2013-6-04 05:14:15' , '%Y-%c-%d %h:%i:%s'),'0:1:0') from dual;
mysql多表查询
练习题
create database if not exists scott character set utf8;//if not exists防止出错的 如果存在就不创建不存在就创建
use scott;
create table bonus//创建bonus表
(
ename VARCHAR(10),
job VARCHAR(9),
sal int,
comm int
);
create table dept//创建dept表
(
deptno int not null,
dname VARCHAR(14),
loc VARCHAR(13)
);
alter table dept add constraint PK_DEPT primary key (deptno);修改表时添加主键 ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字
create table emp//创建emp表
(
empno int not null,
ename VARCHAR(10),
job VARCHAR(9),
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
);
alter table emp add constraint PK_EMP primary key (empno);//添加主键
alter table emp add constraint FK_DEPTNO foreign key (deptno) references dept (deptno);//添加外键
create table salgrade//创建salgrade表
(
grade int,
losal int,
hisal int
);
insert into dept (deptno, dname, loc)//往dept表中插入数据
values (10, 'ACCOUNTING', 'NEW YORK'),
(20, 'RESEARCH', 'DALLAS'),
(30, 'SALES', 'CHICAGO'),
(40, 'OPERATIONS', 'BOSTON');
insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)//往emp表中插入数据
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20),
(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30),
(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30),
(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20),
(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30),
(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30),
(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10),
(7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20),
(7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10),
(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30),
(7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20),
(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30),
(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20),
(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
insert into salgrade (grade, losal, hisal)//往salgrade表中插入数据
values (1, 700, 1200),
(2, 1201, 1400),
(3, 1401, 2000),
(4, 2001, 3000),
(5, 3001, 9999);
显示:员工号,员工姓名,部门编号,部门名称
select e.empno,e.ename,e.deptno,d.dname from dept d,emp e where e.deptno=d.deptno;//多表查询
select e.empno,e.ename,e.deptno,d.dname from dept d inner join emp e on e.deptno=d.deptno;//sql99的标准 内连接写法
显示:员工号,姓名,薪水,薪水级别
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal>=s.losal
and e.sal<=s.hisal;
显示:部门编号,部门名称,人数
select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno=d.deptno
group by d.deptno,d.dname;//上述操作仍然缺少40部门 因为统计的人数没有
//sql99不支持(+)连接写法
select d.deptno,d.dname,count(e.empno)//这么写全 外连接
from emp e right outer join dept d//这个写right是看dept d在逗号右面//from dept d left outer join emp e
on e.deptno=d.deptno
group by d.deptno,d.dname;
//内连接 外连接 inner outer可以省略
显示xx'boss is xx
select concat(e.ename,'''s boss is',b.ename)//自连接
from emp e,emp b
where e.mqr=b.empno//上述结果会缺少最大的老板
select concat(e.ename,'''s boss is',b.ename)
from emp e left join emp b
on e.mqr=b.empno;//改完之后大老板那行显示NULL;
select concat(e.ename,'''s boss is',ifnull(b.ename,'his wife'))//ifnull 如果大老板的老板为空显示hiswife
from emp e left join emp b
on e.mqr=b.empno;
select * from emp order by sal ;按工资排序正着排 从小往大
select * from emp order by sal desc;倒序排 从大往小
select * from emp order by sal desc limit 3;//取工资前三名
select * from emp order by sal desc limit m,n;//m代表跳过的记录数,n代表取的记录数
select * from emp order by sal desc limit 4,4;//从第4个下一个也就是跳到第五个 然后再数四个 5到8名的工资