查看所有数据库: show databases; 打开指定库: use test; 查看当前库的所有表: show tables; 看其他库的所有表 show tables from mysql; 查看当前位置: select database(); 看表的结构: desc 表名字 查看表的所有索引 show index from 表名 查看数据库版本:select version(); 退出去之后,msaql --version
看数据: select * from sss; 插入数据: insert into sss (id,name) values(2,'rose'); 修改 update sss set name='llliiii' where id=1; 删除 delete form sss where id=1; 建表: creat table +表名字(列名 列类型,列名 列类型) 例:creat table sss(id int, name varchar(20));
格式 select 查询列表 from 表1 别名,表2 别名 where 表1.key = 表2.key 【and 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】 注意可以为表起别名,但是起别名之后原名不能在使用了. 两个表的顺序可以调换 可以加筛选 用and 可以加分组 可以加排序 可以多表连接 多表等值连接的结果为多表的交集 n个表连接,需要至少N-1个条件 多表的顺序无要求 可以搭配排序,分组,筛选使用
2.非等值连接
1 2 3 4 5 6 7 8
格式 select 查询列表 from 表1 别名,表2 别名 where 非等值连接条件 例如 between and 【and 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
3.自连接
1 2 3 4 5 6 7 8
格式 select 查询列表 from 表 别名1,表 别名2 同一个表 where 等值连接条件 一般是 【and 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
1 2 3 4
比如查询员工的上级,是根据员工的上级ID来匹配新的员工表,一张表当成两张用 select e.employee_id,e.last_name, m.employee_id,m.last_name from employees e , employees m where e.manager_id = m.employee_id
2.8.2 sql99语法
内连接、外连接(左外、右外、全外(mysql不支持))、交叉连接
1.内连接inner
1 2 3 4 5 6 7 8 9
inner(可以省略) 查询两表共有的 交集 格式 select 查询列表 from 表A 【inner】join 表2 on 连接条件 n个表连接,需要至少N-1个条件 【where 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
2.左外连接left
1 2 3 4 5 6 7 8
格式 查询的是A的内容,包括a和b的交集 select 查询列表 from 表A A是主表,从表不匹配显示Null left join 表B on 连接条件 a.key=b.key 【where 筛选条件】 要查询A但不含交集,where b.key is null 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
3.右外链接
1 2 3 4 5 6 7 8
格式 查询的是B的内容 select 查询列表 from 表A B是主表 right join 表B on 连接条件 a.key=b.key 【where 筛选条件】 要查询B但不含交集,where a.key is null 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
格式 查询的是A+B的内容 select 查询列表 from 表A full join 表B on 连接条件 a.key=b.key 【where 筛选条件】 要查询A+B但不含交集,where a.key/b.key is null 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
5.交叉连接
1 2 3 4 5 6 7
select 查询列表 from 表A cross join 表B 【where 筛选条件】 【group by 分组字段】 【having 分组后的筛选】 【order by 排序字段 】
in/not in 等于列表中的任意一个 any | some 和子查询返回的耨一个值比较 all 和子查询返回的所有值比较
例子
1 2 3 4 5 6 7 8 9 10 11 12
1.查询location_id在1400-1700 select distinct department_id from departments where location_id in(1400,1700); 2.查询员工姓名,要求部门号是1中列表某一个 select lase_name from employees where department_id in( select distinct department_id from departments where location_id in(1400,1700) );
2.行子查询,多个字段查询(结果是一行多列,或者多行多列)不常用
1 2 3 4 5 6 7 8
例子: 查询工资最少并且销售额最高的员工信息
select * from employees where (employee_id,salary)=( select min(employee_id),max(salary) from employees )
2.9.3子查询在select后面
仅仅支持标量子查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
例如,查询每个部门的员工个数 select d.*,( select count(*) from employee e where e.department_id = d.department_id ) 个数 from departments d;
也可以用左外连接 SELECT d.*,IF(e.`employee_id`,COUNT(d.department_id),0) FROM departments d LEFT JOIN employees e ON d.`department_id` = e.department_id GROUP BY d.department_id; 注意if对空的判断,该操作是先把有部门的员工取出来,然后根据主表来分组,在计数,这个时候,因为分组之后count的计数,实际是对主表的每个部门的计数,因为每个部门都有记录,所以即使有的部门没有员工,但是由于count的是部门id,主表中一定有记录,但是该部门没有员工,所以会记录成1. 我们需要在这时判断没有有员工,没有直接给他清0 为什么不能where,是因为where直接过滤掉了部门没有员工的
2.9.4 子查询在from后面
1 2 3 4 5 6 7 8 9 10 11 12 13 14
例如:查询每个部门的平均工资的工资等级 1.查询每个部门的平均工资 select avg(salary),department_id from employees group by department_id 2.连接1的结果和job_grades表,筛选条件平均工资between lowest_sal and highest_sal select ag_dep.*,g.grade_level from ( select avg(salary),department_id from employees group by department_id ) ag_dep /*注意必须起别名*/ inner join job_grades g on ag_dep.ag between lowest_sal and highest_sal;
2.9.5 exists后面(相关子查询)
1
select exists(完成的查询语句) 结果1/0 先执行著查询,到了位置执行子查询
2.10 分页查询
应用场景,对于显示数据,一页显示不全,需要分页提交sql请求
语法: 放在查询最后
1 2 3 4 5 6 7 8 9
select 查询列表 7 from 表 1 【jion type】 jion 表2 2 on 连接条件 3 【where 筛选条件】 4 group by 分组字段 5 having 分组后的筛选 6 order by 排序字段 8 limit【offset】, size; offset要显示条目的起始索引(从0索引开始) size显示条目个数
例如
1 2
显示前5条信息 select * from employees limit 0,5 0可以省略
分页公式
1
linit (page-1)*size,size page 要分的页数, size 每页的条数
2.11 联合查询 union
应用场景:查询的结果来自多个表,但是多个表没有联系,而需要查询的信息是一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
语法: 查询语句1 union 查询语句2 union ..... select select * from employees where email like '%a%' or department_id>90 ==== select * from employees where email like '%a%' union from employees where department_id>90 1.将查询条件拆分出来,其查询目的都是一样,就是把筛选条件分开了 2.将不同表查询目的一样的联合起来,其表名和第一个表一致
注意: 1.联合查询中多个联合的列数要一致 2.union关键联合多个表时,会自动将一样的去重,如果不想去重,使用 union all 3.查询的字段名,默认是第一个列的名字
三、DML语言
数据操作语言DML
1 2 3
插入 insert 修改 update 删除 delete
3.1 插入语句 insert
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
方式一: insert into 表名(列名,...)values(值1,...); 1.插入的值的类型要与列的类型一致或兼容 2.不可以为null的列必须插入值,可以为null的值,可以不写列明插入 3.列的顺序可以调换 4.列数和值的个数必须一致 5.可以省略列明,默认是所有的列,都需要有值
方式二: insert into 表明 set 列名=值,列名=值....
方式一可以插入多行,方式二不支持 方式一支持子查询,方式二不支持 可以把查询结果当插入值
3.2修改语句 update
1.修改单表的记录
1 2 3 4
语法 update 表名1 别名 set 列=新值,列=新值,.... where 筛选条件
2.修改多表的记录
92语法
1 2 3 4
update 表1 别名,表2 别名 set 列=值,.... where 连接条件 and 筛选条件
==99语法==
1 2 3 4 5
update 表1 别名 inner|left|right join 表2 别名 on 连接条件 set 列=值,... where 筛选条件
例子
1 2 3 4 5
修改张无忌女朋友的手机号为114 update boys bo innner join beauty b on bo.id = b.boyfriend_id set b.phone = 114 where bo.boyName = '张无忌'
例如: creat table tab_set( c1 set('a','b','c') ) insert into tab_set values('a'); insert into tab_set values('a','b'); insert into tab_set values('a','b','c');
4.3.5 日期型
1 2 3 4 5 6 7 8 9 10
字节 最小值 date 4 1000-01-01 datetime 8 1000-01-01 00:00:00 timestamp 4 19700101080001 2038年 time 3 -838:59:59 year 1 1901 show variables like 'time_zone' 显示时区
create table stuinfo( id int primary key , #主键 stuName vachar(20) not null, 非空 gender char(1) check(gender = '男' or gender = '女'), #检查 seat int unique, 唯一 age int default 18, 默认约束 majorId int references major(id) 外键 注意不能加foreign key , sql8.0也不支持references ) creat table major( id int primary key, majorName varchar(20) )
create table if not exists stuinfo( id int primary key, 主键 stuname varchar(20) not null, 非空 gender char(1), seat int unique, 唯一 age int default 18, 默认 majorid int, constraint ck_stuinfo_major foreign key (majorid) references major(id) ) 可以一下设置多个 stuname varchar(20) not null unique, 非空 唯一
1.添加列级约束 alter table 表名 modify column 字段名 字段类型 新约束; 2.添加表级约束 alter table 表名 add 【constraint 约束名】约束类型(字段名)【外键的引用】;
1 2 3 4 5 6 7 8 9 10 11 12
1.添加非空约束 alter table 表名 modify column 列名 varchar(20) not null 2.添加默认约束 alter table stuinfo modify column age int default 18 3.添加主键 alter table stuinfo modify column id int primary key 列级约束 alter table stuinfo add primary key(id) 表级约束 4.添加唯一键 alter table stuinfo modify column seat int unique 列级约束 alter table stuinfo add unique(seat) 表级约束 5.添加Y键 alter table stuinfo add [constraint 新名字] foreign key(majorid) referencts major(id);
修改表时删除约束
1 2 3 4 5 6 7 8 9 10
1.删除非空约束 alter table 表名 modify column 列名 varchar(20) null 2.删除默认约束 alter table stuinfo modify column age int 3.删除主键 alter table stuinfo drop primary key 4.删除唯一键 alter table stuinfo drop index seat 列级约束 5.删除外键 alter table stuinfo drop foreign key 新名字; constraint起的新名字
mysql查看默认事务隔离级别 select @@tx_isolation sql8.0用的是 select @@transaction_isolation 更改事务隔离级别 set (session马上生效) transaction isolation level read uncommitted; 更改全局的隔离级别,重启生效 set global transaction isolation level read uncommitted;
5.5 savepoint的使用
需要搭配rollback使用
1 2 3 4 5 6
set autocommit = 0; start transaction; delete from account where id = 25; savepoint a; # 设置保存点 delete from account where id = 29; rollback to a; #回滚到保存点a