1 表级操作
CRUD:增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)
C新建
--新建学生表
create table Student (
name Int Not Null UNIQUE AUTO_INCREMENT Primary key,
Name varchar(20) not null,
age int null,
gender varchar(4) null );
--插入不存在的数据
insert into student (name,age,gender) value ('andy',30,'女');
--插入查询的数据
insert into student (name,age,gender) value (select name,age,gender from student where id>10);
D删除
--删除学生表
drop table Student
--删除数据项
delete from student where id<10;
U更新
--新增phone列
alter Table Student add (phone varchar(15) null);
--删除phone列
alter table student Drop colum phone;
--修改phone列
alter table student modify phone carchar(13) not null;
--变更字段scor是旧字段名,score是新字段名
alter table studnet change scor score int not null;
--更新
update student set age = age+1 where id>10 and id<=20;
R查询
语法
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
[WHERE <条件表达式>]
[GROUP BY <列名> [HAVING <条件表达式>]]
[ORDER BY <列名> [ASC|DESC]…]
举例
select * from student where id>10
group by age having avg(age)>20
order by id desc;
--查询指定列
select name,age from student where id>10;
select sum(age) from student;
--只显示结果不同的项
select distinct age from student;
--使用算数表达式
select name,sal*13 as sal_all from emp;
--使用like,in运算符号
--%匹配一个或多个字符,_匹配一个字符
select * from emp where name like 'S_T%' or age >50;
select * from emp where job in ('clerk','analyst');
--为空或非空
select * from emp where sal is null;--is not null;
--排序
select * from emp order by deptno asc,sal desc;
SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;
select * from emp where sal = (select max(sal) from emp);
--group by 和having
--group by 用来对查询结果进行分组统计
--having 用来限制分组显示结果
SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;
SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;
多表查询
select e.name,e.sal,d.dname from emp e,dept d where e.deptno = d.deptno order by d.deptno;
--自连接
SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;
--嵌套查询
SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');
--any(比任何一个都) 和all(比所有都)
SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);
--SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);
--多列子查询
SELECT * FROM emp where (job,deptno) = (select job,deptno from emp where name = 'Bob');
--更新数据
UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
-- 外连接(outer join):如果数据不存在,也会出现在连接结果中。
-- 左外连接 left join 如果数据不存在,左表记录会出现,而右表为null填充
-- 右外连接 right join 如果数据不存在,右表记录会出现,而左表为null填充
SELECT er.ename, ee.ename mgr_name from emp er left join emp ee where er.mgr=ee.empno;
--聚合函数
--求和
sum(age)
--平均值
avg(age);
--计数
count(age);
--最大 、 最小值
max(),min();
2 MySql语句(后期再补充)
--连接数据库
mysql -h127.0.0.1 -uroot -p123456
--查看数据库
show database;
--使用数据库
use XXX;
--查看表结构
desc XXX;
3 数据库索引
定义
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。
举例
图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某作者的,不知道书名怎么办?图书管理员在写一个目录,某某作者的书分别在第几排,第几排,这就是一个非聚集索引
字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引.
作用
索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。当进行数据检索时,系统先搜索索引,从中找到数据的指针,再直接通过指针从表中取数据!
优点:查询快
缺点:
1)占用存储空间
2)在表中执行insert、delete、update操作时,将有额外的操作来维护索引
3)过多的索引起反作用
注意:
1)如果给表中某字段加了 主键约束 或是 唯一约束 ,这时会自动帮你 建立对应这个字段的 唯一索引
2)索引不要轻易的建立
使用
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>]]…);
create unique index index_sid on Student (id des);
-- 建立学生表索引:多个字段Id、Name索引倒序
CREATE UNIQUE INDEX INDEX_SId_SName ON Student (Id DESC,Name DESC);
--删除索引
drop index index_sid;
4 视图
定义
就是一张虚拟表,视图就是一个子查询!实际当中的数据依然存在实际的表里面,只不过取的时候是根据这个视图(也就是这个子查询)从实际当中的表里面取出来.
优点:简化查询
缺点:你建视图建多了,如果这表结构突然改了,那么你视图也要跟着改!增加了你维护的支出!所以建的view越多,维护起来越麻烦.
除了简化查询以外,视图还有其他功能:
比如你有一张表,里面有很多数据,这些数据有些是你想给别人看,但是有些是秘密不想给人看,那么你就可以建立视图,然后把视图的权限给他,这样就保护了自己的私有数据。
CREATE VIEW <视图名> AS
SELECT 查询子句 [WITH CHECK OPTION]
CREATE VIEW VIEW_Stu_ManAS SELECT * FROM Student WHERE Gender = '男' WITH CHECK OPTION;
--删除视图
DROP VIEW VIEW_Stu_Man;