SQL语句-2

第三章 Trigger

# 创建单个触发器
CREATE trigger trigger_name trigger_time[before/after] trigger_event[insert/update/delete]
ON table_name FOR EACH ROW trigger_stmt
/*
eg:
    create trigger ins_sum before insert
    on table_name 
    for each row set @sun=@sum+NEW.table_name
*/
# 创建有多个执行语句的触发器
CREATE TRIGGER trigger_name trigger_time[before/after] trigger_event[INSERT/UPDATE/DELETE]
ON table_name 
FOR EACH ROW 
    BEGIN
        语句执行列表
    END

# 查看触发器
SHOW TRIGGERS

# 在trigger表中查看触发器信息
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='<trigger_name>';

# 删除触发器
DROP TRIGGER [schema_name.]trigger_name

第四章 Groupby&Having

SELECT * FROM score
--属性取值相同的元素被分到一个组中
--然后对分组过后的进行操作
--统计每一个学生的平均分数
SELECT stu_id ,avg(stu_score) AS avg_stu_score
FROM score
GROUP BY stu_id

--统计每一科的平均分
SELECT class_id ,avg(stu_score) AS avg_class_score
FROM score
GROUP BY class_id

--统计每一科及格的人数
SELECT class_id ,count(stu_score) AS class_score60_count
FROM score
WHERE stu_score>=60
GROUP BY class_id

--统计学生平均分数在75以上的学科
SELECT class_id ,avg(stu_score) AS avg_class_score
FROM score
GROUP BY class_id
HAVING avg(stu_score)>=75

--统计学生平均分数在75以上的学生
SELECT stu_id ,avg(stu_score) AS avg_class_score
FROM score
GROUP by stu_id
HAVING avg(stu_score)>=75

--统计及格人数在4个的学科
SELECT class_id,count(stu_score) AS avg_class_score
FROM score
WHERE stu_score>=60
GROUP BY class_id
HAVING count(stu_score)>=4

--统计有不及格学科的学生以及不及格的科目总数
SELECT stu_id,count(stu_score) AS num
FROM score
WHERE stu_score<60
GROUP BY stu_id

--统计学科每一科最高分
SELECT class_id,max(stu_score) AS max_score 
FROM score 
GROUP BY class_id

--统计每一个学生最高的分数
SELECT stu_id,max(stu_score) AS max_score 
FROM score 
GROUP BY stu_id

--统计平均最高分学生的姓名
SELECT student.stu_id AS 学号,stu_name AS 姓名, avg(stu_score) AS 平均分
FROM student,score
WHERE student.stu_id=score.stu_id
GROUP BY student.stu_id,stu_name
HAVING AVG(stu_score)>=all(select AVG(stu_score) FROM score group by stu_id)

--统计学科每一科最高分和对应的学生好
SELECT t.class_id AS 学科号码,class.class_name AS 学科名称,score.stu_id AS 学生学号 ,student.stu_name AS 学生姓名,score.stu_score AS 最高分
FROM (SELECT class_id, max(stu_score) AS m FROM score group by class_id) AS t ,score LEFT OUTER JOIN student ON score.stu_id=student.stu_id,class
WHERE t.class_id = score.class_id AND t.m = score.stu_score AND t.class_id=class.class_id

-- GROUP_CONCAT() 表示每个分组各个字段的值显示出来
-- HAVING XXX 表示过滤分组
-- WITH ROLLUP 相关字段统计记录数量
-- LIMIT <num> 限制显示多少条记录










					




第五章 Select

go
SELECT * FROM student
--as 的使用方法 防止不同关系的属性在相同的情况下,发生冲突
SELECT stu_name AS Name 
FROM student

--  as 为字段和表名 取别名
go
SELECT T.stu_id AS ID,T.stu_name AS Name,C.class_name AS CName,S.stu_score AS SCore
FROM student AS T,class AS C,score AS S
WHERE T.stu_id=S.stu_id AND C.class_id=S.class_id  AND S.stu_score >=60
ORDER by S.stu_score desc--降序使用desc,升序asc

-- 内连接 [from] inner join             on[代替where]   
-- right[left] out join 右[左]连接
SELECT T.stu_id AS ID,T.stu_name AS Name,C.class_name AS CName,S.stu_score AS SCore
FROM student AS T INNER JOIN class AS C,score AS S
ON T.stu_id=S.stu_id AND C.class_id=S.class_id  AND S.stu_score >=60
ORDER BY S.stu_score DESC--降序使用desc,升序asc

go
/*
%:任意字符
_:一个字符
*/
SELECT  *
FROM student 
WHERE stu_name LIKE 'wang%' 


# union 保证选出的字段名类型要相等
go
SELECT stu_id 
FROM student
UNION   -- 并集: union all 不去除重复值   union 去除重复值
SELECT stu_id 
FROM score

go
SELECT stu_id 
FROM student
intersect   -- 交集
SELECT stu_id 
FROM score

go
SELECT stu_id 
FROM student
except   -- 差集
select stu_id 
from score

go
SELECT avg(stu_age) AS avg_age
FROM student

go 
SELECT avg(stu_score) AS avg_score
FROM score
WHERE stu_id=14401
go 
SELECT max(stu_score) --最大max,最小min
FROM score

SELECT sum(stu_score) 
FROM score


go 
SELECT count(stu_id) AS num_count
FROM score

go 
SELECT count(distinct stu_id) AS num_count --distinct 自动去除重复
FROM score

-- [not] in/ [not] between and / is [not] null /  and or /
SELECT xxx
FROM xxx
WHERE xxx IN (相关值)
ORDER BY xxx -- 默认升序asc  降序 desc

-- 不重复显示结果
SELECT DISTINCT xxx FROM table_name

-- 分组查询 [GROUP BY 字段] [HAVING <条件表达式>]
-- GROUP_CONCAT(xxx) as xxx 将分组每个字段显示出来

-- 某列的函数 avg count(* 空值也算一行  字段名  不计空值) max min sum
-- 子查询 any(任意一个子查询的值) all(所有子查询的值) 
-- 子查询 [not] exists(子查询的值是否存在)
-- 子查询 in 
-- 子查询 带比较符号查询

-- 正则表达式
...WHERE <某一字段> REGEXP '<正则表达式>'

第六章 Join

SELECT *
FROM score
JOIN student
    ON score.stu_id=student.stu_id


--左连接(右连接)
SELECT *
FROM score left outer
JOIN student
    ON score.stu_id=student.stu_id

--全连接(空值也会输出来)
SELECT *
FROM score full outer
JOIN student
    ON score.stu_id=student.stu_id

第七章 Index

--创建普通索引
CREATE TABLE book(
    bookid INT NOT NULL,
    bookname VARCHAR(255) NOT NULL,
    INDEX(bookid)
);

-- 查看表结构
SHOW CREATE TABLE book \G

-- 查看索引是否正在使用
explain select * from book where bookid=1000 \G

-- 创建唯一索引
CREATE TABLE book2(
    bookid2 INT NOT NULL,
    bookname2 VARCHAR(255) NOT NULL,
    UNIQUE INDEX(bookid2)
);

--创建单列索引
CREATE TABLE book3(
    bookid3 INT NOT NULL,
    bookname3 VARCHAR(255) NOT NULL,
    INDEX SingleIdx(bookid3)  # 后面括号指定索引长度【索引名】
);

--创建组合索引
CREATE TABLE book4(
    bookid4 INT NOT NULL,
    bookname4 VARCHAR(255) NOT NULL,
    INDEX MultiIdx(bookid4,bookname4) # MultiIdx为组合索引名
);
--创建全文索引 必须是char varchar text类型 默认InnoDB索引不支持全文索引
--全文索引引擎更改为 ENGINE=MyISAM
CREATE TABLE book5(
    bookid5 INT NOT NULL,
    bookname5 VARCHAR(255) NOT NULL,
    FULLTEXT INDEX FULLTxtIdx(bookname5)
);

--在已经创建的表中添加索引
ALTER TABLE <表名> add <相关索引> create index index_name
    ON <table_name>(index_length)

--删除索引
ALTER TABLE <table_name> drop index <index_name> drop index <index_name>
    ON <table_name>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值