一、DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
相关字段:create,drop,alter,use,show,database,table
操作对象:数据库和表的创建修改删除查看使用。
create database student_db; //创建数据库
create table student ( ); //创建表
drop database if exists student_db; //删除数据库
drop table if exists student; //删除表
alter table student add(... SEX varchar(20)) //添加列
alter table student modify SEX varchar(10)); //修改列的类型
alter table student change sex varchar(10)); //修改列名
alter table student drop sex; //删除列明
alter table student rename teacher; //修改表名
alter database test999 character set utf8; //修改数据库编码为utf-8(在MySQL里‘-’省掉)
常用类型:
- int:整型
- double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
- decimal:泛型型(浮点型),在表单钱方面使用该类型,因为不会出现精度缺失问题;
- char:固定长度字符串类型;长度默认255。
- varchar:可变长度字符串类型;(65535)
- text:字符串(文本)类型;
- blob:字节类型;
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss
- timestamp:时间戳类型;
二、DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
操作方式:添加,修改,删除;
操作对象:对表内;
(1).插入或添加 数据;
insert into student (字段1,字段2,...) values(' 数据1','数据2',...);
insert into student values(' 数据1','数据2',...);
注:所插入的数据与字段必须一一对应;
(2).修改数据;
UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件
update student set name='zhangsan',age=22,sex='男' where sdu_id=001;
(3).删除数据
delete from student where name='lisi';
truncate table stu;
注:
虽然TRUNCATE和DELETE都可以删除表的所有记录,但有原理不同。DELETE的效率没有TRUNCATE高!
TRUNCATE其实属于DDL语句,因为它是先DROP TABLE,再CREATE TABLE。而且TRUNCATE删除的记录是无法回滚的,但DELETE删除的记录是可以回滚的(回滚是事务的知识!)。
三、DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
四、DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
(1).简单查询
select *from student;
selstct*from student where ...
between...and... 在什么之间
in(20,30) 表示包括20,和30,而非区间;
is null /is not null表示空/非空
and 并 or 和
注:or条件要用一个括号括起来
select *from employee where (department_NO='D2019090001' and job='总经理') or( department_NO='D2019090011' and job='财务总监') or (job not in('总经理','销售总监') and employee.salary>=4000);
like 模糊查询 ,与'—'和'%'搭配使用,'—'表示任意一个字符,%表示n个字符
distinct 去重,若某个字段存在相同的记录,需要去重时
select distinct salary from student;
order by asc升序
order by desc 降序
group by 分组
having 过滤
count() 统计行(个数)
as 起别名
使用顺序:
select *from student where ... group by department order by salary asc having bonus >1000;
where>group by>order by>having
表
问题 :
- 查询出部门编号为D2019060011的所有员工
- 所有财务总监的姓名、编号和部门编号。
- 找出奖金高于工资的员工。
- 找出奖金高于工资40%的员工。
- 找出部门编号为D2019090011中所有财务总监,和部门编号为D2019060011中所有财务专员的详细资料。
- 找出部门编号为D2019090001中所有总经理,部门编号为D2019090011中所有财务总监,还有即不是总经理又不是销售总监但其工资大或等于4000的所有员工详细资料。
- 有奖金的工种。
- 无奖金或奖金低于1000的员工。
- 查询名字由两个字组成的员工。
- 查询2020年入职的员工。
- 查询所有员工详细信息,用编号升序排序。
- 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序。
- 查询每个部门的平均工资。
- 求出每个部门的雇员数量。
- 查询每种工作的最高工资、最低工资、人数.
- 列出最低薪金大于4000的各种工作及从事此工作的员工人数。
- 统计各部门工资总和,显示部门编号和该部门雇员的月工资的总和,并且要满足该部门雇员的月工资合计大于6000,输出结果按月工资的合计升序排列。
答案:
- 查询出部门编号为D2019060011的所有员工
select name from employee where department_NO='D2019060011';
2.所有财务总监的姓名、编号和部门编号。
select name,number,department_NO from employee where job='财务总监';
3.找出奖金高于工资的员工。
select name,salary,bonus from employee where employee.bonus>employee.salary;
4.找出奖金高于工资40%的员工。
select name,salary,bonus from employee where employee.bonus>employee.salary*0.4;
5.找出部门编号为D2019090011中所有财务总监,和部门编号为D2019060011中所有财务专员的详细资料。
select*from employee where department_NO='D2019090011' and job='财务总监' or department_NO='D2019060011' and job='财务专员';
6. 找出部门编号为D2019090001中所有总经理,部门编号为D2019090011中所有财务总监,还有即不是总经理又不是销售总监但其工资大或等于4000的所有员工详细资料。
select *from employee where (department_NO='D2019090001' and job='总经理') or( department_NO='D2019090011' and job='财务总监') or (job not in('总经理','销售总监') and employee.salary>=4000);
7.有奖金的工种。
select job,bonus from employee where employee.bonus is not null;
8.无奖金或奖金低于1000的员工。
select name ,bonus from employee where employee.bonus is null or employee.bonus<1000;
9.查询名字由两个字组成的员工。
select name from employee where employee.name like '__';
10.查询2020年入职的员工。
select name ,hire_date from employee where employee.hire_date like '2020%';
11.查询所有员工详细信息,用编号升序排序。
select*from employee order by employee.number asc ;
12. 查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序。
select *from employee order by employee.salary desc , employee.hire_date asc ;
13.查询每个部门的平均工资。
select department_NO, avg(salary) as '平均工资' from employee GROUP BY department_NO;
14.求出每个部门的雇员数量。
select department_NO,count(department_NO is not null ) as '部门人数总和' from employee GROUP BY department_NO;
15.查询每种工作的最高工资、最低工资、人数.
select job, max(salary),min(salary),count(*) from employee group by job;
16. 列出最低薪金大于4000的各种工作及从事此工作的员工人数。
select job,min(salary),count(*) from employee group by job having min(salary)>4000;
17.统计各部门工资总和,显示部门编号和该部门雇员的月工资的总和,并且要满足该部门雇员的月工资合计大于6000,输出结果按月工资的合计升序排列。
select department_NO,sum(salary) from employee group by department_NO having sum(salary)>6000 order by salary asc;