2018-8-18SQL 结构化查询语言 structured query language
sql 语句对于不同数据域库有微小差距
结构化查询语言 structured query language
1. DDL数据定义语言
create 创建表,视图、索引...
drop 删除表、视图、索引..
alter 修改
truncate 截断
2.DML数据操控语言(90%)
insert 插入数据
update修改
delete 删除
select 查询
3.DCL数据控制语言
grant 授权
revoke 回收权限
4. TCL 事务控制语言 transaction control
start transaction 开始事务(begin)
commit
rollback
结构化查询语言 (祥)
1.DDL
unique 唯一
not null 非空
primary key 主键 (只要有一个)
foreign key 外键 (需要引用另外一个表的主键或唯一列)
联合唯一约束
primary key (列名1,列名2) /组 (复)合主键/
2.1 alter 修改
desc +组名 显示表
给老师表加一组年龄
sql 2行
sql 2行
sql 2行
alter table teacher add age tinyint;
给老师表的姓名扩展长度
sql 2行
sql 2行
sql 2行
alter table teacher modify tname vatchar(30);
2.2truncate 截断
delete from 表; -- 如果和事务SQL结合使用,是有机会恢复
truncate table 表; --没法和事务sql结合,不能恢复,效率更高
3.1 insert 插入数据
insert into 表(多个列...)values (多个值...);
- 一次插入多行数据 MYSQL独有*
sql 2行
sql 2行
sql 2行
insert into 表(多个列...)values (多个值...),(多个值...),(多个值...)...;
用insert 插入另一张表的数据
sql 2行
sql 2行
sql 2行
insert into 表1(列1,列2...) select 列1 ,列2.. from 表2;
列的个数和类型要一致,标准的,所有的SQL都可以用
3.2 update对已有的数据进行更新
-- 更新所有的员工工资涨一百
sql 2行
sql 2行
sql 2行
update emp set sal=sal+100
--修改7369的员工部门为10号部门
sql 2行
sql 2行
sql 2行
update emp set deptno=10 where empno =7369;
--修改7000(并没有这个编号)的员工部门为10号部门
sql 2行
sql 2行
sql 2行
update emp set deptno=10 where empno =7369;
如果条件不满足,不会报错,但影响行数为0
主键列主要用于查询,一般不会更新。
3.3 删除
delete from 表;全部删除
delete from 表where 条件;删除符合条件的记录
不能删除一个被引用的父类列
为了方便称呼,主键所在的表可以称为主表,而外键所在的表称为从表
主表中删除的记录,如果被从表引用,那么会删除失败,违反外键约束(外键约束默认行为)
外键约束还有一种行为,主表中记录删除,从表中把与之相关的的记录也跟着删除(级联删除)
在创建外键时在后面加上on delete cascade
例如:
sql 2行
sql 2行
sql 2行
foreign key (deptno)references dept (deptno) on delete cascade
3.4 select 查询
select 列名..from 表名 where 条件;
条件
1.比较运算
=
大于 >
大于等于>=
小于<
<=
!=
2.逻辑运算
and(并且)
or (或者)
not(取反)
--
where sal >80 and deptno =20;
where deptno =20 or deptno =30;or 左右两边要写完整
3.null
数据库中的null,比较特殊,不能使用=来比较,必须用 is null
例如:
sql 3行
sql 3行
sql 3行
select * from emp where comm is null;
select * from emp where comm is not null; //非空
4.like (模糊查询)
例如:查询以“s”字母开头的员工(s%)
sql 2行
sql 2行
sql 2行
select * from emp where comm like 's%';
通配符% 表示匹配0~多个任意的字符
通配符 _ 表示匹配一个任意字符可以查询准确个数字符的值
5.between ... and ... 范围匹配(等价于 >= <=)
sql 2行
sql 2行
sql 2行
select *from emp where sal between 1000 and 2000;
*1.必须按由小到大的顺序写
2.between 包含等于条件
6. in求这一列是否在一个值列表中
例如:求所有的销售人员和经理
sql 4行
sql 4行
sql 4行
select * from emp where job ='SALEMAN' or 'MANAGER';
select * from emp where job in('SALEMAN' ,'MANAGER') ;
7.limit MySQL 特有的
用来限制返回的结果数
3行
3行
3行
1.limit n; n 表示最多返回几条记录
2.limit m,n; m代表偏移量(下标从0开始数)
8.order by 用来给结果排序
语法: order by 列名 asc|desc,列名asc|desc,...
如果不写asc|desc,默认是asc升序
多列排序,第一列取值相同的按照第二列进行排序
sql 2行
sql 2行
sql 2行
select from emp order by sal asc,enamesac;/*如果升序,两个asc都可以省略*/
9.select语句的顺序
sql 2行
sql 2行
sql 2行
select ...from 表 where 条件 order by 排序 limit 限制
3.5 函数
例如 lower函数可以把字符变成小写
upper函数可以把字符变成大写
常用的函数:
1)时间加减
sql 2行
sql 2行
sql 2行
>date_add(原始时间,时间间隔)
时间间隔的语法:interval 数字 时间单位
数字可以是 可以正数或负数
sql 2行
sql 2行
sql 2行
select date_add(now(),interval 1 day);
2)提取时间的某个部分
sql 4行
sql 4行
sql 4行
extract (时间部分 from 原始时间)
select extract(year from now());
select extract(year_month from now());
返回的结果是一个数字类型
3)类型转换
sql 3行
sql 3行
sql 3行
select cast ('11' as signed)+1;
select cast('12.55555' as decimal (5,2));
4)拼接字符串
sql 4行
sql 4行
sql 4行
concat(值1,值2,...值n)
select concat ('a','b','c');
select concat('a',18,'c');/*可以把其他的类型当做字符串的拼接*/
5)求长度的函数
char_length 按字符为单位统计长度
length 按字节为单位统计长度
utf8mb4编码下,汉子一个字符占三个字节,英文一个字符占一个字节
6)标准SQL
case
when 条件1 then 值1
when 条件2 then 值2
...
else 值n
end
整个case...end 最后返回一个值
sql 7行
sql 7行
sql 7行
select sal,
case
when sal>1000 then '高工资'
wen sal between 1000 and 2000 then '中等'
else '低工资'
end from emp;
7)组函数
最大值 max(列)
最小值 min(列)
和 sum(列);
个数 count(列)注意空值的问题 ,求个数时将空值排除在外 |count (*)针对这次查询看看一共有多少行
平均值 avg(列) 针对可以求平均值的列才能执行
8) 去除重复
distinct不是函数 就是关键字 加在列名前
sql 3行
sql 3行
sql 3行
>select distinct job from emp;/*去除重复后的职位有哪些*、
>select count (distinct ) from emp;/*有几种职位*/
9)查询帮助
? contents;
3.6 分组语句(group by 后的列取值相同的会被分到为一组)
select ...from 表 group by 列1,列2,..having分组条件
sql 3行
sql 3行
sql 3行
select depton,count(* ),max(sal) from emp group by deptno;
select depton,count(* ),max(sal) from emp group by deptno having count(* )>3;
分组后select,order by的限制
1)select中的列必须和 group by 中的列一致
2)其它没有包含在group by 语句中的列,必须和组函数一起用。
执行从先到后
where 进行一遍条件过滤,再执行group by 分组,再执行having中的条件,再执行select语句,再执行limit语句
语法顺序
sql 2行
sql 2行
sql 2行
select ... from... where...group by...having...order by...limit;
列的别名问题 使用时要注意执行顺序问题
语法:select 列名 别名可以中文但是不能加特殊字符,加双引号可以解决
语法2:select 列名 as 别名
select deptno 部门编号,count(* ) 人数,max (sal)最高工资 from emp group by deptno having count(* )>3 order by max(sal);
select deptno 部门编号,count(* ) 人数,max (sal)最高工资 from emp group by deptno having count(* )>3 order by 人数;
表别名问题 (没有as)
select e.* from emp e ;
语法:select...from 表 别名
多列分组
select deptno,job,count(* ) from emp group by deptno,job;/按两列取值相同的分为一组/