create database mydb;//建立數據庫
use mydb;//使用數據庫
show databases;//顯示數據庫
drop database mydb;//刪除數據庫
use mydb;
set names gbk; //輸入中文前先輸入此句話,否則報錯Invalid default value for。。。。
create table student(
name char(20) not null,
age smallint default 0,
nomber varchar(15) not null unique,
enterdate date comment '入學日期',
gender varchar(2) default '男'
);
insert into student (name,age,nomber,enterdate,gender)
value('小明',20,'001','1993-01-14','男');
insert into student
value('小紅',18,'002','1995-12-20','女');
insert into student (name,nomber,enterdate)
value('小才','003','1995-12-20');
show tables;
show create table student;
desc student;
drop table student;
set names gbk;
create table student(
ID int primary key auto_increment comment '主鍵',//註釋字段
name char(20) not null,
age smallint default 0,
nomber varchar(15) not null unique,
enterdate date comment '入學日期',
gender varchar(2) default '男'
);
insert into student (ID,name,age,nomber,enterdate,gender)
value(1,'小明',20,'001','1993-01-14','男');
insert into student
value(2,'小紅',18,'002','1995-12-20','女');
insert into student (name,age,nomber,enterdate,gender)
value('小明',20,'001','1993-01-14','男');
insert into student
value(null,'小紅',18,'002','1995-12-20','女');
desc student;
select * from student;
修改表數據
update student set age=21,enterdate='1992-10-01' where ID=1;
刪除表數據
delete from student;
delete from student where ID=2;
數據庫查詢
select ename,sal from emp;
select ename name,sal*12 income from emp; //起別名
select ename,sal+comm from emp; // null與任何運算或比較都爲null
select ename,sal+ifnull(comm,0) from emp;
select distinct job from emp; //去重
導入以下表
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50027
Source Host : localhost:3306
Source Database : scott_db
Target Server Type : MYSQL
Target Server Version : 50027
File Encoding : 65001
Date: 2013-08-14 10:25:49
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `bonus`
-- ----------------------------
DROP TABLE IF EXISTS `bonus`;
CREATE TABLE `bonus` (
`ENAME` varchar(10) default NULL,
`JOB` varchar(9) default NULL,
`SAL` double default NULL,
`COMM` double default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of bonus
-- ----------------------------
-- ----------------------------
-- Table structure for `dept`
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`DEPTNO` int(11) NOT NULL default '0',
`DNAME` varchar(14) default NULL,
`LOC` varchar(13) default NULL,
PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dept
-- ----------------------------
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');
-- ----------------------------
-- Table structure for `emp`
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`EMPNO` int(11) NOT NULL default '0',
`ENAME` varchar(10) default NULL,
`JOB` varchar(9) default NULL,
`MGR` int(11) default NULL,
`HIREDATE` date default NULL,
`SAL` double default NULL,
`COMM` double default NULL,
`DEPTNO` int(11) default NULL,
PRIMARY KEY (`EMPNO`),
KEY `FK_DEPTNO` (`DEPTNO`),
CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,str_to_date('17-12-1980','%d-%m-%Y'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,str_to_date('20-2-1981','%d-%m-%Y'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,str_to_date('22-2-1981','%d-%m-%Y'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,str_to_date('2-4-1981','%d-%m-%Y'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,str_to_date('28-9-1981','%d-%m-%Y'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,str_to_date('1-5-1981','%d-%m-%Y'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,str_to_date('9-6-1981','%d-%m-%Y'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,str_to_date('13-7-1987','%d-%m-%Y'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,str_to_date('17-11-1981','%d-%m-%Y'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,str_to_date('8-9-1981','%d-%m-%Y'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,str_to_date('13-7-1987', '%d-%m-%Y'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,str_to_date('3-12-1981','%d-%m-%Y'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,str_to_date('3-12-1981','%d-%m-%Y'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,str_to_date('23-1-1982','%d-%m-%Y'),1300,NULL,10);
-- ----------------------------
-- Table structure for `salgrade`
-- ----------------------------
DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
`GRADE` int(11) default NULL,
`LOSAL` double default NULL,
`HISAL` double default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of salgrade
-- ----------------------------
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');
練習
練習:求每個員工的年總收入(包含提成)
select ename,(sal+ifnull(comm,0))*12 from emp;
where查詢
select ename,sal from emp where sal>1500;
select ename,hiredate from emp where hiredate<='1983-01-01';
select deptno,ename from emp where deptno!=30;
select ename,sal from emp where sal>=1500 and sal<=2000;
select ename,sal from emp where sal between 1500 and 2000;
select deptno,ename from emp where deptno=20 or deptno=30;
練習:
1 查詢部門爲20且工資大於1200的員工
2 查詢工資大於1500或者入職日期早於 23-JAN-82 的員工
select ename,deptno,sal from emp where deptno=20 and sal>1200;
select ename,sal,hiredate from emp where sal>1500 or hiredate<'1982-01-23';
select ename,comm from emp where comm!=null;
select ename,comm from emp where comm is not null;
select ename,mgr from emp where mgr is null;
模糊查詢
- : 代表1個任意字符
% : 代表0到多個任意字符
select ename from emp where ename like 'sm%';
select ename from emp where ename like '%m%';
select ename from emp where ename like '_a%';
select ename from emp where ename like '%a%' and ename like '%e%' ;
select ename from emp where ename like '%r';
between and 練習
select ename,(sal+ifnull(comm,0))*12 from emp where(sal+ifnull(comm,0))*12 between 5000 and 15000;
select ename,hiredate from emp where hiredate not between '1981-02-22'and '1981-06-09';
in 查詢
(頻率出來高的放在前面)
select empno from emp where empno in(7900,7902,7908,7566);
order by排序
select ename,sal from emp order by sal asc;
select ename,sal from emp order by sal desc;
select ename,sal from emp order by sal desc,ename;
練習:
找出所有有提成的員工,列出名字、工資、提成
,顯示結果按工資從小到大,提成從大到小
select ename,sal,comm from emp where comm is not null
order by sal,comm desc;
lower :轉成小寫
- upper : 轉成大寫
- concat:連接多個字符串
- length :求字符串長度
- replace: 替換字符串中指定的字符
- substr :截取子串,下標從1開始算起,可以是負數,表示從後面開數
select lower(ename) from emp;
select ename from emp where upper(ename)='SMITH';
select upper('hello');
select now();
select 15*15+100;
select concat(ename,'=',sal) from emp;
select ename, length(ename) from emp;
char - 定長字符串,不夠就補空格,直到補夠
varchar - 可變長字符串,是多少就是多少
select ename,replace(ename,'A','#') from emp;
select ename,substr(ename,2) from emp;
select ename,substr(ename,2,3) from emp;
練習:
找出名字中含有A和E的員工,將他們的名字按首字母大寫,其它小寫,並且降序列出
select ename, concat(upper(substr(ename,1,1)),
lower(substr(ename,2))) en
from emp where ename like '%a%' and ename like '%e%'
order by ename desc;
round() -四捨五入
floor() - 函數只返回整數部分,小數部分捨棄,下舍入
ceiling() - 函數只返回整數部分,小數部分捨棄,上舍入
select round(45.932,2);
select round(45.932,0);
select round(45.932,-1);
select floor(-45.932);
select ceiling(45.9);
now() - 當前系統時間
week(日期) - 取得某個時間點的在一年中是哪一週
month(日期) - 取得傳入的日期屬於哪個月
day(日期) - 取得傳入的日期屬於一個月中的哪一天
date_add(now(),interval 1 day); -在某個日期上加上相應的數量,可以負數
datediff(日期1,日期2):求2個日期之間的天數
str_to_date():字符串轉日期
date_format(): 將日期類型格式化成指定格式的字符串顯示
select week(now());
select month();
select dayofyear(now());
select date_add(now(),interval 15 day);
select date_add(now(),interval -1 year);
select datediff(now(),'2016-01-01');
select str_to_date('2016年2月15日','%Y年%m月%d日');
select date_format('2016-02-15','%Y年%m月%d日');
select ename,date_format(hiredate,'%Y年%m月%d日') from emp;
所有的組函數會自動忽略空值記錄
select avg(sal) from emp;
select avg(comm) from emp;
select avg(ifnull(comm,0)) from emp;
select count(*) from emp;
select count(comm) from emp where comm is not null; //有風險,除非都不爲空
select max(sal) from emp;
select sum(sal) from emp;
練習:
1 求30號部門最高的工資,最低的工資,工資的平均值
2 求員工一共分佈在幾個部門
select max(sal),min(sal),avg(sal) from emp where deptno=30;
select count(distinct deptno) from emp;
分組查詢
1 單個字段分組
求各個部門的工資總和
select deptno, sum(sal) from emp group by deptno;
2 多個字段一起分組,一定是多個字段全部相同才認爲是一組
求各個部門,各種職位的平均工資
select deptno,job,avg(sal) from emp group by deptno,job;
3 對分組的結果進行過濾(having)
where是用來過濾非分組的結果,一般用於分組前進行過濾
求部門總人數大於4的部門
select deptno,count(*) from emp group by deptno having count(*)>4;
練習:
1、哪些部門工資高於1000的人數超過2人,列出部門編號 和相應工資。
2、平均工資大於1500的部門的人數
select sal,deptno,count(*) from emp where sal>1000 group by deptno having count(*)>2;
select deptno,avg(sal),count(*) from emp group by deptno having avg(sal)>1500;
多表連接查詢
等值
select ename,dname from dept,emp;
select ename,dname from dept,emp where emp.deptno=dept.deptno;
select ename,dname from dept d,emp e where e.deptno=d.deptno and upper(ename)='smith';
非等值
select ename,sal,grade from emp e,salgrade sg where e.sal
between sg.losal and sg.hisal;
select ename,sal,grade from emp,salgrade
where sal between losal and hisal order by sal;
練習:
查詢工資是第三等級的員工姓名和所在部門名稱。
select ename,dname,sal,grade from emp,dept,salgrade where salgrade.grade=3
and sal between losal and hisal and emp.deptno=dept.deptno;
查詢工資是第四等級的員工人數
select count(*),grade from emp,salgrade where salgrade.grade=4
and sal between losal and hisal;
自連接
select e.ename, e.mgr, m.ename, m.empno from emp e,emp m where e.mgr = m.empno;
1 左外連接 left join
ps:會在右表模擬空記錄匹配
select e.ename, e.mgr, m.ename, m.empno
from emp e left join emp m on e.mgr = m.empno;
2 右外連接 (right join)
ps:在左表補空
需求:查詢員工和員工工作的部門,包括沒有員工的部門也要查出
select e.ename, d.dname from emp e right join dept d on e.deptno = d.deptno;
子查詢
select ename,job from emp where job in(select job from emp where ename='smith')
and ename!='smith';
練習:
找出與20號部門員工幹相同工作的其它部門的員工
select distinct job from emp where deptno=20;
select * from emp where deptno!=20 and job in (select distinct job from emp where deptno=20);
練習:
找出最高工資的員工是誰?
select ename,sal from emp where sal=(select max(sal) from emp);
哪些部門的人數比20號部門的人數多。
select deptno,count(*) from emp group by deptno
having count(*)>(select count(*) from emp where deptno=20);
哪些員工的工資,介於20和30部門平均工資之間。
select ename,sal from emp where sal between(select avg(sal) from emp where deptno=30)
and (select avg(sal) from emp where deptno=20);
哪些員工的工資,高於整個公司的平均工資,列出員工的名字和工資(降序)。
select ename,sal from emp where sal>(select avg(sal) from emp)
order by sal desc,ename desc;
是否有員工在同一個部門,而且工資相同,列出這樣的部門號和平均工資、人數.
select deptno,count(*),avg(sal) from emp
where deptno in(select deptno from emp group by deptno,sal having count(*)>=2)
group by deptno;
哪些員工的工資,高於他的領導,列出員工的名字。
select e.ename,e.sal,m.ename,m.sal from emp e,emp m where e.mgr = m.empno and e.sal>m.sal;
找出平均工資最高的部門,列出該部門的編號,名稱,所在位置。
select DEPTNO ,DNAME ,LOC from DEPT
where DEPTNO = (select DEPTNO from EMP group by DEPTNO
having avg(SAL) = (select max(avgsal) from (select avg(SAL) avgsal from EMP
group by DEPTNO
) TMP
)
);