SQL 能做什么?
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可从数据库删除记录
SQL 可更新数据库中的数据
SQL 面向数据库执行查询
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
注:在SQL Server中默认对大小写是不敏感的
1、增 此处有4种方法:
a. 使用insert插入单行数据:
语法:insert into <表名> [列名] values <列值>
例:insert into Stuff (姓名, 性别,出生年月日) values ('李明','男','1995/7/7')
注意:如果省略表名,将依次插入所有列
b. 使用insert,select语句将现有表中的 数据添加到已有的新表中
语法:insert into <已有的新表> <列名> select <原表列名> from <原表名>
例:insert into Stuff ('姓名','地址','电子邮件')
select name,address,email
from Strdents
注意:查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致
c. 直接拿现有表数据创建一个新表并填充
语法:select <新建表列名> into <新建表名> from <源表名>
例:select name,address,email into tongxunlu from Strdents
d. 使用union关键字合并数据进行插入多行
语法:insert <表名> <列名> select <列值> union select <列值>
例:insert Students (姓名,性别,出生日期)
select '大宝','男','1995/7/7' union(union表示下一行)
select '二宝','男','19**/**/**'
2.删 有两种方法
a. 使用delete删除数据某些数据
语法:delete from <表名> [where <删除条件>]
例:delete from a where name='大宝'(删除表a中列值为大宝的行)
注意:删除整行不是删除单个字段,所以在delete后面不能出现字段名
b. 使用truncate table 删除整个表的数据
语法:truncate table <表名>
例:truncate table Stuff
注意:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能
用于有外建约束引用的表
3. 改 使用update更新修改数据
语法:update <表名> set <列名=更新值> [where <更新条件>]
例:update Stuff set 年龄=22 where 姓名='大宝'
注意:set后面可以紧随多个数据列的更新值(非数字要引号);where子句是可选的(非数字要引号),
用来限制条件,如果不选则整个表的所有行都被更新
4.1查
语法:select <列名> from <表名> [where <查询条件表达试>] [order by <排序的列名>[asc或desc]]
a.查询所有数据行和列
例:select * from a
说明:查询a表中所有行和
b.查询部分行列--条件查询
例:select i,j,k from a where f=5
说明:查询表a中f=5的所有行,并显示i,j,k3列
c.在查询中使用AS更改列名
例:select name as 姓名 from a where gender='男'
说明:查询a表中性别为男的所有行,显示name列,并将name列改名为(姓名)显示
d.查询空行
例:select name from a where email is null
说明:查询表a中email为空的所有行,并显示name列;SQL语句中用is null或者is not null
来判断是否为空行
e.在查询中使用常量
例:select name '杭州' as 地址 from a
说明:查询表a,显示name列,并添加地址列,其列值都为'杭州'
f.查询返回限制行数(关键字:top percent)
例1:select top 6 name from a
说明:查询表a,显示列name的前6行,top为关键字(oracle 中没有top关键字用rownum替代)
select * from a where rownum<6
例2: select top 60 percent name from a
说明:查询表a,显示列name的60%,percent为关键字
g.查询排序(关键字:order by , asc , desc)
例:select name
from a
where grade>=60
order by desc
说明:查询表中成绩大于等于60的所有行,并按降序显示name列;默认为ASC升序
h. SQL SELECT DISTINCT 语句
说明:在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出
不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
例:SELECT DISTINCT 列名称 FROM 表名称
4.2 模糊查询
a.注意:like运算副只用于字符串,所以仅与char和varchar数据类型联合使用
例:select * from a where name like '赵%'
说明:查询显示表a中,name字段第一个字为赵的记录
b.使用between在某个范围内进行查询
例:select * from a where age between 18 and 20
说明:查询显示表a中age在18到20之间的记录
c.使用in在列举值内进行查询例:
例:select name from a where address in ('北京','上海','杭州')
说明:查询表a中address值为北京或者上海或者杭州的记录,显示name字段
4.3分组查询
a.使用group by进行分组查询
例:select studentID as 学员编号,AVG(score) as 平均成绩 (注释:这里的score是列名)
from Score (注释:这里的Score是表名)
group by studentID
说明:在表Score中查询,按strdentID字段分组,显示strdentID字段和score字段的平均值;
select语句中只允许被分组的列和为每个分组返回的一个值的表达式,例如用一个列
名作为参数的聚合函数
b.使用having子句进行分组筛选
例:select studentID as 学员编号,AVG(score) as 平均成绩 (注释:这里的score是列名)
from Score (注释:这里的Score是表名)
group by studentID
having count(score)>1
说明:接上面例子,显示分组后count(score)>1的行,由于where只能在没有分组时使用,
分组后只能使用having来限制条件。
4.4. 多表联接查询
a.内联接
1).在where子句中指定联接条件
例:select a.name,b.chengji
from a,b
where a.name=b.name
说明:查询表a和表b中name字段相等的记录,并显示表a中的name字段和表b中的chengji字段
2).在from子句中使用join…on
例:select a.name,b.chengji
from a inner join b
on (a.name=b.name)
说明:同上。(查询表a和表b中name字段相等的记录,并显示表a中的name字段和表b中的chengji字段)
b.外联接
1).左外联接查询
例:select s.name,c.courseID,c.score
from strdents as s
left outer join score as c
on s.scode=c.strdentID
说明:在strdents表和score表中查询满足on条件的行,条件为score表的strdentID与strdents表中的sconde相同
2).右外联接查询
例:select s.name,c.courseID,c.score
from strdents as s
right outer join score as c
on s.scode=c.strdentID
说明:在strdents表和score表中查询满足on条件的行,条件为strdents表中的scode与score表的strdentID相同
5.创建数据库
语法:CREATE DATABASE 数据库名称
6.创建表
语法:CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
·········
)
例: create table customers
(
id int not null auto_increment,
name char(20) not null,
address char(50) null,
city char(50) null,
age int not null,
love char(50) not null default 'No habbit',
primary key(id)
)