sql语句

一、数据定义

1.基本表

定义:

create table <表名> (<列名> <数据类型> [列级完整性约束条件]
                  ,[ <列名> <数据类型> [列级完整性约束条件]  ]);

示例:

create table Course
    (Cno char(4) primary key,
    Cname char(40),
    Cpno char(4),
    Ccredit smallint,
    Foreign key (Cpno) references Course (Cno)
    );

ps:定义表的数据类型要指出变量类型和长度 ,eg. char(40)

修改:

alter table <表名>/*注意!!修改表里面只有这五种操作,加/删除约束,加/删除/修改列!!,是不允许修改约束的,只能先drop再add*/
[add [column] <新列名> <数据类型> [完整性约束] ]
[add <表级完整性约束>]
[drop [column] <列名> [cascade|restrict]]
[drop constraint <完整性约束名> [restrict|cascade]]
[alter column <列名> <数据类型>];
/*
    多个外键约束如sc表时候一定要加上约束名,以及使用on delete cascade可以更完整地约束
	constraint fk_sno FOREIGN KEY ( Sno ) REFERENCES S ( Sno ) on delete cascade,
	constraint fk_pno FOREIGN KEY ( Pno ) REFERENCES P ( Pno ) on delete cascade,
*/

删除:

drop table <表名> [restrict|cascade];

 

建表时外键&主键&用户自定义完整性约束check语句:

create table S
	(Sno char(5) primary key,
	Sname char(8),
	Ssex char(2) check (Ssex in ('男','女')),
	Sage smallint,
	Sdept char(2)
	);

create table T
	(Tno char(3) primary key,
	Tname char(8),
	Tsex char(2) check (Tsex in ('男','女')),
	Tdept char(2)
	);

create table P
	(Pno char(2) primary key,
	Pname char(20),
	Tno char(3) references T(Tno)
	);

create table SP
	(Sno char(5),
	Pno char(2),
	Grade smallint,
	primary key(Sno,Pno),
	foreign key(Sno) references S(Sno),
	foreign key(Pno) references P(Pno),
	check (Grade >= 0 and Grade <=100)
	)

Insert into插入多行语句:

INSERT INTO P ( Pno, Pname, Tno )
VALUES
	( '1', '数据库设计项目', '101' ),
	( '2', '无人机飞行设计项目', '103' ),
	( '3', '校园网络规划项目', '102' ),
	( '4', '操作系统设计项目', '101' ),
	( '5', '视觉处理项目', '102' ),
	( '6', '大模型构建项目', '104' );

二、数据查询

单表查询:

嵌套查询:

SELECT
	tname 
FROM
	T 
WHERE
	tno IN /*括号一定要加,集合一定要加括号!!*/
	(SELECT tno 
	FROM
		p
	WHERE
		pname = '无人机飞行设计项目');

eg.查询只参加一个项目的学生的学号。

select sno
from sp
group by sno/*必须使用group进行分组*/
having count(*) =1;/*只能用having语句跟在group by语句后面进行筛选,where语句用于group和聚集函数之前过滤数据*/

eg.查询参加了所有项目的学生姓名。

select sname
from s
where not exists/*两次not exists语句进行相关子查询,每次选一个sno,进行pno的循环,在sp中找出全部满足条件的*/
(	select *
	from p
	where not exists
	(	select *
	from sp
	where pno=p.pno and sno=s.sno
	)
)

eg.查询所有项目成绩均及格的学生的学号和平均成绩,其结果按平均成绩的降序排列。

select sno,avg(grade)
from sp sp1
where not exists/*not exists得有括号!!!*/
	(select *
	from sp sp2
	where sp1.sno=sp2.sno and sp2.grade<60)
group by sno
order by avg(grade) desc

eg.查询参与1号项目,且成绩排名第2的学生姓名。(成绩相同按相同名次处理,比如88,88,85,则85为第2名)

select sno
from sp 
where pno='1' and grade in(
	select max(grade)
	from sp
	where pno='1' and grade <(/*循环一次找到最大,再循环找到次大*/
		select max(grade)
		from sp 
		where pno='1'
	)
)

 

三、数据更新

 

插入:

插入元组:

insert into <表> [ 属性列1,属性列2... ]
values (常量1,常量2...)

插入子查询:

insert into <表> [ 属性列1,属性列2,... ]
子查询;
insert into dept_age(Sdept,Avg_age)
    select Sdept,AVG(Sage)
    from Student
    group by Sdept;

修改:update-set语句

update sp--表名
set grade = grade*0.95
where pno='4'

删除:

/*适用于单步调试功能,选定程序段来运行*/
set autocommit = false/*必须写上,否则自动提交就不能rollback回滚了*/

select*
from p;

delete 
from p
where pno='5';

rollback;

创建用户&授权

create user 'Root3'@'localhost'
identified by 'Root3'

/*必须单次对单个表授权,不能一起*/
grant select
on table s
to 'Root3'@'localhost'

grant select
on table p
to 'Root3'@'localhost'

grant select
on table t
to 'Root3'@'localhost'

grant all privileges
on table sp
to 'Root3'@'localhost'

以下是 CREATE USER 语句的基本语法:

CREATE USER [IF NOT EXISTS] account_name 
IDENTIFIED BY 'password';

  在 CREATE USER 关键字后指定帐户名称。帐户名称由两部分组成: username 和 hostname ,以 @ 符号分隔:

username@hostname

  username 是用户的名称。而 hostname 从用户连接到 MySQL 服务器的主机名。

  hostname 帐户名称的部分是可选的。如果省略它,用户可以从任何主机连接。

没有主机名的帐户名等效于:

username@%

 触发器自定义抛出异常中断:

CREATE TRIGGER before_insert_S  
BEFORE INSERT ON S  
FOR EACH ROW  
BEGIN  
    DECLARE rowCount INT;  
      
    -- 获取当前表中的行数  
    SELECT COUNT(*) INTO rowCount FROM S;  
      
    -- 如果表中的行数大于18,则阻止插入  
    IF rowCount > 18 THEN  
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot insert more than 18 rows into table S';  
    END IF;  
END

 

create trigger after_update_studentinfo
after update on student_info
for each row
begin
	if(new.id<>old.id) then-- if后必须有then!!!
		update student_login
		set id=new.id
		where id=old.id;
	end if;-- end if后面必须加分号!!!
end

 

posted @ 2024-04-30 12:08  蔡姬小媛  阅读(35)  评论(0)    收藏  举报