目录
1 表的增删改查
1.1 Create
1.2 Retrieve
1.3 Update
1.4 Delect
2 MySQL内置函数
2.1 日期函数
2.2 字符串函数
2.3 数学函数
2.4 其他函数
3 复合查询举例
4 内外连接
4.1 内连接
4.2 外连接
5 索引
5.1 创建索引
5.1.1 创建主索引
5.1.2 创建唯一索引
5.1.3 创建普通索引
5.1.4 创建全文索引
5.2 查询索引
5.3 删除索引
6 事务管理
6.1 基本操作
6.2 事务操作注意事项
6.3 事务的隔离级别
6.4 事务的ACID特征
7 视图
7.1 概念
7.2 基本使用
7.3 视图规则和权限
8 用户管理
8.1 用户信息
8.2 创建用户
8.3 删除用户
8.4 修改用户密码
8.5 给用户授权
8.6 回收权限
9 补充运算符
9.1 逻辑运算符
9.2 算数运算符
CRUD:Create,Retrieve,Update,Delete
Create:
--创建一个学生表
create table students(
id int unsigned primary key auto_increment,//主键 唯一且不能为空
sn int not null unique comment '学号',//唯一键
name varchar(20) not null,
qq varchar(11)
);--注意最后的分号
--单行数据+全列插入:
insert into students values(101,10001,'孙悟空','110010010');
--多行数据+指定列插入:
insert into students (id,sn,name) values(1)(102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
--查看表结构
show create table table_name;
语法:
select
[distinct]{*|column,[,column]...}
[from table_name]
[where ...]
[order by column[asc|desc],...]
limit...
-- 创建表结构 CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
yuwen float DEFAULT 0.0 COMMENT '语文成绩',
shuxue float DEFAULT 0.0 COMMENT '数学成绩',
yingyu float DEFAULT 0.0 COMMENT '英语成绩' );
-- 插入测试数据 INSERT INTO exam_result (name, yuwen, shuxue, yingyu)
VALUES('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
--全列查询
select * from table_name;
--指定列查询
select column,... from table_name;--也可以包含表达式:yuwen+10
--为查询结果指定别名
select id,sn,name,yuwen+shuxue+yingyu [as] 总分 from table_name;
--去重结果
select distinct shuxue from table_name;
where条件
--数学成绩是58或者59或者98或者99分的同学及数学成绩
select name,shuxue from exam_result where shuxue=58
or shuxue=59
or shuxue=98
or shuxue=99;
select name,shuxue from exam_result where shuxue in(58,59,98,99);
--%匹配任意多个(包括0个)任意字符
--_匹配严格的一个任意字符
--若要查询总分在200分以下的同学
select name,yuwen+shuxue+yingyu as 总分 from table_name
where yuwen+shuxue+yingyu < 200;
--别名不能用在where条件中!!!!!
--null查询
select id,name from student where qq is not null;//查询qq不为空的学生id和name
--结果排序
select name,shuxue from student_exam order by shuxue;//默认为升序
--order by 子句中可以只用别名
--筛选分页结果
--从第6条数据开始,根据id升序排序显示id和name,一页显示3条记录
select id,name,shuxue from exam_result order by id limit 3 offset 5;
update exam_result set shuxue = 80 where name = '张三';
--不支持shuxue += 30这种语法
--没有where子句,则进行全表更新
--auto_increment会保留自增数据,不会因为数据被删除而置为0;但是drop表之后,该值会置为0
--语法:
delect from table_name [where...] [order by...] [limit...]
-创建留言板
create table msg(
-> id int primary key auto_increment,
-> content varchar(30) not null,
-> sendtime datetime);
--显示所有留言信息,发布日期只显示日期,不用显示时间
select content,date(sendtime) from msg;
--查询在2分钟之内发布的帖子
select * from msg where date_add(sendtime,interval 2 minute)>now();
注:
length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;
如果是单字节符则算作一个字节。中文表示多个字节数(与编码有关)
--将emp表中所有名字中有s的替换成‘上海’
select replace(ename,'s','上海'),ename from emp;
--截取emp表中ename字段的第二个到第三个字符
select substring(ename,2,2),ename from emp;
--以首字母小写的方式显示所有员工的姓名
select concat(lcase(substring(ename,1,1)),substring(ename,2)) as '姓名' from emp;
--查询当前用户
select use();
--md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
select md5('admin');
--显示当前正在使用的数据库
select database();
--ifnull(val1,val2) 如果val1为null,返回cal2,否则返回val1的值
--查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J
select empno,ename from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';
--按照部门号升序而雇员的工资降序排序
select * from emp order by deptno,sal desc;
--使用年薪进行降序排序
select ename,sal*12+ifnull(comm,0) as '年薪' from emp order by 年薪 desc;
--显示工资最高的员工的名字和工作岗位
select ename,job from emp where sal = (select max(sal) from emp);
--显示工资高于平均工资的员工信息
select ename, sal from EMP where sal>(select avg(sal) from EMP);
--显示每个部门的平均工资和最高工资
select deptno, format(avg(sal),2),max(sal) from emp group by deptno;
--显示平均工资低于2000的部门号和它的平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal) < 2000;
--显示每种岗位的雇员总数,平均工资
select job,count(*),avg(sal) from emp group by deptno;
注: where后面的语句进行比较时,要写select语句--即要判断比较的值是从哪里来的
select ename, dname from EMP, DEPT where EMP.deptno=
DEPT.deptno and ename='SMITH';
--标准如下:
select ename, dname from EMP inner join DEPT on EMP.deptno=
DEPT.deptno and ename='SMITH';
--左外连接
select 字段名 from 表名1 left join 表名2 on 连接条件;--表1完全显示
--右外连接
select 字段名 from 表名1 right join 表名2 on 连接条件;--表2完全显示
-- 当左边表和右边表没有匹配时,也会显示左边表的数据
select * from stu left join exam on stu.id=exam.id;
索引特征:
不用加内存、不用改程序、不用调sql。只要输入正确的语句create index, 查询速度就可能提高成百上千倍。它的价值在于提高一个海量数据的检索速度。
索引说明:
占用磁盘空间,每次添加数据,除了添加到表中,还要维护二叉树,速度有影响, 但不大。需要分别对所要查询的字段建立索引。以空间换时间。
主键索引的特点: 1.一个表中最多有一个主键 2.主键检索效率提高(主键不可重复) 3.不重复、不为空 主键索引的列基本上是int
-- 在创建表的时候,直接在字段名后指定
create table user1(id int primary key, name varchar(30));
-- 在创建表的最后,指定某列或某几列为主键索引
create table user2(id int, name varchar(30), primary key(id)); --可以指定多列
方式3:
create table user3(id int, name varchar(30));
-- 创建表以后再添加主键
alter table user3 add primary key(id);
唯一索引的特点: 1.一个表可以有多个唯一索引 2.查询效率高 3.如果在某一列建立唯一索引,必须保证这列数据不重复 4.如果一个唯一索引加上not null,等价于主键索引
--在表定义时,在某列后面直接指定unique唯一属性
create table user4(id int primary key,name varchar(30) unique);
--创建表时,在表的后面指定某列或某几列为unique
create table user5(id int primary key,name varchar(30) unique(name));
第三种方式:
create table user6(id int primary key,name varchar(30));
alter table user6 add unique(name);
普通索引特征: 1.一个表可以有多个普通索引,普通索引在实际开发中用的比较多 2.如果某列需要创建索引,但是有重复的值,那么我们就选择使用普通索引
--第一种方式:在表定义的最后,指定某列为索引
create table user8(id int primary key,name varchar(20),
email varchar(30),index(name));
--第二种方式:
create table user9(id int primary key,name varchar(20),
email varchar(30));
alter table user9 add index(name);
--第三种方式:
create table user10(id int primary key,name varchar(20),
email varchar(30),index(name));
cteate index idx_name on user10(name);
注: 全文索引要求:存储引擎必须是MYSAM,并且默认的全文索引支持英文,不支持中文
--创建全文索引:
create table articles(
id int unsigned auto_increment not null primary key,
title varchar(20),
body text,
fulltext(title,body)
)engine=MYISAM;
--使用全文索引(查询有没有database数据)
select * from articles where match(title,body) against('database');
--用explain来分析这个sql语句
explain select * from articles where match(title,body)
against('database')\G
--如果key位置显示有数据,则说明用到了全文索引
--方式一:
show keys from 表名
--方式二:
show index from 表名
--方式三:
desc 表名
--第一种方式-删除主键索引
alter table 表名 drop primary key;
--第二种方式-其他索引的删除
alter table 表名 drop index 索引名
--第三种方式
drop index 索引名 on 表名
--创建一个事务
start transaction;
--创建一个保存点
savepoint 保存点名;
--回滚到原始位置
rollback;
--回到保存点
rollback to 保存点名
--提交事务
commit;
1.innerDB支持事务,MYISAM不支持事务
2.如果一个事务被提交(commit)了,则不能回滚(rollback)
让不同的事务在操作数据时,具有隔离性,从而保证数据的一致性
===无隔离性会产生的问题:3个
--脏读
一个事务读到了另一个事务没有提交的数据
--不可重复读
一个事务中,多次读到的数据不一样
--幻读
事务不是独立执行时发生的一种现象:例如对于第一个事务对一个表中的数据进行了修改, 这种修改涉及全部行(查询工资为1000的员工人数),同时,第二个数据向表中插入了 一行新数据。那么,第一次操作的事务发现表中还有没有修改的数据行,就好像发生了 幻觉一样
备注:
不可重复读的重点是修改:同样的条件,再次读取发现值不一样 幻读的重点在于新增或者删除:同样的条件,第一次和第二次读出来的记录数不一样
--隔离级别:
read uncommited 读未提交
read commited 读已提交
repeatable read 可重复读
serializable 可串行化
--设置事务的隔离级别
set session transaction isolation level read uncommited;
--查看当前的隔离级别:
select @@tx_isolation;
注:mysql默认的隔离级别是可重复读,一般情况下不要修改
视图是一个虚拟表,其内容由查询定义。视图可以理解成由表中的若干列组成。视图的数据变化会影响到基表,基表的数据变化会影响到视图。
--创建视图
create view 视图名 as select语句;
eg:
create view view_ename_dname as select ename,dname from emp,dept
where emp.deptno = dept.deptno;
--删除视图
drop view 视图名;
对于root用户,它可以操作数据库中的所有数据库和表,但是如果别人知道了数据库密码,在很大程度上存在安全隐患,所以,我们需要对用户进行管理
MySQL中的用户,都存储在系统数据库mysql的user表中
字段解释:
host:表示这个用户可以在哪个主机登录,如果是localhost,表示只能从本机登录
user:用户名
authentication_string:用户密码通过password函数加密
*_pri:用户拥有的权限
--语法:
create user '用户名'@'登录主机/ip' identified by '密码';
eg:
create user 'litao'@'localhost' identified by '123456';
--语法:
drop user '用户名'@'主机名';
--自己改自己
set password = '新的密码';
--root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新的密码');
eg:
set password for 'litao'@'localhost'=password('abcd');
刚创建的用户没有任何权限,需要给用户授权
--语法:
grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码']
注:如果发现赋值权限后,没有生效,在root窗口下执行如下命令:
flush privileges;
--语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
eg:
--回收litao对数据库的所有权限
revoke all on mytest.DEPT from 'litao'@'localhost';
若有错误, 还请指正, 共同学习, 共同进步! !