SQL基本语句

SQL基本语句,第1张

掌握SQL四条最基本的数据作语句 Insert Select Update和Delete 练掌握SQL是数据库用户的宝贵财 富 在本文中 我们将引导你掌握四条最基本的数据作语句—SQL的核心功能—来依次介绍比较作符 选择断言以及三值逻辑 当你完成这些学习后 显然你已经开始算是精通SQL了 在我们开始之前 先使用CREATE TABLE语句来创建一个表 DDL语句对数据库对象如表 列和视进行定义 它们并不对表中的行进行处理 这是因为DDL语句并不处理数据库中实际的数据 这些工作由另一类SQL语句—数据作语言(DML)语句进行处理 SQL中有四种基本的DML作 INSERT SELECT UPDATE和DELETE 由于这是大多数SQL用户经常用到的 我们有必要在此对它们进行一一说明 我们给出了一个名为EMPLOYEES的表 其中的每一行对应一个特定的雇员记录 请熟悉这张表 我们在后面的例子中将要用到它 INSERT语句用户可以用INSERT语句将一行记录插入到指定的一个表中 例如 要将雇员John Smith的记录插入到本例的表中 可以使用如下语句 INSERT INTO EMPLOYEES VALUES ( Smith John Los Angles );通过这样的INSERT语句 系统将试着将这些值填入到相应的列中 这些列按照我们创建表时定义的顺序排列 在本例中 第一个值 Smith 将填到第一个列LAST_NAME中 第二个值 John 将填到第二列FIRST_NAME中……以此类推 我们说过系统会 试着 将值填入 除了执行规则之外它还要进行类型检查 如果类型不符(如将一个字符串填入到类型为数字的列中) 系统将拒绝这一次作并返回一个错误信息 如果SQL拒绝了你所填入的一列值 语句中其他各列的值也不会填入 这是因为SQL提供对事务的支持 一次事务将数据库从一种一致性转移到另一种一致性 如果事务的某一部分失败 则整个事务都会失败 系统将会被恢复(或称之为回退)到此事务之前的状态 回到原来的INSERT的例子 请注意所有的整形十进制数都不需要用单引号引起来 而字符串和日期类型的值都要用单引号来区别 为了增加可读性而在数字间插入逗号将会引起错误 记住 在SQL中逗号是元素的分隔符 同样要注意输入文字值时要使用单引号 双引号用来封装限界标识符 对于日期类型 我们必须使用SQL标准日期格式(yyyy mm dd) 但是在系统中可以进行定义 以接受其他的格式 当然 年临近 请你最好还是使用四位来表示年份 既然你已经理解了INSERT语句是怎样工作的了 让我们转到EMPLOYEES表中的其他部分 INSERT INTO EMPLOYEES VALUES ( Bunyan Paul Boston );INSERT INTO EMPLOYEES VALUES ( John Adams Boston );INSERT INTO EMPLOYEES VALUES ( Smith Pocahontas Los Angles );INSERT INTO EMPLOYEES VALUES ( Smith Bessie Boston );INSERT INTO EMPLOYEES VALUES ( Jones Davy Boston );INSERT INTO EMPLOYEES VALUES ( Jones Indiana Chicago NULL NULL);在最后一项中 我们不知道Jones先生的工薪级别和年薪 所以我们输入NULL(不要引号) NULL是SQL中的一种特殊情况 我们以后将进行详细的讨论 现在我们只需认为NULL表示一种未知的值 有时 像我们刚才所讨论的情况 我们可能希望对某一些而不是全部的列进行赋值 除了对要省略的列输入NULL外 还可以采用另外一种INSERT语句 如下 INSERT INTO EMPLOYEES( FIRST_NAME LAST_NAME HIRE_DATE BRANCH_OFFICE)VALUE( Indiana Jones Indianapolis );这样 我们先在表名之后列出一系列列名 未列出的列中将自动填入缺省值 如果没有设置缺省值则填入NULL 请注意我们改变了列的顺序 而值的顺序要对应新的列的顺序 如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空) SQL作将失败 让我们来看一看上述INSERT语句的语法图 INSERT INTO table [(column { column})]VALUES (columnvalue [{ columnvalue}]);和前一篇文幸谎颐怯梅嚼ê爬幢硎究裳∠睿罄ê疟硎究梢灾馗慈我獯问南睿ú荒茉谑导实腟QL语句中使用这些特殊字符) VALUE子句和可选的列名列表中必须使用圆括号 SELECT语句SELECT语句可以从一个或多个表中选取特定的行和列 因为查询和检索数据是数据库管理中最重要的功能 所以SELECT语句在SQL中是工作量最大的部分 实际上 仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通 SELECT语句的结果通常是生成另外一个表 在执行过程中系统根据用户的标准从数据库中选出匹配的行和列 并将结果放到临时的表中 在直接SQL(direct SQL)中 它将结果显示在终端的显示屏上 或者将结果送到打印机或文件中 也可以结合其他SQL语句来将结果放到一个已知名称的表中 SELECT语句功能强大 虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算 选择 (或称 限制 ) 但实际上它也可以完成其他两种关系运算— 投影 和 连接 SELECT语句还可以完成聚合计算并对数据进行排序 SELECT语句最简单的语法如下 SELECT columns FROM tables;当我们以这种形式执行一条SELECT语句时 系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表 这就是实现关系投影运算的一个形式 让我们看一下使用EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的 而我们在图 和图 中给出了查询的实际结果 我们将在其他的例子中使用这些结果) 假设你想查看雇员工作部门的列表 那下面就是你所需要编写的SQL查询 SELECT BRANCH_OFFICE FROM EMPLOYEES;由于我们在SELECT语句中只指定了一个列 所以我们的结果表中也只有一个列 注意结果表中具有重复的行 这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回) 要消除结果中的重复行 只要在SELECT语句中加上DISTINCT子句 SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEES;现在已经消除了重复的行 但结果并不是按照顺序排列的 如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果 SELECT DISTINCT BRANCH_OFFICEFROM EMPLOYEESORDER BY BRANCH_OFFICE ASC;这一查询的结果如表 所示 请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的 这就是我们想要对其进行排序的列 为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序 即使它们并不显示出来 列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列 如果你希望以降序排列 那么可以用关键字DESC 同样我们应该指出ORDER BY子句只将临时表中的结果进行排序 并不影响原来的表 假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表 除了工资括号中的内容 我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表 以下是你将要用到的语句 SELECT BRANCH_OFFICE FIRST_NAME LAST_NAME SALARY HIRE_DATEFROM EMPLOYEESORDER BY SALARY DESC HIRE_DATE DESC;这里我们进行了多列的选择和排序 排序的优先级由语句中的列名顺序所决定 SQL将先对列出的第一个列进行排序 如果在第一个列中出现了重复的行时 这些行将被按照第二列进行排序 如果在第二列中又出现了重复的行时 这些行又将被按照第三列进行排序……如此类推 这次查询的结果如表 所示 将一个很长的表中的所有列名写出来是一件相当麻烦的事 所以SQL允许在选择表中所有的列时使用号 SELECT FROM EMPLOYEES;这次查询返回整个EMPLOYEES表 如表 所示 下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项 允许在其中选择一项 ) SELECT [DISTINCT] (column [{ columns}])| FROM table [ { table}] <b lishixinzhi/Article/program/Oracle/201311/18760

关系表达式照着书本写就是了,这是三条SQL语句

(1) select t2jno, t2jname from p t1,j t2,spj t3 where t1pno = t3pno and t2jno = t3jno and t1color = 'red';(2) select sum(qty) from spj where jno = 'j2'; (3) select sname from s minus select sname from s, spj where ssno = spjsno and jno = 'j1';

1检索数据

SELECT prod_nameFROM Products;

#检索单列

SELECT prod_id, prod_name, prod_priceFROMProducts;

#检索多列

SELECT FROM Products;

#检索所有列

SELECT DISTINCTvend_id FROMProducts;

#检索不同的值

SELECTprod_name FROM Products LIMIT 5;

#返回不超过5行数据

SELECTprod_name FROM Products LIMIT 5 OFFSET 5;

#返回从第5行起的5行数据。LIMIT指定返回的行数,LIMIT带的OFFSET指定从哪儿开始。

2排序检索数据

SELECTprod_name

FROMProducts

ORDER BYprod_name;

#排序数据

SELECT prod_id, prod_price, prod_name

FROMProducts

ORDER BY prod_price, prod_name;

#按多个列排序

SELECT prod_id, prod_price, prod_name

FROMProducts

ORDER BY 2, 3;

#按列位置排序,第三行表示先按prod_price, 再按prod_name进行排序

SELECT prod_id, prod_price, prod_name

FROMProducts

ORDER BY prod_priceDESC, prod_name;

#prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序

3过滤数据

SELECT prod_name, prod_price

FROMProducts

WHERE prod_price< 10;

#检查单个值

SELECT prod_name, prod_price

FROMProducts

WHERE vend_id <> ‘DLL01’;

#不匹配检查

SELECT prod_name, prod_price

FROMProducts

WHERE prod_priceBETWEEN 5 AND 10;

#范围值检查

SELECT cust_name

FROMCUSTOMERS

WHERE cust_emailIS NULL;

#空值检查

4高级数据过滤

SELECTprod_id, prod_price, prod_name

FROMProducts

WHERE vend_id = ‘DLL01’ANDprod_price <= 4;

#AND *** 作符

SELECTprod_name, prod_price

FROMProducts

WHEREvend_id=’DLL01’ OR vend_id=’BRS01’;

#OR *** 作符

SELECTprod_name, prod_price

FROMProducts

WHERE (vend_id = ’DLL01’ORvend_id=’BRS01’)

ANDprod_price >= 10;

#求值顺序 AND的优先级高于OR

SELECTprod_name, prod_price

FROMProducts

WHERE vend_idIN (‘DLL01’,’BRS01’)

ORDER BY prod_name;

#IN *** 作符

SELECT prod_name

FROMProducts

WHERE NOTvend_id = ‘DLL01’

ORDER BY prod_name;

#NOT *** 作符

SELECT prod_name

FROMProducts

WHEREvend_id <> ‘DLL01’

ORDER BY prod_name;

#NOT *** 作符

1、创建两张测试表,

create table test_cj(name VARCHAR(20), remark varchar2(20));

create table test_kc(name VARCHAR(20), remark varchar2(20));

2、插入测试数据

insert into test_cj values('xh','cj_1');

insert into test_cj values('kcdh','cj_2');

insert into test_cj values('cj','cj_3');

insert into test_kc values('kcdh','kc_1');

insert into test_kc values('kcm','kc_2');

3、查询两张表的总记录数,select t, rowid from test_cj t union all select t, rowid from test_kc t,

4、编写sql,两张表进行关联,select tname, tremark, bremark from test_cj t, test_kc b where tname=bname,可以发现关联出kcdh的记录,

1、如图所示,打开了SQL Server 2008,并创建好了数据库。然后看当前是否是在自己要创建表的数据库中。

2、如图,选中好LX数据库,练习数据库。

3、或者在新建窗口中输入代码,USE LX,然后选中后运行它,一样进入到LX数据库中。如图所示。

4、之前有教过不用代码设计数据库的表,这里只讲用语句创建表。如图所示,创建表的代码格式如下。

5、创建一个员工表的实际代码,如图所示,简单的员工表,有员工号、员工姓名、员工所在部门构成。

6、接着,输入好代码后,设置一些主外键约束。

设学生课程数据库中有三个关系:

学生关系S(学号,姓名,年龄,性别)

学习关系SC(学号,课程号,成绩)

课程关系C(课程号,课程名)

其中

S#、C#、SNAME、AGE、SEX、GRADE、CNAME分别表示

学号、课程号、姓名、年龄、性别、成绩和课程名。

用SQL语句表达下列 *** 作

(1)检索选修课程名称为“MATHS”的学生的学号与姓名

SELECT

S学号,S姓名

FROM SC INNER JOIN C ON SC课程号 = C课程号 INNER JOIN S ON SC学号 = S学号

where C课程名 = 'MATHS'

(2)检索至少学习了课程号为“C1”和“C2”的学生的学号

SELECT 学号,iCount=Sum(iCount) From (

SELECT 学号,iCount=1 FROM SC Where 课程号 = 'C1' OR 课程号 = 'C2'

) A Group by 学号

(3)检索年龄在18到20之间(含18和20)的女生的学号、姓名和年龄

SELECT 学号,姓名,年龄 FROM S WHERE 性别='女' And 年龄 >= 18 And 年龄 <= 20

(4)检索平均成绩超过80分的学生的学号和平均成绩

SELECT FROM (

SELECT 学号,平均成绩=Avg(成绩) FROM SC Group By 学号

) A WHERE 平均成绩 > 80

(5)检索选修了全部课程的学生姓名

SELECT

S姓名

FROM

(

SELECT 学号 FROM(SELECT 学号,学习课程总数=Count(课程号),课程总数=Isnull((select count(课程号) From C),0) FROM SC Group By 学号) A Where 学习课程总数 = 课程总数

) L INNER JOIN S ON L学号 = S学号

(6)检索选修了三门以上的学生的姓名

SELECT

S姓名

FROM

(

SELECT 学号 FROM (SELECT 学号,课程数=sum(iCount) FROM (SELECT 学号,iCount=1 FROM SC) A GROUP BY 学号) A WHERE 课程数 > 3

) L INNER JOIN S ON L学号 = S学号

select

into

from语句

要求目标表table_4不存在,因为在插入时会自动创建表table_4,并将table_3中指定字段数据复制到table_4中。

可以考虑使用如下语句:

insert

into

dbotable_4

(sname,

semail)

(select

sname,

semail

from

table_3);

以上就是关于SQL基本语句全部的内容,包括:SQL基本语句、SQL语句:已知一关系数据库的模式如下:、数据库中常用的sql语句有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10149524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存