数据库sql

460 阅读5分钟

数据库

1.SQL语言的五个部分

1.  数据查询语言(Data Query Language,DQL):DQL主要用于数据的查询,其基本结构是:

​ 使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据

  1. 数据操作语言(Data Manipulation Language,DML):DML主要用于对数据库中的数据进行增加、修改和删除的操作针对表中的数据。其主要包括:
  • INSERT:增加数据
  • UPDATE:修改数据
  • DELETE:删除数据
  1. 数据定义语言(Data Definition Language,DDL):DDL主要用针对是数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)进行创建、修改和删除操作针对数据库对象其 主要包括
  • CREATE:创建数据库对象
  • ALTER:修改数据库对象
  • DROP:删除数据库对象
  1. 数据控制语言(Data Control Language,DCL):DCL用来授予或回收访问数据库的权限,其主要包括:
  • GRANT:授予用户某种权限
  • REVOKE:回收授予的某种权限
  1.  事务控制语言(Transaction Control Language,TCL):TCL用于数据库的事务管理。 其主要包括:
  • START TRANSACTION:开启事务

  • COMMIT:提交事务

  • ROLLBACK:回滚事务

  • SET TRANSACTION:设置事务的属性

    表的创建与定义

    sql语句:

   create table user(
   id integer primary key auto_increament, 
   username varchar(30UNIQUE,
   password varchar(30not null,
   Id_P int,
   FOREIGN KEY (Id_P) REFERENCES Persons(Id_P),
   usercreatstart datetime,
   usercreatfinal datetime,   
   check (usercreatfinal>usercreatstart)    
   )
  • primary key 主键
  • auto_increament 自动增加
  • UNIQUE 唯一,不能重复
  • not null 不为空
  • FOREIGN KEY 外键 要与 REFERENCES与那个表关联
  • check 约束条件
  • char的长度是不可变的,而varchar的长度是可变的,定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的,char的存取数度还是要比varchar要快得多,因为其长度固定,char付出的是空间的代价

  • datetime :‘YYYY-MM-DD HH:MM:SS’或‘YYYYMMDDHHMMSS’格式的字符串表示(sql sever中)

  • numeric :数值型,Numeric(10,2)是指:字段是数字型,长度为10,小数为2位。

    ALTER table:修改数据库对象

    alter table r add birthday date:增加新属性

    alter table r modify(id char(10)):修改属性

    DROP table:删除数据库对象

    drop table r:删除表r

  • cascade(级联)全部删除

  • restrict(限制) 确保只有不存在相关视图和完整性约束才能删除

    删除表字段 alter table student drop column name

    索引

    建立索引目的:加快查询速度

    建立:create (unique|clustered)索引名 ON 表名 (column_name)

    删除索引:drop index [indexname] on mytable;

    修改:alter mytable add index [indexname] on(username(length))

    查询:show index from table_name \g

    增删改SQL语句

  1. 增加数据 :INSERT INTO 表名称 (id,name…)VALUES (值1, 值2,….)

    没出现的列新元组在这些列上取空值,若没有指明列那么新插入的元组必须都要有属性列上都要有值

  2. 删除数据:DELETE FROM 表名称 WHERE 列名称 = 值

  3. 修改数据:update <表名> set <列名=更新值> [where <更新条件>]

SQL语句查询

sql语句:select (all|distinct)<列名> from <表名> [where <查询条件表达试>] group by<列名>(having 条件 )[order by <排序的列名>[asc或desc]] limit[n,m]

默认按照升序(asc)对记录进行排序,distinct 去除重复值

limit[n,m]表示分页,其中limit[0,5]表示1-5的5条数据,limit[(n-1)*pagesize,pagesize],页面总数=总数据/页面大小

操作符 描述

= 等于(IN 可以是一个结果集,但结果集只有一个值时“=”等价于“IN” )
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内 如:select * from emp where sal between 1000 and 3000;
LIKE 搜索某种模式为模糊查询(百分号 %:任意字符,下划线 _ :单个字符) 如:select * from emp where ename like '%o%';-- 查询忽略大小写

聚集函数

平均值:avg

最小值:min

最大值:max

总和:sum

计数:count

group by 和 having

聚集函数前面必须用group by 中having

任何没有出现在group by字句中的属性,如果出现在select中它只能出现在聚集函数内部,如根据学院分不能将学生姓名输出没在select中

分组的概念:就是让经过计算的查询结果根据某一个或者多个字段分成一组一组(一行一行)的排列显示。,

sql :select name ,age ,sum(number)from student ,teacher where student.noid=teacher.noid group by student.name having sum(number)>5;

题:编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

解:

select s1.Score,count(distinct(s2.score)) Rank
from
Scores s1,Scores s2
where
s1.score<=s2.score
group by s1.Id
order by Rank

多表查询

左外连接

SQL:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件

题:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息

select p.FirstName,p.LastName,a.City,a.State
from
person p left join address a
on
p.personid=a.personid

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

exists

exists表示存在量词,带有exists谓词的子查询,该类子查询的目标列为

EXISTS语句:执行student.length次先查询外表,而IN 语句:只执行一次查询内表。如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。注意exists后要是select *