SELECT CASE WHEN TRUE THEN 'jack' WHEN FALSE THEN 'tom' ELSE 'mary' END;
分页查询
按雇员的 id 号升序取出, 每页显示 3 条记录,请分别显示 第 1 页,第 2 页,第 3 页
1 2 3 4 5 6 7 8 9
-- 第 1 页 SELECT * FROM emp ORDER BY empno LIMIT 0, 3; -- 第 2 页 SELECT * FROM emp ORDER BY empno LIMIT 3, 3; -- 第 3 页 SELECT * FROM emp ORDER BY empno LIMIT 6, 3;
-- 推导一个公式 SELECT * FROM emp ORDER BY empno LIMIT 每页显示记录数 * (第几页-1) , 每页显示记录数
数据分组
多表查询
多表查询的条件不能少于 表的个数-1, 否则会出现笛卡尔集
自连接
自连接是指在同一张表的连接查询
自连接的特点
1. 把同一张表当做两张表使用
需要给表取别名 表名 表别名
列名不明确,可以指定列的别名 列名 as 列的别名
1 2 3
SELECT worker.ename AS '职员名' , boss.ename AS '上级名' FROM emp worker, emp boss WHERE worker.mgr = boss.empno;
子查询
子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询
单行子查询是指只返回一行数据的子查询语句
多行子查询指返回多行数据的子查询 使用关键字 in
在多行子查询中使用 all 操作符
1 2 3 4 5 6 7 8
SELECT ename, sal, deptno FROM emp WHERE sal > ALL( SELECT sal FROM emp WHERE deptno = 30 ) -- 可以这样写 SELECT ename, sal, deptno FROM emp WHERE sal > ( SELECT MAX(sal) FROM emp WHERE deptno = 30 )
SELECT ename, sal, deptno FROM emp WHERE sal > any( SELECT sal FROM emp WHERE deptno = 30 )
外连接
1 2 3 4 5
-- 改成左外连接 SELECT `name`, stu.id, grade FROM stu LEFT JOIN exam ON stu.id = exam.id; -- 使用右外连接(显示所有成绩,如果没有名字匹配,显示空) -- 即:右边的表(exam) 和左表没有匹配的记录,也会把右表的记录显示出来 SELECT `name`, stu.id, grade FROM stu RIGHT JOIN exam ON stu.id = exam.id;
表复制
自我复制数据
1 2 3 4
INSERT INTO my_tab01 (id, `name`, sal, job,deptno) SELECT empno, ename, sal, job, deptno FROM emp; -- 2. 自我复制 INSERT INTO my_tab01 SELECT * FROM my_tab01;
如何删除掉一张表重复记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样 (2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp (3) 清除掉 my_tab02 记录 (4) 把 my_tmp 表的记录复制到 my_tab02 (5) drop 掉 临时表 my_tmp -- (1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样 create table my_tmp like my_tab02 -- (2) 把 my_tab02 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp insert into my_tmp select distinct * from my_tab02; -- (3) 清除掉 my_tab02 记录 delete from my_tab02; -- (4) 把 my_tmp 表的记录复制到 my_tab02 insert into my_tab02 select * from my_tmp; -- (5) drop 掉 临时表 my_tmp drop table my_tmp; select * from my_tab02;
合并查询
1 2 3 4 5 6 7
-- union all 就是将两个查询结果合并,不会去重 SELECT ename,sal,job FROM emp WHERE sal>2500 UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER' -- union 就是将两个查询结果合并,会去重 SELECT ename,sal,job FROM emp WHERE sal>2500 UNION SELECT ename,sal,job FROM emp WHERE job='MANAGER'
mysql 约束
primary key(主键)
1
字段名 字段类型 primary key
用于唯一的标示表行的数据,当定义主键约束后,该列不能重复
primary key不能重复而且不能为null。
一张表最多只能有一个主键,但可以是复合主键主键的指定方式有两种
直接在字段名后指定:字段名primakry key在表定义最后写 primary key(列名);
使用desc表名,可以看到primary key的情况.
在实际开发中,每个表往往都会设计一个主键.
1 2 3 4
CREATE TABLE t18 (id INT PRIMARY KEY) -- 表示 id 列是主键 -- 演示复合主键 (id 和 name 做成复合主键) CREATE TABLE t18 (id INT , `name` VARCHAR(32), email VARCHAR(32), PRIMARY KEY (id, `name`) ); -- 这里就是复合主键 );
not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
unique(唯一)
当定义了唯一约束后,该列值是不能重复的。
如果没有指定not null,则unique字段可以有多个null
一张表可以有多个unique字段
foreign key(外键)
1 2 3 4 5 6 7 8 9 10
-- 创建 主表 my_class CREATE TABLE my_class ( id INT PRIMARY KEY , -- 班级编号 `name` VARCHAR(32) NOT NULL DEFAULT ''); -- 创建 从表 my_stu CREATE TABLE my_stu ( id INT PRIMARY KEY , -- 学生编号 `name` VARCHAR(32) NOT NULL DEFAULT '', class_id INT , -- 学生所在班级的编号 -- 下面指定外键关系 FOREIGN KEY (class_id) REFERENCES my_class(id) )
check
1 2 3 4 5 6 7
-- 测试 CREATE TABLE t23 ( id INT PRIMARY KEY, `name` VARCHAR(32) , sex VARCHAR(6) CHECK (sex IN('man','woman')), sal DOUBLE CHECK ( sal > 1000 AND sal < 2000) );
MySql索引
创建索引
1 2 3
CREATE INDEX 索引名称 ON 表名 (字段名); CREATE INDEX empno_index ON emp (empno); CREATE INDEX ename_index ON emp (ename) -- 在 ename 上创建索引
create user 'testuser' @localhost identified by '123'; -- 创建用户 zhangsan 密码 123 , 从本地登录 CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123'; -- create user 'xxx'@'192.168.1.%' 表示 xxx 用户在 192.168.1.*的 ip 可以登录 mysql CREATE USER 'smith'@'192.168.1.%'
删除用户
1 2 3 4 5 6 7
drop user 'testuser' @localhost; -- 删除 zhangsan DROP USER 'zhangsan'@'localhost'
-- 在删除用户的时候,如果 host 不是 %, 需要明确指定 '用户'@'host 值' DROP USER jack -- 默认就是 DROP USER 'jack'@'%' DROP USER 'smith'@'192.168.1.%'
用户修改密码
1
SET PASSWORD FOR 'zhangsan'@'localhost' = PASSWORD('abc');
给用户授权
1 2 3 4
-- 给 zhangsan 分配查看 news 表和 添加 news 的权限 GRANT SELECT , INSERT ON testdb.news TO 'zhangsan'@'localhost'; -- 可以增加 update 权限 GRANT UPDATE ON testdb.news TO 'zhangsan'@'localhost';
回收用户授权
1 2 3
-- 回收 shunping 用户在 testdb.news 表的所有权限 REVOKE SELECT , UPDATE, INSERT ON testdb.news FROM 'zhangsan'@'localhost' REVOKE ALL ON testdb.news FROM 'zhangsan'@'localhost