SQL基础

作者: 横渡 | 来源:发表于2018-04-20 06:46 被阅读12次

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; 

相关文章

  • sql

    sql-基础sql-基础查询-1sql-基础查询-2sql-更新 概览 数据库(Database,DB):将大量数...

  • SQL基础及元数据获取(数据类型,表的属性)

    1、SQL基础应用 ①.SQL的介绍SQL标准:SQL-92、SQL-99SQL_MODE:都是为了保证SQL语句...

  • MySql手动注入

    information_schema SQL基础 1.1 什么是sql? SQL(structured query...

  • MySQL

    数据类型 sql基础 数据库表 SQL SELECT 语句: SQL WHERE 子句: SQL AND & OR...

  • SQL语句

    SQL基础应用 SQL语句自动补全 SQL的介绍 SQL-92标准SQL-99标准 image SQL常用分类 表...

  • SQL高级运用

    -- =================================sql基础补充==============...

  • mysql的用法2

    -- =================================sql基础补充==============...

  • Oracle学习-day26:SQL语句

    一、SQL语言基础 1.什么是SQL语言? (1)SQL, Structured Query Language, ...

  • oracle 基础复习

    1. SQL 基础 https://mubu.com/doc/3ANPHhveeK 2. PL/SQL 基础 ht...

  • mysql手工注入

    SQL基础 1.1 什么是sql? SQL(structured query language),即结构化查询语言...

网友评论

      本文标题:SQL基础

      本文链接:https://www.haomeiwen.com/subject/clpokftx.html