常用SQL语句大全
Sql语言分类
(1)DDL--数据库定义语言是用来定义数据库对象的。例如数据库、表、列等。关键字:create、
drop、alter 等
(2)DML--数据库数据操作语言用来对数据库中表的数据进行增删改。关键字:insert、delete、update 等
(3)DQL--数据库数据查询语言用来查询数据库中表的记录(数据)。关键字:select 等
(4)DCL--数据控制语言用来定义数据库的访问权限
DDL(Data Definition Language)数据定义语言
一、操作库
dbName:代表数据库名字 data数据 date日期 -- 创建库 create database dbName; -- 创建库是否存在,不存在则创建 create database if not exists dbName; -- 查看所有数据库 show databases; -- 查看某个数据库的定义信息 show create database dbName; -- 修改数据库字符信息 alter database dbName character set utf8; -- 删除数据库 drop database dbName;二、操作表
tableName: 代表表名 --example:创建表 create table tableName( id int, name varchar(32), age int , score double(4,1), birthday date, insert_time timestamp ); -- 查看表结构 desc 表名; -- 查看创建表的SQL语句 show create table 表名; -- 修改表名 alter table 表名 rename to 新的表名; -- 添加一列 alter table 表名 add 列名 数据类型; -- 删除列 alter table 表名 drop 列名; -- 删除表 drop table 表名; drop table if exists 表名 ;DML(Data Manipulation Language)数据操作语言
一、增加 insert into
values:值 -- 写全所有列名 insert into 表名(列名1,列名2,...,列名n) values (值1,值2,...,值n); -- 不写列名(所有列全部添加) insert into 表名 values (值1,值2,...值n); -- 插入部分数据 insert into 表名(列名1,列名2) values(值1,值2);二、删除 delete
-- 删除表中数据 delete from 表名 where 列名 = 值; -- 删除表中所有数据 delete from 表名; -- 删除表中所有数据(高效 先删除表,然后再创建一张一样的表。) truncate table 表名;三、修改 update
-- 不带条件的修改(会修改所有行) update 表名 set 列名 = 值; -- 带条件的修改 update 表名 set 列名 = 值 where 列名=值;DQL(Data Query Language)数据查询语言
主要介绍排序查询、聚合函数、模糊查询、分组查询、分页查询、内连接、外连接、子查询
一、基础关键字
BETWEEN...AND (在什么之间)和 IN( 集合) between ... and in
between...and (在什么之间)和 IN( 集合) --example: 查询年龄大于等于20 小于等于30 SELECT * FROM 表名 WHERE age >= 20 && age <=30; SELECT * FROM 表名 WHERE age >= 20 AND age <=30; SELECT * FROM 表名 WHERE age BETWEEN 20 AND 30; --example: 查询年龄22岁,18岁,25岁的信息 SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25 SELECT * FROM student WHERE age IN (22,18,25);is null(为null值) 与 like(模糊查询)、distinct(去除重复值)
--example: 查询字段名不为null SELECT * FROM 表名 WHERE 字段名 IS NOT NULL; _:单个任意字符 %:多个任意字符 -- 查询姓庞的有哪些? like SELECT * FROM 表名 WHERE NAME LIKE '庞%'; -- 查询姓名第二个字是鹏的人 SELECT * FROM 表名 WHERE NAME LIKE "_鹏%"; -- 查询姓名是3个字的人 SELECT * FROM 表名 WHERE NAME LIKE '___'; -- 查询姓名中包含鹏的人 SELECT * FROM 表名 WHERE NAME LIKE '%鹏%'; -- 关键词 DISTINCT 用于返回唯一不同的值。 -- 语法:SELECT DISTINCT 列名称 FROM 表名称 SELECT DISTINCT NAME FROM student ;二、排序查询 order by
语法:order by 子句
order by 排序字段1 排序方式1 , 排序字段2 排序方式2...;
注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。
-- 例子 SELECT * FROM 表名 ORDER BY 字段名; --默认升序(asc) SELECT * FROM 表名 ORDER BY 字段名 desc; --降序(desc)三、 聚合函数:将一列数据作为一个整体,进行纵向的计算。
1.count:计算个数 2.max:计算最大值 3.min:计算最小值 4.sum:计算和 5.avg:计算平均数四、 分组查询 group by
语法:group by 分组字段;
注意:分组之后查询的字段:分组字段、聚合函数
--example: 按照性别分组。分别查询男、女同学的平均分 SELECT sex , AVG(score) FROM 表名 GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 SELECT sex , AVG(score),COUNT(id) FROM 表名 GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组 SELECT sex , AVG(score),COUNT(id) FROM 表名 WHERE score> 70 GROUP BY sex; -- 按照性别分组。分别查询男、女同学的平均分,人数 要求:分数低于70分的人,不参与分组,分组之后。人数要大于2个人 SELECT sex , AVG(score),COUNT(id) FROM 表名 WHERE score> 70 GROUP BY sex HAVING COUNT(id) > 2; SELECT sex , AVG(score),COUNT(id) 人数 FROM 表名 WHERE score> 70 GROUP BY sex HAVING 人数 > 2;五、 分页查询
1.语法:limit 开始的索引,每页查询的条数;
2.公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
3. limit 是一个MySQL"方言"
-- 每页显示3条记录 SELECT * FROM 表名 LIMIT 0,3; -- 第1页 SELECT * FROM 表名 LIMIT 3,3; -- 第2页 SELECT * FROM 表名 LIMIT 6,3; -- 第3页六、内连接查询:
1. 从哪些表中查询数据
2.条件是什么
3. 查询哪些字段
1.隐式内连接:使用where条件消除无用数据
example: 因为想要的数据信息分在了两张表中存储,其中一张表的字段关联了另外一张表的字段,这是用于表示想要的记录通过这两个字段关联,当这两个字段的值相等的时候,能拿到想要的数据信息了 --example: emp(员工表) 部门表(dept) emp(员工表)的dept_id字段 关联了 部门表(dept)的id字段 -- 查询员工表的名称,性别。部门表的名称 SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`; SELECT t1.name, -- 员工表的姓名 t1.gender,-- 员工表的性别 t2.name -- 部门表的名称 FROM emp t1, dept t2 WHERE t1.`dept_id` = t2.`id`;2.显式内连接
inner: 内部的 join:参加 -- 语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件 -- 例如: SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;七、外连接查询
1.左外连接 -- 查询的是左表所有数据以及其交集部分。
-- 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件; -- 例子: -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;2.右外连接 -- 查询的是右表所有数据以及其交集部分。
-- 语法: select 字段列表 from 表1 right [outer] join 表2 on 条件; -- 例子: SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;八、子查询:查询中嵌套查询
-- 查询工资最高的员工信息 -- 1 查询最高的工资是多少? ------>为9000 SELECT MAX(salary) FROM emp; -- 2 查询员工信息,并且工资等于9000的 SELECT * FROM emp WHERE emp.`salary` = 9000; -- 一条sql就完成这个操作。这就是子查询 SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);1.子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
-- 查询员工工资小于平均工资的人 SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);2. 子查询的结果是多行单列的:
子查询可以作为条件,使用运算符in来判断
-- 查询'财务部'和'市场部'所有的员工信息 SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部'; SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2; -- 子查询 SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');3. 子查询的结果是多行多列的:
子查询可以作为一张虚拟表参与查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息 -- 子查询 SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id; -- 普通内连接 SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'DCL(Data Control Language)数据控制语言
管理用户
添加用户
语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';删除用户
语法:DROP USER '用户名'@'主机名';权限管理
查询权限
-- 查询权限 SHOW GRANTS FOR '用户名'@'主机名'; SHOW GRANTS FOR 'lisi'@'%';授予权限
-- 授予权限 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; -- 给张三用户授予所有权限,在任意数据库任意表上 GRANT ALL ON *.* TO 'zhangsan'@'localhost';撤销权限
-- 撤销权限: revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';SQL之全外连接
全外连接是能够从这样两张内容不一致的表里,获取全部的信息。
例如有两张表class-A和class-B,想得到C的结果。
class-A
class-B
C
SQL如下: coalesce:合并;联合;结合
SELECT COALESCE(A.id, B.id) AS id, A.name AS A_name, B.name AS B_name FROM Class_A A FULL OUTER JOIN Class_B B ON A.id = B.idCOALESCE(coalesce) 是SQL 的标准函数,可以接受多个参数,功能是返回第一个非NULL 的参数。
sql全外连接语法:表名1 full outer join 表名2 on 表名1.某字段 = 表名2.某字段
隐性连接 与 内连接 的关系
SQL多表连接查询
多表连接
表间连接可分为:左连接、右连接、全外连接。
1、左连接 left join 或 left outer join
SQL语句: select * from 表1 left join 表2 on 表1.条件字段=表2.条件字段
左外连接包括left join左表所有行。假设左表中某行在右表没有匹配,则结果中相应行右表的部分所有为空(NULL),
2、右连接 right join 或 right outer join
SQL语句:select * from 表1 right join 表2 on 表1.条件字段=表2.条件字段
右外连接包括right join右表所有行,假设左表中某行在右表没有匹配,则结果中相应左表的部分所有为空(NULL)。
3、全然外连接 full join 或 full outer join
SQL语句:select * from 表1 full join 表2 on 表1.条件字段=表2.条件字段
全外连接包括full join左右两表中所有的行,假设右表中某行在左表中没有匹配,则结果中相应行右表的部分所有为空(NULL),假设左表中某行在右表中没有匹配,则结果中相应行左表的部分所有为空(NULL)。
4、内连接 join 或 inner join
SQL语句:select * from 表1 inner join 表2 on 表1.条件字段=表2.条件字段(显示内连接)
相当于:select * from 表1,表2 where 表1.条件字段=表2.条件字段(隐式内连接)
5、交叉连接 cross join
没有 WHERE 子句的交叉连接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
SQL语句:select * from 表1 cross join 表2
假设我们在此时给这条SQL加上WHERE子句的时候比方SQL:select * from 表1 cross join 表2 where 表1.条件字段=表2.条件字段,此时将返回符合条件的结果集。
MySQL练习-多表查询
多表查询练习需要的SQL
create table dept( id int auto_increment comment 'ID' primary key, name varchar(50) not null comment '部门名称' )comment '部门表'; create table emp( id int auto_increment comment 'ID' primary key, name varchar(50) not null comment '姓名', age int comment '年龄', job varchar(20) comment '职位', salary int comment '薪资', entrydate date comment '入职时间', managerid int comment '直属领导ID', dept_id int comment '部门ID' )comment '员工表'; alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id); INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办'), (6, '人事部'); INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id) VALUES (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5), (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1), (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1), (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1), (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1), (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1), (7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3), (8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3), (9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3), (10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2), (11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2), (12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2), (13, '方东白', 19, '职员',5500, '2009-02-12', 10,2), (14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4), (15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4), (16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4), (17, '陈友谅', 42, null,2000, '2011-10-12', 1,null); create table salgrade( grade int, losal int, hisal int ) comment '薪资等级表'; insert into salgrade values (1,0,3000); insert into salgrade values (2,3001,5000); insert into salgrade values (3,5001,8000); insert into salgrade values (4,8001,10000); insert into salgrade values (5,10001,15000); insert into salgrade values (6,15001,20000); insert into salgrade values (7,20001,25000); insert into salgrade values (8,25001,30000); create table student( id int auto_increment primary key comment '主键ID', name varchar(10) comment '姓名', no varchar(10) comment '学号' ) comment '学生表'; insert into student values (null, '黛绮丝', '2000100101'),(null, '谢逊', '2000100102'),(null, '殷天正', '2000100103'),(null, '韦一笑', '2000100104'); create table course( id int auto_increment primary key comment '主键ID', name varchar(10) comment '课程名称' ) comment '课程表'; insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') , (null, 'Hadoop'); create table student_course( id int auto_increment comment '主键' primary key, studentid int not null comment '学生ID', courseid int not null comment '课程ID', constraint fk_courseid foreign key (courseid) references course (id), constraint fk_studentid foreign key (studentid) references student (id) )comment '学生课程中间表'; insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);题目:
1.查询员工的姓名、年龄、职位、部门信息。
select e.name, e.age, e.job, d.name from emp e join dept d on e.dept_id = d.id;
2.查询年龄小于30岁的员工姓名、年龄、职位、部门信息。
select e.name, e.age, e.job, d.name from emp e join dept d on e.dept_id = d.id
where e.age < 30;
3.查询拥有员工的部门ID、部门名称。可能会出现重复情况,所以要使用distinct
select distinct d.id, d.name from dept d join emp e on d.id = e.dept_id where e.dept_id = d.id;
4.查询所有年龄大于40岁的员工,及其归属的部门名称;如果员工没有分配部门,也需要展示。没用分配部门也要展示,就是要保持员工表不变,使用左连接
select e.*, d.name from emp e left join dept d on e.dept_id = d.id
where e.age > 40;
5.查询所有员工的工资等级
select e.name, s.grade from emp e, salgrade s
where e.salary between s.losal and s.hisal;
6.查询"研发部"员工的平均工资
select avg(e.salary) from emp e, dept d
where e.dept_id = d.id and d.name = '研发部';
7.查询工资比"灭绝"高的员工信息
select * from emp
where salary > (select salary from emp where name = '灭绝');
8.查询比平均薪资高的员工信息
select * from emp
where salary > (select avg(salary) from emp);
9.查询低于本部门平均工资的员工信息
select * from emp
where salary < (select avg(e.salary) from emp e, dept d where e.dept_id = d.id);
10.查询所有的部门信息,并统计部门的员工人数
select d.*, (select count(*) from emp where dept_id = d.id) as '人数' from dept d;
11.查询所有学生的选课情况,展示出学生名称,学号,课程名称。
select s.name, s.no, c.name from student s, course c, student_course sc
where s.id = sc.studentid and c.id = sc.courseid;