MySQL數據庫的常用命令

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
  )
);

 

 


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章