SQL基础

SQL基础

DDL 语句

DDL - 数据库定义语言。这些语句对数据库内部对象进行创建、删除、修改等操作。

  1. 查看建表sql
show create table user \G;

\G:使得记录能够按照字段竖向排列。

  1. 修改字段类型
    emp 表的名字
alter table emp modify [column] ename varchar(20) [first/after col_name];
  1. 修改字段名称
alter table emp change [column] name uname char(10) [first/after col_name];
  1. 增加字段
alter table emp add [column] age int(3) [first/after col_name];
  1. 删除字段
alter table emp drop [column] age [first/after col_name];
  1. 更改表名
alter table `emp` rename [to] `new_tablename`;

总结:modify, change, add, drop 对应改字段类型,改字段名称,新增,删除。[]表示可选项。[first/after col_name]指定字段排序。
如修改age字段把它放在最前面

alter table emp add column age int(3) first;
  1. 添加唯一索引
alter table user add unique index u_name(uname);

u_name -- 索引名称
uname -- 添加索引的字段

第二种方式:

create index idx_email on customer(email);

idx_email -- 索引名称
customer -- 表名
email -- 创建索引的字段名

DML 语句

DML - 数据库操作。简单说就是我们熟知的增删改查。

  1. 插入记录
insert into `tablename` (field1, field2, field3...) values (val1, val2,val3...);
  1. 更新语句
update tablename set filed1 = val1, field2 = val2, field3 = val3 ... [where condition];
  1. 删除语句
delete from tablename [where condition];

mysql可以一次删除多个表数据

delete t1, t2, t3... from t1, t2, t3... [where condition];

select 语句

聚合

很多情况下,用户需要进行一些汇总操作,这时会用到sql的聚合操作。
聚合语句语法如下:

SELECT [field1, field2,...,fieldn] fun_name
FROM tablename
[WHERE where_condition]
[GROUP BY field1, field2, ... , fieldn]
[WITH ROLLUP]
[HAVING where_condition]

参数说明:

  1. fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和),count(*),max(最大值)、min(最小值)。
  2. group by 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在 group by 后面。
  3. with rollup 是可选语法,表示是否对分类聚合后的结果进行再汇总。
  4. having 关键字表示对分类后的结果再进行条件的过滤。
    注意:having 和 where的区别在于,having是对聚合后的结果进行条件的过滤,而where是在聚合前对记录进行过滤。如果逻辑允许,我们尽可能先用where来先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having 进行再过滤。

创建实验表emp,并插入数据:

Create Table: CREATE TABLE `emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL COMMENT '员工名',
  `depno` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

insert into emp(name, depno) values('zhangsan', 1),('wuji',2),('jinyong',2),('lisi',1),('meichaofeng',2),('shiqiu',3),('jinmaoshiwang',2),('zhangsanfeng',2),('xiaoxifeidao',3),('rabbitmq',4),('mysql',4),('ini',5);

alter table emp add sal decimal(8,2);
update emp set sal = 10000.0 where id = 1;
update emp set sal = 12000.0 where id = 2;
update emp set sal = 12000.0 where id in (3,4);
update emp set sal = 22000.0 where id in (5,6,12);
update table emp set sal = 18000.00 where id = 8;
update emp set sal = 20000.00 where id in (7,9,10,11);


alter table emp add hiredate date;
alter table emp change name ename varchar(30);
update emp set hiredate = '2005-09-18' where id in (12,11,2);
update emp set hiredate = '2000-01-09' where id in (1,3,4,6,8);
update emp set hiredate = '2008-02-09' where id in (5,7);
update emp set hiredate = '2010-10-09' where id in (9,10);

查询不重复的记录,用 distinct 关键字来实现。

select distinct depno from emp;

例如:

  1. 要在emp表中统计公司的总人数:
 select count(1) from emp;
  1. 在此基础上统计各个部门的人数
select depno, count(1) from emp group by depno;
  1. 更细致一些,即要统计各部门人数,又要统计总人数:
select depno, count(1) from emp 
    group by depno with rollup;
  1. 统计人数大于1人的部门
select depno, count(1) from emp group by depno having count(1) > 1;

update emp set hiredate = '2010-10-09' where id in (9,10);

  1. 统计所有员工的薪水总额、最高和最低薪水:
select sum(sal), max(sal), min(sal) from emp;

表连接

建表

create table dept (
    deptno tinyint primary key auto_increment,
    depname varchar(20)) engine= innodb default charset=utf8;

insert into dept values(1, 'tech'), (2, 'sale'), (3, 'hr'), (4, 'tel'), (5, 'manager');

alter table emp depno deptno tinyint;

从大体上分,表连接分为内连接和外连接,它们之间的最主要区别就是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们常用的是内连接。

  1. 查询出索引雇员的名字和所在的部门名称,因为官员名称和部门分别存放在表 emp 和 dept 中。
    因此使用表连接查询:
select ename, depname from emp, dept where emp.deptno = dept.deptno order by depname;

外连接分为左连接和右连接,具体定义如下:
左连接: 包含所有的左表中的记录甚至是右表中没有和它匹配的记录。
右连接: 包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

准备:

delete from dept where deptno in (4,5);
  1. 查询emp表中所有雇员名及所在部门名称:
 select ename , depname from emp left join dept on emp.deptno = dept.deptno;

比较这个查询和上例中国年的查询,都是查询雇员名和部门名,两者的区别在于本例中列出了所有的用户名,即使有的用户名并不存在合法的部门名称;而上例是列出了存在合法部门的雇员名和部门名称。

select ename , depname from emp left join dept on dept.deptno = emp.deptno;

  1. 右连接和左连接类似,两者之间可以互相转化,例如上面的例子可以改写成如下的右连接:
select ename, depname from dept right join emp on dept.deptno = emp.deptno; 

子查询

某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询。用于子查询的关键字包括 in, not in, =, !=, exists, not exists 等。某些情况下,子查询可以转化为表连接。

记录联合

我们经常碰到这样的应用,将两个表的数据按照一定的条件查询出来后,将结果合并懂啊一起现实出来,这是好,就需要用 union 和 union all 关键字来实现这样的功能。

union 和 union all 的主要区别是 union all 是把结果集直接合并在一起,而 union 是 将 union all 后的结果进行一次distinct,去除重复记录后的结果。


select deptno from emp union  select deptno from dept; 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容