SQL基础(超详细版!!)

SQL查询

    • 一、SQL概述
      • 1.1 什么是SQL
      • 1.2 语法要求
    • 二、SQL分类
    • 三、DDL(Data Definition Language):数据定义语言
      • 3.1基本操作
      • 3.2 操作数据库
      • 3.3 数据类型
      • 3.4 操作表
        • 3.4.1 创建表:
        • 3.4.2 查看表结构: DESC 表名;
        • 3.4.3 删除表:DROP TABLE 表名;
        • 3.4.4 修改表:
    • 四、DML(Data Manipulation Language):数据操作语言
      • 4.1.插入数据
      • 4.2修改数据
      • 4.3删除数据
    • 五、DCL(Data Control Language):数据控制语言
      • 5.1创建用户
      • 5.2给用户授权
      • 5.3撤销授权
      • 5.4、查看用户权限
      • 5.5删除用户
      • 5.6修改用户密码(以root身份)
    • 六、DQL(Data Query Language):数据查询语言
    • 七、基础查询
      • 1. 查询所有列
      • 1.2 查询指定列
      • 2、条件查询
        • 2.1 条件查询介绍
        • 3、模糊查询
        • 4、字段控制查询
        • 5、排序
        • 6、聚合函数
        • 7、分组查询
        • 8、LIMIT:用来限定查询结果的起始行,以及总行数。

一、SQL概述

1.1 什么是SQL

SQL(Structured Query Language)“结构化查询语言” ,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。SQL标准(ANSI/ISO)有:

  • SQL-92:1992年发布的SQL语言标准;

  • SQL:1999:1999年发布的SQL语言标签;

  • SQL:2003:2003年发布的SQL语言标签;

    这些标准就与JDK的版本一样,在新的版本中总要有一些语法的变化。不同时期的数据库对不同标准做了实现。
    虽然SQL可以用在所有关系型数据库中,但很多数据库还都有标准之后的一些语法,我们可以称之为“方言”。例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的方言。

1.2 语法要求

  • SQL语句可以单行或多行书写,以分号结尾;

  • 可以用空格和缩进来来增强语句的可读性;

  • 关键字不区别大小写,建议使用大写;

二、SQL分类

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)

三、DDL(Data Definition Language):数据定义语言

3.1基本操作

  • 查看所有数据库:show databases;
  • 切换数据库:use mydb1,切换到mydb1数据库;

3.2 操作数据库

  • 创建数据库:
CREATE DATABASE [IF NOT EXISTS] mydb1;

创建数据库,例如:CREATE DATABASE mydb1,创建一个名为mydb1的数据库。如果这个数据已经存在,那么会报错。例如CREATE DATABASE IF NOT EXISTS mydb1,在名为mydb1的数据库不存在时创建该库,这样可以避免报错。

  • 删除数据库:
DROP DATABASE [IF EXISTS] mydb1;

删除数据库,例如:DROP DATABASE mydb1,删除名为mydb1的数据库。如果这个数据库不存在,那么会报错。DROP DATABASE IF EXISTS mydb1,就算mydb1不存在,也不会的报错。

  • 修改数据库编码:
ALTER DATABASE mydb1 CHARACTER SET utf8

修改数据库mydb1的编码为utf8。注意,在MySQL中所有的UTF-8编码都不能使用中间的“-”,即UTF-8要书写为UTF8。

3.3 数据类型

MySQL与Java、C一样,也有数据类型。MySQL中数据类型主要应用在列上。
常用类型:

  • int:整型
  • double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
  • decimal:泛型型,在表单线方面使用该类型,因为不会出现精度缺失问题;
  • char:固定长度字符串类型;(当输入的字符不够长度时会补空格)
  • varchar:固定长度字符串类型(当输入的字符不够长度时不会补空格);
  • text:字符串类型;
  • blob:字节类型;
  • date:日期类型,格式为:yyyy-MM-dd;
  • time:时间类型,格式为:hh:mm:ss
  • timestamp:时间戳类型;

3.4 操作表

3.4.1 创建表:

CREATE TABLE 表名(
  列名 列类型,
  列名 列类型,
  ......
);

例如:创建stu表

CREATE TABLE stu(
	sid	    CHAR(6),
	sname	VARCHAR(20),
	age		INT,
	gender	VARCHAR(10) 
);

再例如:创建emp表

CREATE TABLE emp(
	eid		CHAR(6),
	ename	VARCHAR(50),
	age		INT,
	gender	VARCHAR(6),
	birthday	DATE,
	hiredate	DATE,
	salary	DECIMAL(7,2),
	resume	VARCHAR(1000)
);

3.4.2 查看表结构: DESC 表名;

3.4.3 删除表:DROP TABLE 表名;

3.4.4 修改表:

(1) 添加列:给stu表添加classname列

  ALTER TABLE stu ADD (classname varchar(100));

(2) 修改列的数据类型:修改stu表的gender列类型为CHAR(2)

ALTER TABLE stu MODIFY gender CHAR(2);

(3) 修改列名:修改stu表的gender列名为sex

ALTER TABLE stu change gender sex CHAR(2);

(4) 删除列:删除stu表的classname列

ALTER TABLE stu DROP classname;

(5) 修改表名称:修改stu表名称为student

ALTER TABLE stu RENAME TO student;

四、DML(Data Manipulation Language):数据操作语言

4.1.插入数据

语法1:
INSERT INTO 表名(列名1,列名2, …) VALUES(值1, 值2);

INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');

INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');

语法2:
INSERT INTO 表名 VALUES(值1,值2,…);
因为没有指定要插入的列,表示按创建表时列的顺序插入所有列的值:

INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');

注意:所有字符串数据必须使用单引用!

4.2修改数据

语法:
UPDATE 表名 SET 列名1=值1, … 列名n=值n [WHERE 条件];

UPDATE stu SET sname=’zhangSanSan’, age=32, gender=’female’ WHERE sid=’s_1001’;
UPDATE stu SET sname=’liSi’, age=20WHERE age>50 AND gender=’male’;
UPDATE stu SET sname=’wangWu’, age=30WHERE age>60 OR gender=’female’;
UPDATE stu SET gender=’female’ WHERE gender IS NULL
UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;

4.3删除数据

语法1:
DELETE FROM 表名 [WHERE 条件];

DELETE FROM stu WHERE sid=’s_1001’003B;
DELETE FROM stu WHERE sname=’chenQi’ OR age > 30;
DELETE FROM stu;

语法2:
TRUNCATE TABLE 表名;

TRUNCATE TABLE stu;

虽然TRUNCATE和DELETE都可以删除表的所有记录,但有原理不同。DELETE的效率没有TRUNCATE高!
TRUNCATE其实属性DDL语句,因为它是先DROP TABLE,再CREATE TABLE。而且TRUNCATE删除的记录是无法回滚的,但DELETE删除的记录是可以回滚的(回滚是事务的知识!)。

五、DCL(Data Control Language):数据控制语言

5.1创建用户

语法:
CREATE USER ‘用户名’@地址 IDENTIFIED BY ‘密码’;

CREATE  USER  ‘user1’@localhost  IDENTIFIED  BY123;
CREATE  USER  ‘user2’@’%’  IDENTIFIED  BY123;

5.2给用户授权

语法:
GRANT 权限1, … , 权限n ON 数据库.* TO ‘用户名’@地址;

GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;

GRANT ALL ON mydb1.* TO user2@localhost;

5.3撤销授权

语法:
REVOKE 权限1, … , 权限n ON 数据库.* FROM ‘用户名’@地址;

REVOKE  CREATE,ALTER,DROP  ON  mydb1.*  FROM  user1@localhost;

5.4、查看用户权限

语法:
SHOW GRANTS FOR ‘用户名’@地址;

SHOW GRANTS FOR user1@localhost;

5.5删除用户

语法:
DROP USER ‘用户名’@地址;

DROP  USER  ‘user1’@localhost;

5.6修改用户密码(以root身份)

语法:
use mysql;

alter user '用户名'@localhost identified by '新密码';

六、DQL(Data Query Language):数据查询语言

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
语法:

语法 作用
select 列名 要查询的列名称
from 表名 要查询的表名称
where 条件 行条件
group by 分组列 对结果分组
having 分组条件 分组后的行条件
order by 排序列 对结果分组
limit 起始行, 行数 结果限定

创建数据库:Info,在Info下创建如下表:
☆学生表:stu

字段名称 字段类型 说明
sid char(6) 学生学号
sname varchar(50) 学生姓名
age int 学生年龄
gender varchar(50) 学生性别
CREATE TABLE stu (
	sid	CHAR(6),
	sname		VARCHAR(50),
	age		INT,
	gender	VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

☆雇员表:emp

字段名称 字段类型 说明
empno int 员工编号
ename varchar(50) 员工姓名
job varchar(50) 员工工作
mgr int 领导编号
hiredate date 入职日期
sal decimal(7,2) 月薪
comm decimal(7,2) 奖金
deptno int 部分编号
CREATE TABLE emp(
	empno		INT,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm		decimal(7,2),
	deptno		INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

☆部门表:dept

字段名称 字段类型 说明
deptno int 部分编码
dname varchar(50) 部分名称
loc varchar(50) 部分所在地点
CREATE TABLE dept(
	deptno		INT,
	dname		varchar(14),
	loc		varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

七、基础查询

1. 查询所有列

SELECT   *    FROM    表名;

通配符 ’ * ’ ,表示所有列

//例子
SELECT  *  FROM  stu;

1.2 查询指定列

 SELECT  列名1, 列名2, …列名n  FROM  表名;

 SELECT  sid,  sname, age  FROM  stu;

2、条件查询

2.1 条件查询介绍

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

  • =、!=、<>、<、<=、>、>=;
  • BETWEEN…AND;
  • IN(set);
  • IS NULL;
  • AND;
  • OR;
  • NOT;

2.2 查询性别为女,并且年龄小于50的记录

 SELECT  *  FROM  stu 
WHERE  gender='female'  AND  age<50;

2.3 查询学号为S_1001,或者姓名为liSi的记录

SELECT  *  FROM  stu 
WHERE  sid ='S_1001'  OR  sname='liSi';

2.4 查询学号为S_1001,S_1002,S_1003的记录

SELECT  *  FROM  stu 
WHERE  sid  IN ('S_1001','S_1002','S_1003');

2.5 查询学号不是S_1001,S_1002,S_1003的记录

SELECT  *  FROM  stu 
WHERE  sid   NOT IN ('S_1001','S_1002','S_1003');

2.6 查询年龄为null的记录

SELECT   *   FROM   stu
WHERE   age   IS NULL;

2.7 查询年龄在20到40之间的学生记录

SELECT   * 
FROM   stu
WHERE  age>=20  AND  age<=40;
或者
SELECT   * 
FROM   stu 
WHERE  age  BETWEEN  20  AND  40;

2.8 查询性别非男的学生记录

SELECT   * 
FROM   stu
WHERE  gender!='male';
或者
SELECT   * 
FROM   stu
WHERE   gender<>'male';
或者
SELECT   * 
FROM   stu
WHERE  NOT  gender='male';

2.9 查询姓名不为null的学生记录

SELECT * 
FROM stu
WHERE NOT sname IS NULL;
或者
SELECT * 
FROM stu
WHERE sname IS NOT NULL;

3、模糊查询

   SELECT  字段  FROMWHERE  某字段  Like  条件

其中关于条件,SQL 提供了两种匹配模式:
(1) % :表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
(2) _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
3.1 查询姓名由5个字母构成的学生记录

SELECT  * 
FROM  stu
WHERE  sname  LIKE '_ _ _ _ _';

3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录

SELECT  * 
FROM  stu
WHERE  sname  LIKE  '_ _ _ _i';

3.3 查询姓名以“z”开头的学生记录

SELECT  * 
FROM  stu
WHERE sname LIKE 'z%';
其中“%”匹配0~n个任何字母。

3.4 查询姓名中第2个字母为“i”的学生记录

SELECT   * 
FROM   stu
WHERE   sname   LIKE  '_i%';

3.5 查询姓名中包含“a”字母的学生记录

SELECT  * 
FROM  stu
WHERE  sname  LIKE  '%a%';

4、字段控制查询

4.1 去掉重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用

DISTINCTSELECT   DISTINCT  sal   FROM   emp;

4.2 查看雇员的月薪与佣金之和
  因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。

SELECT  *, sal+comm   FROM   emp;

comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:

SELECT  *, sal+IFNULL(comm,0)  FROM  emp;

4.3 给列名添加别名
在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:

SELECT  *,  sal+IFNULL(comm,0)  AS  total  FROM  emp;

给列起别名时,是可以省略AS关键字的:

SELECT  *, sal+IFNULL(comm,0)  total  FROM  emp;

5、排序

5.1 查询所有学生记录,按年龄升序排序

SELECT  *
FROM  stu
ORDER  BY  sage  ASC;
或者
SELECT  *
FROM  stu
ORDER BY  sage;

5.2 查询所有学生记录,按年龄降序排序

SELECT  *
FROM   stu
ORDER  BY  age  DESC;

5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序

SELECT  *  FROM  emp
ORDER  BY  sal  DESC ,empno  ASC;

6、聚合函数

聚合函数是用来做纵向运算的函数:

  • COUNT():统计指定列不为NULL的记录行数;
  • MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  • MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  • SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  • AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

6.1 COUNT:当需要纵向统计时可以使用COUNT()。
查询emp表中记录数:

SELECT  COUNT(*)  AS  cnt  FROM  emp;

查询emp表中有佣金的人数:

SELECT  COUNT(comm)  cnt  FROM  emp;

注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
查询emp表中月薪大于2500的人数:

SELECT  COUNT(*)  FROM  emp   WHERE  sal > 2500;

统计月薪与佣金之和大于2500元的人数:

SELECT  COUNT(*)  AS cnt  FROM emp WHERE sal+IFNULL(comm,0) > 2500;

查询有佣金的人数,以及有领导的人数:

SELECT  COUNT(comm),  COUNT(mgr)  FROM  emp;

6.2 SUM和AVG:当需要纵向求和时使用sum()函数。
查询所有雇员月薪和:

SELECT   SUM(sal)   FROM  emp;

查询所有雇员月薪和,以及所有雇员佣金和:

SELECT  SUM(sal),  SUM(comm)  FROM  emp;

查询所有雇员月薪+佣金和:

SELECT  SUM(sal+IFNULL(comm,0))  FROM  emp;

统计所有员工平均工资:

SELECT  SUM(sal), COUNT(sal)  FROM  emp;
或者
SELECT  AVG(sal)  FROM  emp;

6.3 MAX和MIN
查询最高工资和最低工资:

SELECT  MAX(sal),  MIN(sal)  FROM  emp;

7、分组查询

当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。

7.1 分组查询
查询每个部门的部门编号和每个部门的工资和:

SELECT  deptno, SUM(sal)
FROM  emp
GROUP  BY  deptno;

查询每个部门的部门编号以及每个部门的人数:

SELECT  deptno,COUNT(*)
FROM  emp
GROUP  BY  deptno;

查询每个部门的部门编号以及每个部门工资大于1500的人数:

SELECT  deptno ,COUNT(*)
FROM  emp
WHERE  sal>1500
GROUP  BY  deptno;

7.2 HAVING子句
查询工资总和大于9000的部门编号以及工资和:

SELECT  deptno,  SUM(sal)
FROM   emp
GROUP  BY  deptno
HAVING  SUM(sal) > 9000;
  

注意,WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

8、LIMIT:用来限定查询结果的起始行,以及总行数。

8.1 查询5行记录,起始行从0开始

SELECT  *  FROM  emp  LIMIT  0, 5;

注意,起始行从0开始,即第一行开始!
8.2 查询10行记录,起始行从3开始

SELECT  *  FROM  emp  LIMIT  3, 10;

8.3 分页查询

如果一页记录为10条,希望查看第3页记录应该怎么查呢?

  • 第一页记录起始行为0,一共查询10行;
  • 第二页记录起始行为10,一共查询10行;
  • 第三页记录起始行为20,一共查询10行;

你可能感兴趣的:(sql,数据库,sql)