欢迎光临散文网 会员登陆 & 注册

《黑执事》双生子篇((SQL版)平行世界与幻想线)第1话 :SQL常用语句大全(超重要合集)

2019-12-06 20:44 作者:诗书画唱  | 我要投稿

SQL性别限制只能写男女,怎么写?

create table 表名

(

sex char(2) check(sex='男' or sex='女') not null

)

默认性别为男的代码如下:

create table 学生表

(

学号 char(5) not null primary key,

姓名 varchar(10) not null,

性别 char(2) default '男' check (性别 in ('男','女'))     //其中default '男'  就是默认性别为男。

)

扩展资料

使用其他方法限制性别只能写男或女:

ALTER TALBE [表名]

ADD CONSTRAINT 约束名 CHECK(列名 in ('男', '女')) not null

注意:CHECK 约束可以应用于一个或者多个列,也可以将多个CHECK 约束应用于一个列。

当除去某个表时,对这个表的CHECK 约束也将同时被去除。

创建数据库与创建数据表的方法


1.创建数据库

create database stuDB  --stuDB是数据库的名称
on  primary  -- 默认就属于primary文件组,可省略
(
/*--数据文件的具体描述--*/
    name='stuDB_data',  -- 主数据文件的逻辑名称
    filename='D:\stuDB_data.mdf'-- 主数据文件的物理路径和名称
    size=5mb, --主数据文件的初始大小
    maxsize=100mb, -- 主数据文件增长的最大值
    filegrowth=15%--主数据文件的增长率
)
log on
(
/*--日志文件的具体描述,各参数含义同上--*/
    name='stuDB_log',
    filename='D:\stuDB_log.ldf',
    size=2mb,
    filegrowth=1mb
)

   

-----2.创建数据表
use StuDB   --使用某个数据库(在某个数据库下建表)
go 
if exists(select from sysobjects where name='stuMarks')--查询数据库是否已存在此表
drop table stuMarks--如果存在该表则删除,不存在不执行此句
create table stuMarks  --stuMarks是表的名称
(
    ExamNo      int     identity(1,1) primary key,--列名    数据类型   约束
    stuNo       char(6) not null,--列名   数据类型   是否允许插入Null值
    writtenExam int     not null,
    LabExam     int     not null
)
go

     

-- 其中,列属性"identity(起始值,递增量)" 表示"ExamNo"列为自动编号, 也称为标识列alter table 表名
add constraint 约束名 约束类型 具体的约束说明
alter table 表名
drop constraint 约束名

创建SQL数据库学生个人信息表student

以下是方法与步骤:

  1. (1)新建表:单击数据库“studentDb”前图标,然后右键“表”文件包,单击“新建表”选项,进入“新建表”窗口。


  2. (2)设定表标识字段id:填写第一个列名“id”,设定数据类型为“int”,同时在“列属性”位置中“标识规范”中设定“是标识”的值为“是”。

  3. (3)设定表其它字段:依次填写字段学号stuNumber(varchar(50),不为空)、姓名stuName(varchar(50),可为空)、性别stuXb(varchar(50),可为空)、年龄stuAge(int,可为空)、出生日期stuBirth(datetime,可为空)。

  4. (4)单击表的右上角“  ×   ”图标,进入“保存对以下各项的更改吗”对话框。

  5. (5)单击“是”,进入“选择名称”对话框,填写表名为“student”。特别强调:表名不能采用常见的关键词(如for、name、where、to等)命名。


  6. (6)单击“确定”,学生个人信息student表创建完成。


  7. (7)单击数据库“studentDb”前面“×”图标,然后单击“表”前面的“”图标,右键“student”表,单击“打开表”选项,即可向表中填入数据,如图1.28所示。注意:id字段值自动填入,不能手填。


  8. (8)单击student表的右上角“× ”图标,关闭表同时自动保存学生个人信息。

    【友情提示】如何修改student表中字段名或数据类型?

    实现过程:首先单击数据库“studentDb”前面的“× ”图标,其次单击“表”前面的“”图标,然后右键“student”表,单击“设计”,进入“表设计”窗口,便可以修改student表中字段名或数据类型。特别强调:必须先删除表中数据,才能修改字段的数据类型。

举几个例子

1. 简单查询语句

1.1 查询全部:

SELECT * FROM 表名称 ;

1.2 实际上简单查询语句语法格式就是:

SELECT * | 具体的列 别名FROM 表名称 ;

(查询所有)


1.3 如果现在假设,只需要查询出雇员的编号、姓名、工作的话,则就需要指定查询的列:

SELECT empno,ename,job FROM emp ;

(返回列指定的名称)


1.4 要求查询出某一列,肯定要查询的是某一个字段:

SELECT job FROM emp;

(查询指定字段)

以上的查询结果似乎有一些不妥。因为工作存在重复值,既然要查询的是工作,所以肯定应该将重复的内容消除掉,所以在查询的时候可以通过 DISTINCT 直接消除掉所有的重复列。

SELECT {DISTINCT} * | 具体的列 别名FROM 表名称 ;

但是,在消除重复列的时候,有一点必须说明,如果要同时查询多列,则必须保证所有列都重复才能消除掉。
例如:查询雇员的编号及工作

SELECT DISTINCT empno,job FROM emp ;(筛选掉重复的)


因为雇员编号不重复,所以此时证明所有的列没有重复的,所以不能消除掉。

1.5 要求查询出雇员的编号,姓名,工作,但是显示的格式:

编号是:7369 的雇员,姓名是:SMITH,工作是:CLERK

要想实现此种功能,则可以使用 Oracle 中提供的字符串连接操作,使用“||”表示如果要加入一些显示信息的话,所有的其他的固定信息要使用“'”括起来

SELECT '编号是:'   || empno ||   '的雇员,姓名是:'   || ename ||   ',工作是:'    || jobFROM emp ;

(按指定格式返回)

1.6 在查询中也可以使用四则运算功能,例如:要求,求出每个雇员的姓名及年薪。

SELECT ename , sal * 12 FROM emp ;

(查询返回年薪)

在程序中 sal*12 意义很不明确,所以最好为这个运算结果起一个别名,但是在起别名的时候一定要回避中文。

SELECT ename , sal * 12  income  FROM emp ;(income为别名,之前可加as或不加

程序中可以支持+、-、*、/的语句,所有的语句要有优先顺序,先乘除后加减。



2. 限定查询(WHERE子句)

2.1 如果希望可以根据指定的条件查询的话,则必须指定限定查询。限定查询的语法:

SELECT {DISTINCT} * | 具体的列 别名FROM 表名称{WHERE 条件(s)}

2.1.1 范例:查询出工资大于 1500 的所有雇员信息
· 数学计算中,工资大于:sal>1500
SELECT * FROM emp WHERE sal>1500 ;

(根据条件查询)

2.1.2 范例:查询每月可以得到奖金的雇员信息
·奖金是 comm 字段
·只要字段中存在内容,则表示此内容不为空(null),如果存在内容,则会显示具体的值。
·不为空的表示:字段 IS NOT NULL
SELECT * FROM emp WHERE comm IS NOT NULL ;


查询每月可以得到奖金的雇员

2.1.3 范例:查询没有奖金的雇员
没有奖金则 comm 字段的内容肯定是 null,格式:字段 IS NULL
SELECT * FROM emp WHERE comm IS NULL ;

查询没有奖金的雇员

2.1.4 范例:要求查询出,基本工资大于 1500,同时可以领取奖金的雇员信息。
· 此时应该是两个条件,而且两个条件必须同时满足;
· 既然要求两个条件全部满足,则必须使用 AND 操作符进行条件的连接。
SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL ;

基本工资大于 1500,同时可以领取奖金


同时指定了两个条件,两个条件必须同时满足才可以查询出结果。

2.1.5 范例:要求查询出,基本工资大于 1500,或者可以领取奖金的雇员信息。
· 如果要表现出或者的概念使用 OR 进行连接,表示两个条件有一个满足即可。
SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL ;

基本工资大于 1500,或者可以领取奖金


之前使用 NOT 可以取反,把真的条件变为假的,假的变为真的。

2.1.6 范例:要求查询出,基本工资不大于 1500,同时不可以领取奖金的雇员信息。
· 此时相当于是整体的条件取反。
SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL) ;

基本工资不大于 1500,同时不可以领取奖金


从程序中可以发现,通过括号表示一组的条件。

2.1.7 范例:查询基本工资大于 1500,但是小于 3000 的全部雇员信息
· 满足两个:sal > 1500 ,sal < 3000
SELECT * FROM emp WHERE sal>1500 AND sal<3000 ;


在 SQL 语法中,提供了一个专门的指定范围查询的过滤语句:BETWEEN...AND....
语法格式:
字段 BETWEEN 最小值 AND 最大值

2.1.8 范例:使用 BETWEEN...AND 修改之前的操作
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;



实际上 BETWEEN ... AND 操作等价:sal>=1500 AND sal<=3000,包含了等于的功能。

2.1.9 范例:查询出在 1981 年雇佣的全部雇员信息
· 1981年1月1日 ~ 1981年12月31日之间雇佣的雇员· 日期表示的时候要加“ ' ”
SELECT * FROM empWHERE hiredate BETWEEN '1-1 月 -81' AND '31-12 月-81' ;



结论:BETWEEN ... AND 查询除了可以支持数字之外,也可以支持日期的查询· 随着深入的学习会发现,日期实际上也是以数字的形式表示出来。

2.1.10 范例:要求查询出姓名是 smith 的雇员信息· 此时告诉了要查询的名字,条件:ename='smith'

SELECT * FROM emp WHERE ename='smith' ;

执行以上的查询语句之后,并不会返回查询结果,再次查询数据库表的信息,发现 smith 是采用大写的形式表示的,在 Oracle 中是对大小写敏感的,所以此时在查询的时候必须以大写的形式进行条件的编写。代码修改如下:

SELECT * FROM emp WHERE ename='SMITH' ;


2.1.11 范例:要求查询出雇员编号是 7369、7499、7521 的雇员的具体信息· 如果此时按照之前的做法,则设置条件要使用 OR 连接:
|- empno=7369 OR empno=7499 OR empno=7521

SELECT * FROM empWHERE empno=7369 OR empno=7499 OR empno=7521 ;




实际上,此时是指定了查询的范围,那么既然有范围了在 SQL 语法中就可以使用 IN 操作符完成。
语法格式:
字段 IN (值 1,值 2,.....,值 n)
如果现在要求查询的内容不在此范围之中,则可以使用 NOT IN,语法如下:
字段 NOT IN (值 1,值 2,.....,值 n)
范例:使用以上的格式进行修改
SELECT * FROM empWHERE empno IN (7369,7499,7521) ;



2.1.12 范例:要求查询出雇员编号不是 7369、7499、7521 的雇员的具体信息
SELECT * FROM empWHERE empno NOT IN (7369,7499,7521) ;


另外,需要说明的是,使用 IN 操作符不光可以用在数字上,也可以用在字符串的信息上。


2.1.13 范例:要求查询出姓名是 SMITH、ALLEN、KING 的雇员信息
SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING') ;



提示: 如果在指定的查询范围中指定了额外的内容,则不影响程序运行。

SELECT * FROM emp  WHERE ename IN ('SMITH','ALLEN','KING','#$#$$##$') ;


模糊查询

在一般的日常见到的站点中经常发现有模糊查找功能,即:输入一个指定的关键字,把符合的内容全部查询出来,在 SQL 中使用 LIKE 语句完成。

在使用 LIKE 语句的时候要注意通配符的问题,在 LIKE 语句中主要使用以下两种通配符:
· “%”:可以匹配任意长度的内容
· “_”:可以匹配一个长度的内容

2.1.14 范例:查询出所有雇员姓名中第二个字母包含“M”的雇员信息

SELECT * FROM empWHERE ename LIKE '_M%' ;


2.1.15 范例:查询出雇员姓名中包含字母 M 的雇员信息· 此时,表示可以在任意的位置上出现字母 M

SELECT * FROM empWHERE ename LIKE '%M%' ;


但是,要提醒大家的是:“如果在使用 LIKE 的时候没有指定查询的关键字,则表示查询全部 

SELECT * FROM empWHERE ename LIKE '%%' ;

使用 LIKE 还可以方便的进行日期的查找功能。



2.1.16 范例:要求查询出在 1981 年雇佣的雇员信息

SELECT * FROM empWHERE hiredate LIKE '%81%' ;


2.1.17 范例:查询工资中包含 6 的雇员信息

SELECT * FROM empWHERE sal LIKE '%5%' ;



在操作条件中还可以使用:>、>=、=、<、<=等计算符号不等于符号:在 SQL 中如果要想使用不等于符号,可以有两种形式:“<>”、“!=”

范例:查询雇员编号不是 7369 的雇员信息
· 使用“<>”完成,比如:

SELECT * FROM emp WHERE empno<>7369




· 使用“!=”完成,比如:

SELECT * FROM emp WHERE empno!=7369 ;

(″!=″表示″不等于)  ″

 

你知道如何对结果进行排序(ORDER BY子句)吗? 

 

在 SQL 中可以使用 ORDER BY 子句对查询的结果进行排序,例如,现在使用查询全部的语句:
SELECT * FROM emp ;

以上就是返回所有数据。


此时,从查询结果可以发现,是按照雇员的编号进行排序的,那么此时如果要对使用指定的列进行排序,则就必须使用 ORDER BY 语句,语法格式如下:

SELECT {DISTINCT} * | 具体的列 别名 FROM 表名称 {WHERE 条件(s)} {ORDER BY 排序的字段 1,排序的字段 2 ASC|DESC} ASC 表示升序、DESC 表示降序


范例:要求按照工资由低到高排序

SELECT * FROM emp ORDER BY sal ;

以上就是排序后返回


之前是按照由低到高的顺序完成,是采用的升序的形式,现在要求使用降序的形式完成。实际上如果在排序的时候没有指定排序规则,则默认的排序规则是升序排列。


SELECT * FROM emp ORDER BY sal ASC ;



(默认是升序)



要想使用降序的方式完成,则使用 DESC 即可。

SELECT * FROM emp ORDER BY sal DESC ;

以上就是降序。



范例:要求查询出 10 部门的所有雇员信息,查询的信息按照工资由高到低排序,如果工资相等,则按照雇佣日期由早到晚排序。(此时存在两个排序条件,第一个是降序,第二个升序)

SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ;

以上就是两个条件排序。


塞巴斯接着说道:″我还能补充一些哦,以下是关于函数的知识:

单行函数

数据库系统中,每个数据库之间唯一不同的最大区别点就在与函数的支持上,使用函数可以完成一系列的操作功能。

单行函数语法:

function_name(column|expression,[arg1,arg2,...])

参数说明:
· function_name:函数名称
· column:数据库列名
· expression:字符串或计算表达式
· arg1,arg2:在函数中使用参数

单行函数分类:
· 字符函数:接受字符输入并且返回字符或数值
· 数值函数:接受数值输入并返回数值
· 日期函数:对日期型数据进行操作
· 转换函数:从一种数据类型转换为另一种数据类型
· 通用函数:NVL 函数、DECODE 函数


字符函数

字符函数是专门处理字符的,例如,可以将大写字符变为小 ,还能求出字符的长度。
范例:将小写字母变为大写字母

SELECT UPPER('smith') FROM DUAL ;



范例:一般用户在查询一个人姓名的时候有可能考虑到这个人的姓名是大写字母存的还是小写字母保存的呢?
· 那么此时,为了方便用户的使用就可以使用 upper 函数完成。

SELECT * FROM emp WHERE ename=UPPER('Smith') ;


还可以使用 lower()函数将一个字符串变为小写字母表示。

SELECT LOWER('HELLO WORLD') FROM dual ;



还可以使用 initcap()函数将单词的第一个字母大写

SELECT INITCAP('HELLO WORLD') FROM dual ;


范例;使用此函数将雇员表中的雇员姓名变为开头字母大写

SELECT INITCAP(ename) FROM emp ;



字符串除了可以使用“||”连接之外,还可以使用 CONCAT()函数进行连接操作。

SELECT CONCAT('hello ','world') FROM DUAL ;


此时已经完成了连接,但是此种方式肯定不如“||”好使

在字符函数中可以进行字符串的截取、求出字符串的长度、进行指定内容的替换
· 字符串截取:substr()
· 字符串长度:length()
· 内容替换:replace()


SELECT substr('hello',1,3) 截取字符串 , length('hello') 字符串长度 , replace('hello','l','x') 字符串替换 FROM DUAL ;


· Oracle 中 substr()函数的截取点是从 0 还是从 1 开始。
从 0 或从 1 开始效果是一样的,因为 Oracle 比较智能。

范例:要求显示所有雇员的姓名及姓名的后三个字符
(因为雇员姓名的字符串长度不一样,所以只能求出整个的长度再减去 2,这样进行截取操作。)

SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;


(此时,功能已经实现了,但是操作比较麻烦。实际上在 substr()函数中提供了一种非常方便的机制,可以采用倒着截取的方式,只要输入的位置是负数就表示倒着进行。)

SELECT ename,SUBSTR(ename,-3,3) FROM emp ;


数值函数

数值函数只要是包含以下几种:
· 四舍五入:ROUND()
· 截断小数位:TRUNC()
· 取余(取模):MOD


范例:执行四舍五入操作

SELECT ROUND(789.536) FROM dual ;


当然,在 ROUND()函数中也可以指定四舍五入的位数


范例:保留两位小数

SELECT ROUND(789.536,2) FROM dual ;


在使用 ROUND()函数中还有一点非常有意思,可以直接对整数进行四舍五入的进位。

SELECT ROUND(789.536,-2) FROM dual ;


TRUNC()与 ROUND()不同的是,在 TRUNC()操作中,不会保留任何的小数,而且小数点也不会执行四舍五入的操作。


范例:验证 TRUNC()函数

SELECT TRUNC(789.536) FROM DUAL ;



范例:通过 TRUNC()也可以指定小数点的保留位数

SELECT TRUNC(789.536,2) FROM DUAL ;



范例:使用负数表示位数

SELECT TRUNC(789.536,-2) FROM DUAL ;

back


范例:使用 MOD()函数可以进行取余的操作

SELECT MOD(10,3) FROM DUAL ;


《黑执事》双生子篇((SQL版)平行世界与幻想线)第1话 :SQL常用语句大全(超重要合集)的评论 (共 条)

分享到微博请遵守国家法律