day-22 mysql_SQL 结构化查询语言

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;/按两列取值相同的分为一组/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值