结构化查询语言(SQL)入门

零、引入数据库

SQL,即结构化查询语言。SQL是操作和检索关系数据库的标准语言,标准的SQL语句可用于操作任何关系数据库。

标准的SQL语句通常可分为以下几种类型:
1.查询语句:主要有select关键字完成,查询语句是SQL语句中最复杂,功能最丰富的语句;
2.DML(数据库操作语言)语句:主要有insert、update、delete三个关键字完成;
3.DDL(数据定义语言)语句:主要有create、alter、drop和truncate四个关键字完成;
4.DCL(数据控制语言)语句:主要有grant和revoke两个关键字完成;
5.事务控制语句:主要有commit、rollback和savepoint三个关键字完成。

SQL语句的关键字不区分大小写,在上面五种语句中,DCL语句用于为数据库用户授权,或者回收指定用户的权限,通常无须程序员操作。

一、DDL语句语法

标准建表语句:create table (mode_name) table_name (columnName1 datatype [defaul expr],); 如果有多行列定义,最后一行那句后面没有逗号!该表只是一个空表,如果使用子查询建表语句,则可以在建表的同时插入数据:create table (mode_name) table_name [column1,column2...] as subquery;(这个语法中新表的字段列表必须与子查询中的字段列表数量匹配),也可以使用这种create table (table_mode) table_name as select * from table_name2;
修改表结构语法使用alter table,修改包括增加列定义、修改列定义、删除列、重命名列等操作:
增加:alter table table_name add (column_name1 datatype [default expr],);
如果只是新增一列,仅在add后紧跟一个列定义即可,可以省略括号add table_name datatype;
修改列定义:alter table table_name modify column_name datatype [default expr];(该修改语句每次只能修改一个列定义)其中,default为指定默认值。
从数据表中删除列:alter table table_name drop column_name; (从数据表中删除列定义通常总是可以成功,删除列定义时将从每行中删除该列的数据,并释放该列在数据块中占用的空间。所以删除大表中的字段时需要比较长的时间,因为还要回收空间)
重命名数据表的语法结构:alter table table_name rename to new_table_name;
MySQL为ALTER TABLE提供了change选项,该选项也可以改变列名:alter table table_name change old_table_name new_table_name type [default expr];
删除表:drop table table_name;(表结构被删除,表对象不再存在;表里的所有数据也被删除;该表所有相关的索引、约束也被删除)
截断表:truncate table_name;相对于DML里的delete而言,truncate的速度要快得多。

数据库约束,通过约束可以更好地保证数据表里数据的完整性,约束是在表上强制执行的数据校验规则。除此之外,当表中数据存在相互依赖行时,可以保护相关的数据不被删除。
大部分数据库支持下面5种完整的约束:
1.NOT NULL:即非空约束,指定某个列不能为空;
2.UNIQUE:唯一约束,制定某列或者几列的组合不能重复;
3.PRIMARY KEY:主键,指定该列的值可以唯一的标识该条记录;
4.FOREIGN KEY:外键,指定该行记录从属于主表的一条记录,主要用于保证参照完整性;
5.CHECK:检查,制定一个布尔表达式,用于指定对应列的值必须满足该表达式。
(其中,对于CHECK约束,MySQL并不支持,所以不会起任何作用)
NOT NULL
SQL中的null具有如下特征:

  • 所有数据类型的值都可以是null,包括int、float、boolean等数据类型;
  • 与Java类似的是,空字符串不等于null

如果想要指定非空约束,直接在列定义后面加上NOT NULL即可。若要删除,则:modify column_name datatype null;
除此之外,也可以在使用alter table修改表时增加或者删除非空约束:alter table table_name modify column_name datatype not null;取消则把not null改为null。
UNIQUE
不能出现重复值但是能出现多个null值。
指定唯一约束,即在定义后面直接加UNIQUE。
如果需要为多列组合建立唯一约束,或者想自行指定约束名,则需要使用表级约束语法:unique (column_name),constraint unique_name unique(column_name)(使用表级约束语法建立唯一约束,使用表级约束语法建立唯一约束且指定约束名)。
增加唯一约束(直接添加即可)alter table table_name add unique(column_name1,...);
也可以使用modify关键字:alter table table_name modify table_name datatype unique;
删除唯一约束:alter table table_name drop index unique_name;
PRIMARY KEY
主键约束相当于非空约束加唯一约束,即既不允许出现重复值,也不允许出现null。
指定主键约束,直接定义后面加PRIMARY KEY。
表级约束:primary key(column_name1,column_name2);
删除:alter table table_name drop primary key;
为指定表增加主键约束:alter table table_name add primary key(column_name1,column_name2);
使用列级增加约束:alter table table_name modify column_name datatype primary key;
建立主键约束并且使其自增长:column_name datatype auto_increment primary key,
FOREIGN KEY
外键约束主要用于保证一个或两个数据表之间的参照完整性。
外键确保了相关的两个字段的参照关系:子表外键列的值必须在主表被参照列的值范围内,或为空。
当主表的记录被从表记录参照时,主表记录不允许被删除,必须先把从表里参照该记录的所有记录全部删除后,才可以删除主表的该记录。(还有一种方式,删除主表记录时级联删除从表中所有参照该记录的从标记录)
从表外键参照的只能是主表主键列或者唯一键列,同一个表内可以有多个外键。
采用列级约束语法建立外键可直接使用references关键字:指定一列参照其他表的其他列foreign_column_name datatype references primary_table_name(primary_column_name);
表级约束语法:foreign key(foreign_column_name) references table_name(primary_colunm_name);
可以用constraint来指定约束的名字:constraint foreign_key_name foreign key(foreign_column_name) references table_name(primary_column_name);
多列外键使用表级约束:foreign key(foreign_column_name1,foreign_column_name2) references table_name(primary_column_name1,primary_column_name2);
删除外键约束:alter table table_name drop foreign key foreign_key_name;
增加外键约束:alter table table_name add foreign key(foreign_column_name1,foreign_column_name2) references table_name(primary_column_name1,primary_column_name2);
其中,外键约束不仅可以参照其他表,而且可以参照自身,这种参照自身的情况通常被称为自关联。
如果想定义当删除主表记录时,从表记录也会随之删除,则需要在建立外键约束后添加on delete cascade(删除主表记录时,把参照该主表记录的从表记录全部级联深处)或添加on delete set null(指定当删除主表记录时,把参照该主表记录的从表记录的外键设为null)。

索引,存放在模式(schema)中的一个数据库对象。创建索引的唯一作用就是加速对表的查询,索引通过使用快速路径访问方法来快速定位数据,从而减少了磁盘的I/O。
索引作为数据库对象,在数据字典中独立存放,但不能独立存在,必须属于某个表。
创建与删除索引:当在表上定义主键约束、唯一约束和外键约束时,系统会为该数据列自动创建对应的索引,同样的,当数据表被删除时,该表上的索引自动删除。手动创建:create index index_name on table_name(column_name...);删除: drop index index_name on table_name;
索引的好处就是可以加速查询,坏处是当数据表中的记录被添加、删除、修改时,数据库系统需要维护索引,因此有一定的系统开销;而且存储索引信息需要一定的磁盘空间。

视图,一个或多个数据表中数据的逻辑显示。
使用视图的好处:1.可以限制对数据的访问;2.可以使复杂的查询变得简单;3.提供了数据的独立性;4.提供了对相同数据的不同显示。
创建视图:create or replace view view_name as subquery(查询语句);
限制修改:create or replace view view_name as subquery with check option;
删除:drop view view_name;
所谓视图的本质,就是一条被命名的SQL查询语句

二、DML语句语法

与DDL操作数据库对象不同,DML语句主要操作数据表里的数据,使用DML可以完成:1.插入新数据;2.修改以有数据;3.删除不需要数据。
DML语句由insert intoupdatedelete from三个命令组成。

insert into:
该语句用于向指定数据表中插入记录。对于标准的SQL语句而言,每次只能插入一条记录:insert into table_name(column_name1...) values(value_name1...); 执行插入操作时,表名后面可以用括号列出所有需要插入值的列名,而values后用括号列出对应需要插入的值。
如果没有在表后用括号列出所有列,则需要为所有列指定值,若不确定则分配个null:insert into table_name values(null...,value);
当向外键列里插值时,外键列的值必须是被参照列里已有的值。
带有子查询的插入语句可以一次插入多条记录:insert into table_name1(column_name1) select column_name2 from table_name2;

update:
update语句用于修改数据表记录,每次可修改多条记录,用where可以限定修改哪些记录。where就相当于if一样。若无where就相当于where的表达值总是true,即所有记录都会被修改。
修改通用语法:update table_name set column1=value1,... [where condition];

delete from:
该语句用于删除指定数据表的记录,无需指定列名应为总是整行的删除。
语法格式:delete from table_name [where condition];
若不加condition则会全部删除。

对于select:
单表查询:select column_name1,column_name2... from table_name [where condition];
默认查所有行所有列数据:select * from table_name
select会默认的所有符合条件的记录全部选出来,即使完全一样也都打印。可以在select后面加一个distinct关键字去重复。

SQL常见函数:
ifnull(expr1,expr2):如果expr1为null,则返回expr2,否则返回expr1。
nullif(expr1,expr2):如果expr1和expr2相等,则返回null,否则返回expr1。
if(expr1,expr2,expr3):如果expr1为true不等于0和null,则返回expr2,否则返回expr3。
isnull(expr1):若expr1为null返回true,否则返回false。
avg(expr):计算多行expr的平均值。其中expr可以为变量、常量或数据列,但类型必须为数值型。
count(expr):计算多行expr的总条数。其中expr可以是变量、常量或数据列,数据类型可以为任意。
min(expr),max(expr):计算多行expr的最大or最小值。其中expr可以是变量、常量或数据列,数据类型可以为任意。
sum(expr):计算多行expr的总和,其中expr可以是变量、常量或数据列,但其数据类型必须是数值型;可以用distinct来不计算重复值。

SQL92的连接查询:
如果连接条件要求两列值相等,这称为等值连接,否则称为非等值连接。如果没有任何的连接条件,这称为广义笛卡尔积。SQL92中多表连接查询的语法格式如下:select column_name1,column_name2... from table_name1 table_name2... [where condition];
调用函数举例:select s.* , teacher_name from student_table s , teacher_table t where s.j_teacher=t.teacher_id;
SQL99的连接查询:
比起SQL92,SQL99连接查询的可读性更强。
交叉连接:效果等同于SQL92中的广义笛卡尔积:cross foin table_name t;
自然连接:自然连接会以两个表中同名列作为连接条件:如果没有同名,则于交叉连接效果完全一样:natural join table_name t;
using子句连接:using自己可以指定一列或多列,用于显式指定两个表中的同名列作为连接条件。即比起自然连接,可以指定哪些同名作为连接条件:join table_name t using(column_name);
on子句连接:SQL99语法的连接条件放在on子句中指定,且每个on子句只能指定一个连接条件。即如果需要进行N表连接,则需要有N-1个join…on对:join table_name t on s.column_name1=t.columne_name2;on后可以为等值或非等值。

子查询就是指在查询语句中嵌套另一个查询,子查询可以支持多层嵌套。
子查询出现位置:from语句后当成数据表,这种用法也被称为内视图;出现在where条件后作为过滤条件的值。
子查询要用括号括起来,把子查询当成数据表时(出现在from之后),可以为该子查询起别名,尤其是作为前缀来限定数据列时,必须给子查询起别名。

集合运算:
为了对两个结果进行集合运算,这两个结果集所包含的数据列的数量必须相等且数据类型必须一一对应。
union运算:select 语句 union select 语句并运算。
minus运算:where(column_name1,column_name2) not in (select column_name3,column_name4 from table_name);差运算。
intersect运算:join table_name on(column_name1=column_name2 and column_name3=column_name4);交运算。

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/96013530