美文网首页
SQL语言基础

SQL语言基础

作者: Rannio | 来源:发表于2018-08-07 23:12 被阅读0次

    1.SQL概述

    SQL语言(Structured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

    sql 语句就是对数据库进行操作的一种语言。

    2.SQL语言分类

    1)数据定义语言(DDL)Data Definition language,DDL使我们有创建或删除表格的能力,也可以定义索引(键),规定表与表的连接,以施加表间的约束。

    CREATE DATABASE            创建数据库

    ALTER DETABASE                修改数据库

    CREATE TABLE                      创建新表

    ALTER TABLE      修改(改变)数据库表

    DROP TABLE                            删除表

    CREATE INDEX        创建索引(搜索键)

    DROP INDEX                          删除引索

    2)数据操控语言(DML)Data Manipulation Language,供用户实现对数据的追加、删除、更新、查询等操作。

    SELECT              从数据库表中获取数据

    UPDATE              更新数据库表中的数据

    DELETE                从数据库表中删除数据

    INSERT INTO        向数据库表中插入数据

    3)数据控制语言(DCL)Data Control Language。

    GRANT                                        授权

    REVOKE                                撤销授权

    DENY                                    拒绝授权

    4)事务控制语言(TCL)Transaction Control Language。

    SAVEPOINT                            保存节点

    ROLLBAKE                                  回滚

    COMMIT                                      提交

    3.SQL语言基础

    快速了解SQL 的常用定义语句:数据库的创建,表的创建,修改数据库的创建。

    CREATE DATABASE 数据库名 [CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'] 设置数据库字符集及字符集校对规则。

    【例】CREATE DATABASE exam CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

    切换database:use 数据库名。

    【例】USE exam

    数据库的修改。

    alter database exam character set utf8;

    数据库的删除 。

    drop database 数据库名

    表的创建。

    CREATE TABLE 表名(属性1 数据类型[长度] [约束],......) [ENGINE=INNODB DEFAULT CHARSET=utf8];(存储引擎及字符集)如

    约束 数据类型介绍:

    表的修改

    Alter table 表名

    添加字段  Alter table add column 列名  类型

    添加约束  Alter  table 表名 alter  column  列名  set  default  ‘value';

    alter  table  表名  add  constraint  主键名  primary  key  表名(主键字段);

    alter  table  表名  add  constraint  外键名  foreign  key  (外键字段)  references  关联表名(关联字段);

    修改字段    Alter  table 表名 change  原字段名  新字段名  数据类型  [ 属性 ];

    删除字段  alter  table  表名  drop  字段名

    修改约束 alter  table  表名  add  constraint  外键名  foreign  key  (外键字段)  references  关联表名(关联字段);

    表的删除

    Drop table 表名;

    表的数据的插入

    Insert into 表名(列1,列2,。。。。) values ();

    表的数据的更新

    update  表名  set  列名  =  更新值 [ where  更新条件];

    表的数据的删除

    Delete from  表名  [ where  更新条件]。

    4.SELECT语句的语法

    SELECT { * 、column、[ alias ]、...}

    FROM tables

    SELECT 识别什么列

    FROM    识别那个表


    明确的规范

    sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。

    连接符号 or、in、and、以及=、<=、>=等前后加上一个空格

    对较为复杂的sql语句、过程、函数加上注释、说明算法、功能。

    单行注释:#

    多行注释:/*  ....  */ 出于之间的都会被注释

    多表连接时,试用表的别名来引用例。

    SQL语句规则

    SQL语句大小写不敏感

    SQL语句可写成一行可写成多行

    一个关键字不能跨多行或进行缩写

    子句通常位于独立行,以便编辑,并易读。

    空格和缩进使程序易读

    关键字大写,其他小写


    SELECT *

    FROM tables

    ‘ * ’ 可以使用需要查询的列替换

    ‘ tables ’ 可以使用需要查询的表替换

    算数表达式

    对NUMBER和DATE类型数据类型可以进行数学运算穿件表达式

    +  -  *  /

    乘法和除法的优先级高于加法和减法

    同级运算的顺序是从左到右

    表达式中使用括号可强行改变优先级的运算顺序

    定义列的别名

    改变列的标题头

    使用计算结果

    列的别名

    如果使用特殊字符,或大小写敏感,或有空格时,需加双引号

    SELECT ename AS name

    FROM tables

    SELECT ename ‘ Name ’

    FROM tables

    将ename在表中的名字改为name

    返回限制

    实用LIMIT关键字限制返回

    SELECT *

    FROM tables

    LIMIT 5

    显示tables中的所有列表中的前五列

    SELECT *

    FROM tables

    LIMIT 7 OFFSET 4

    SELECT *

    FROM tables

    LIMIT 4,7

    显示tables中从第五行(4+1)开始后的七个数据

    比较的表示

    =                                                          等于
    <                                                          大于

    >                                                          小于
    >=                                                      大于等于

    <=                                                        小于等于
    <>                                                        不等于
    BETWEEN ... AND ...                          在两个值之间(包含)
    IN(list)                                              匹配列出值
    LIKE                                                      匹配一个字符模式
    IS NULL                                                是空值

    WHERE的用法

    SELECT *

    FROM tables

    WHERE job=' sealman '

    显示tables中的所有“ job=sealman ”的数据

    逻辑运算符

    NOT                                        如果条件为假则返回真值

    AND                                        如果组合的条件都为真则返回真值

    OR                                          如果组合的条件 之一是真值,返回真值

    NOT                不属于(一般用作 NOT IN(...,...))

    SELECT *

    FROM tables

    WHERE NOT job=' clerk '

    显示tables中除了' job='clerk' '的所有数据

    SELECT *

    FROM tables

    WHERE job NOT IN (sealman,clerk)

    显示tables中job不属于sealman和clerk的所有数据

    AND                两者都包含

    SELECT *

    FROM tables

    WHERE job='sealman'

    AND sal>3000

    显示tables中既满足‘ job=sealman ’还满足‘ sal>3000 ’的所有数据

    OR                  两个条件满足一个即可

    SELECT *

    FROM tables

    WHERE job='sealman'

    OR sal>3000

    显示tables中' job=sealman '或者' sal>3000'的所有数据

    优先级规则

    括号拥有最高优先级

    优先级规则

    SELECT *

    FROM tables

    WHERE job='clerk'

    OR job='sealman'

    AND sal>3000

    优先进行' job='sealman' AND sal>3000'在进行' OR job='clerk' '

    SELECT *

    FROM tables

    WHERE ( job='clerk'

    OR job='sealman')

    AND sal>3000 

    优先进行' (job='clerk' OR job='sealman') '在进行' AND sal>3000 '

    ORDER BY 子句

    使用ORDER BY 子句将记录排序

    ASC: 升序,缺省

    DESC: 降序

    ORDER BY 子句在SELECT语句的最后

    SELECT *

    FROM tables

    ORDER BY sal  (ASC)/DESC

    显示tables肿的所有数据按照sal的升序(升序)/降序

    通过ORDER BY 列表的顺序来排序

        SELECT job sal

        FROM tables

        ORDER BY job ASC, sal DESC;

    显示job的升序和‘ job升序后 ’sal的降序


    练习:

    练习数据库搭建:

    create table `dept` (

    `deptno` int (2),

    `dname` varchar (60),

    `loc` varchar (60),

    primary key(deptno),

    index dept_index(deptno)

    )ENGINE=INNODB DEFAULT CHARSET=utf8;

    insert into `dept` (`deptno`, `dname`, `loc`) values('10','ACCOUNTING','NEW YORK');

    insert into `dept` (`deptno`, `dname`, `loc`) values('20','RESEARCH','DALLAS');

    insert into `dept` (`deptno`, `dname`, `loc`) values('30','SALES','CHICAGO');

    insert into `dept` (`deptno`, `dname`, `loc`) values('40','OPERATIONS','BOSTON');

    CREATE TABLE `emp` (

    `empno` INT (4) primary key,

    `ename` VARCHAR (60),

    `job` VARCHAR (30),

    `mgr` INT (4),

    `hiredate` DATE ,

    `sal` FLOAT ,

    `comm` FLOAT ,

    `deptno` INT (2),

    index emp_index(deptno),

    foreign key(deptno) references dept(deptno) on delete cascade on update cascade

    )ENGINE=INNODB DEFAULT CHARSET=utf8;

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7369','SMITH','CLERK','7902','1980-12-17','800.00',NULL,'20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7499','ALLEN','SALESMAN','7698','1981-02-20','1600.00','300.00','30');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7521','FORD','SALESMAN','7698','1981-02-22','1250.00','500.00','20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7566','JONES','MANAGER','7839','1981-04-02','2975.00',NULL,'20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7654','MARTIN','SALESMAN','7698','1981-09-28','1250.00','1400.00','30');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7698','BLAKE','MANAGER','7839','1981-05-01','2850.00',NULL,'30');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7782','CLARK','MANAGER','7839','1981-06-09','2450.00',NULL,'10');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7788','SCOTT','ANALYST','7566','1987-04-19','3000.00',NULL,'20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7839','KING','PRESIDENT',NULL,'1981-11-17','5000.00',NULL,'10');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7844','TURNER','SALESMAN','7698','1981-09-08','1500.00','0.00','30');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7876','ADAMS','CLERK','7788','1987-05-23','2200.00',NULL,'20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7900','JAMES','CLERK','7698','1981-12-03','950.00',NULL,'30');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7902','FORD','ANALYST','7566','1981-12-03','3000.00',NULL,'20');

    INSERT INTO `emp` (`empno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES('7934','MILLER','CLERK','7782','1982-01-23','1300.00',NULL,'10');

    create table `salgrade` (

    `grade` int (1) primary key,

    `losal` float ,

    `hisal` float

    );

    insert into `salgrade` (`grade`, `losal`, `hisal`) values('1','700.00','1200.00');

    insert into `salgrade` (`grade`, `losal`, `hisal`) values('2','1201.00','1400.00');

    insert into `salgrade` (`grade`, `losal`, `hisal`) values('3','1401.00','2000.00');

    insert into `salgrade` (`grade`, `losal`, `hisal`) values('4','2001.00','3000.00');

    insert into `salgrade` (`grade`, `losal`, `hisal`) values('5','3001.00','9999.00');

    1.查询emp表,显示薪水大于2000且工作类别是manager雇员的信息

    SELECT *

    FROM emp

    WHERE sal>=2000

    AND job='manager';

    练习1

    2.查询emp表,显示年薪大于30000工作类别不是MANAGER的雇员信息

    SELECT *

    FROM emp

    WHERE 12*(sal+IFNULL(comm,0))>=30000

    AND job<>'manager';

    练习2

    3.查询emp表,显示薪水在1500到3000之间且工作类别以'M'开头的雇员信息

    SELECT *

    FROM emp

    WHERE sal BETWEEN 1500 AND 3000

    AND job LIKE 'M%'

    练习3

    4.查询emp表,显示佣金为空且部门编号为20或30的雇员信息

    SELECT *

    FROM emp

    WHERE comm IS NULL

    AND deptno<>10

    练习4

    5.查询emp表,显示佣金不为空或者部门编号为20的雇员信息,要求按照薪水降序排列

    SELECT *

    FROM emp

    WHERE comm IS NOT NULL

    OR deptno=20

    ORDER BY sal DESC

    练习5

    6.查询emp表,显示年薪大于30000工作类别不是MANAGER,且部门号不是10或40的雇员信息,要求按照雇员姓名进行排列

    SELECT *

    FROM emp

    WHERE 12*(sal+IFNULL(comm,0))>30000

    AND job<>'manager'

    AND deptno NOT IN (10,40)

    ORDER BY ename

    练习6


    相关文章

      网友评论

          本文标题:SQL语言基础

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