SQL相关

模糊查询

SELECT 字段 FROM 表 WHERE 某字段 LIKE 条件;

关于条件部分,有以下匹配模式:

%:表示零个或多个字符


可以匹配任意类型和任意长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。

select * from user where username like '%张%'; 将会把user这张表里面,列名username中含有张的记录全部查询出来。

如果需要找到user这张表里面,字段username中既有张,又有李的记录,可以使用and条件:

select * from user where username like '%张%' and username like '%李%';

可以查询出来所有包含张和李的所有内容,张和李所在的前后位置无所谓。

select * from user where username like '%李%张%';

查出来包含李张的内容,但是查不出来张李的内容。

_:表示任意单个字符


匹配单个任意字符,它常用来限制表达式的字符长度。

select * from user where username like '小';

只能找到张小明这样username为三个字且中间一个字是小的内容。

select * from user where username like '小__';

只能找到小坏蛋这样username为三个字且第一个字是小的内容。

[]:表示括号内所列字符中的一个(类似正则表达式)。


指定一个字符、字符串或范围,要求所匹配的对象为他们中的任一个。

如[]内有一系列字符(01234,abcde之类的)则可略写为0-4,a-e

select * from user where username like '老[0-9]';

将找出“老1”、“老2”、……、“老9”;

[^]:表示不在括号所列之内的单个字符。


其取值和[]相同,但它所要求匹配对象为指定字符以外的任一个字符。

select * from user where username LIKE'[^李王秦]飞';

将找出不是“李飞” "王飞”“秦飞“,而是"张飞"等。

举例


1、LIKE’Mc%’ 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。

2、LIKE’%inger’ 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。

3、LIKE’%en%’ 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。

4、LIKE’_heryl’ 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。

5、LIKE’[CK]ars[eo]n’ 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。

6、LIKE’[M-Z]inger’ 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。

7、LIKE’M[^c]%’ 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

sql实例大全

-- select示例

-- 1.查询全部,*代表所有列。性能差。
SELECT * FROM t_student;

-- 2.指定列查询。查询时可以指定要查询的列。
SELECT id,`name`,pinyin,sex,birthday FROM t_student;

-- 3.列起别名。使用as 关键字,可以省略。
SELECT id as 编号,`name` as 姓名,pinyin 拼音,sex 性别,birthday 出生日期 FROM t_student;

-- 4.列运算。对于某些列可以进行算术运算
SELECT id,`name`,height+10 修正身高 FROM t_student;

-- 5.行条件筛选,使用where关键字
-- 比较运算符。= > < >= <= != <>
SELECT id,`name`,pinyin FROM t_student WHERE id = 20;
SELECT id,`name`,pinyin FROM t_student WHERE id <> 20;
SELECT id,`name`,pinyin FROM t_student WHERE id <= 20;
SELECT id,`name`,height FROM t_student WHERE height+10>175;

-- 6.逻辑运算符 and or not
SELECT id,`name`,height,weight 
FROM t_student where height>175 and weight < 90

SELECT id,`name`,height,weight 
FROM t_student where sex = '女' or weight < 60

-- 查询身高不大于185
SELECT id,`name`,height,weight 
FROM t_student WHERE height <= 160

SELECT id,`name`,height,weight 
FROM t_student WHERE NOT height > 160

-- 7.字符串模糊匹配。like关键字,%代表任意个字符,_代表一个字符
SELECT id,`name` FROM t_student WHERE `name` LIKE '李%'
SELECT id,`name` FROM t_student WHERE `name` LIKE '%晓%'
SELECT id,`name` FROM t_student WHERE `name` LIKE '章_'
SELECT id,`name` FROM t_student WHERE `name` LIKE '张_%'

-- 8.正则表达式匹配。
SELECT id,`name`,email FROM t_student 
WHERE email RLIKE '\\w{10,20}'

-- 9.查询结果去重 distinct。慎用。
SELECT DISTINCT height FROM t_student;

-- 10.限定行查询。查询第10行到第20行。limit关键字
-- 第1个参数表示从第几行开始查,第2个参数表示查询出多少条
SELECT * FROM t_student WHERE sex = '男' LIMIT 5,20
SELECT * FROM t_student WHERE sex = '男' LIMIT 20

-- 11.显示结果排序。如果不指定任何排序,则默认按行插入顺序排序。
-- ORDER BY 列 asc|desc,asc默认,可省略
SELECT * FROM t_student;
SELECT * FROM t_student ORDER BY pinyin LIMIT 20
SELECT * FROM t_student ORDER BY weight DESC
-- 按照多列排序
SELECT * FROM t_student ORDER BY weight DESC,height ASC

-- 12.聚合函数
SELECT max(height) FROM t_student; -- 最大值
SELECT min(weight) FROM t_student; -- 最小值
SELECT sum(height) FROM t_student; -- 求和
SELECT count(0) FROM t_student; -- 行数,个数
SELECT count(id) FROM t_student; -- 行数,个数
SELECT count(*) FROM t_student; -- 行数,个数
SELECT avg(height),sum(height)/count(0) FROM t_student; -- 求平均值
SELECT sum(height+10) FROM t_student;
SELECT sum(sex = '女') FROM t_student; -- 参数为bool值
SELECT count(0) FROM t_student WHERE sex = '女';

-- 13.分组。分组统计。GROUP BY,分组只能进行聚合查询。
-- 查询出的列只能是分组列,可聚合函数列
select sex,count(0) FROM t_student GROUP BY sex;
select sex,max(height) FROM t_student GROUP BY sex;

-- 14.多列分组。只能显示分组列和聚合函数
SELECT class_id,sex,count(0)
FROM t_student GROUP BY class_id,sex 
ORDER BY class_id 

-- 15.分组之后的二次筛选。having分组之后的筛选
-- where在group by之前进行筛选
SELECT class_id,sex,count(0) cnt
FROM t_student WHERE id > 20
GROUP BY class_id,sex 
HAVING cnt > 25 and sex = '女'
ORDER BY class_id 

-- 16.bewteen ... and 
SELECT * FROM t_student WHERE id BETWEEN 10 AND 20
SELECT * FROM t_student WHERE id >= 10 AND id <= 20

-- 表连接,子查询

-- 17. = 子查询,子查询只能返回唯一的值
SELECT stu_id,class_id,`name` FROM t_student
WHERE class_id = (
    SELECT id FROM t_class 
    WHERE class_name = '100802-JAVA'
)

-- 18. IN子查询,NOT IN子查询。in可以用常量值
SELECT stu_id,class_id,`name` FROM t_student
WHERE class_id IN (
    SELECT id FROM t_class 
    WHERE class_name LIKE '%JAVA'
)

-- 19. exists子查询,not exists
SELECT * FROM t_student
WHERE EXISTS (SELECT id FROM t_student WHERE height > 180)

-- 20.all与any结合子查询
SELECT * FROM t_student where height > all(
    SELECT height FROM t_student WHERE id BETWEEN 1 AND 10
)
SELECT * FROM t_student where height > any(
    SELECT height FROM t_student WHERE id BETWEEN 1 AND 10
)

-- 21.列子查询,相关子查询,查询性能较弱
SELECT id,stu_id,`name`,class_id,(SELECT class_name FROM t_class WHERE id = class_id) FROM t_student


-- 22.表子查询
SELECT * FROM (SELECT * FROM t_student WHERE height > 175) t

-- 视图
SELECT * FROM v_girls WHERE height > 165

-- 表连接
-- 23.内连接,inner join on 连接条件
-- 使用频率最高的一种连接
-- 左右,必须同时满足连接条件才显示。
SELECT stu_id,`name`,class_id,t2.class_name,t2.begin_time FROM t_student t1
INNER JOIN t_class t2 ON t1.class_id = t2.id
ORDER BY stu_id

SELECT t1.id,t1.stu_id,t1.`name`,t1.class_id,t2.id,t2.class_name FROM t_student t1
INNER JOIN t_class t2 ON t1.class_id = t2.id
WHERE t1.id < 20
ORDER BY stu_id

-- 外连接 
-- 左外连接:left outer JOIN,left join,简称为左连接
-- 右外连接: right outer join, right join,简称为右连接
-- 全外连接(mysql不支持)full outer join,full join.
SELECT t1.id,t1.stu_id,t1.`name`,t1.class_id,t2.id,t2.class_name FROM t_student t1
left JOIN t_class t2 ON t1.class_id = t2.id
WHERE t1.id <= 5
ORDER BY stu_id


-- 右连接
SELECT t1.id,t1.stu_id,t1.`name`,t1.class_id,t2.id,t2.class_name FROM t_student t1
right JOIN t_class t2 ON t1.class_id = t2.id
ORDER BY stu_id

-- 
SELECT t1.id,class_name,major_id,t2.`major_name` FROM t_class t1
INNER JOIN t_major t2 on t1.major_id = t2.id

SELECT t1.id,stu_id,`name`,class_id,t2.major_id,t3.major_name FROM t_student t1
INNER JOIN t_class t2 ON t1.class_id = t2.id
INNER JOIN t_major t3 on t2.major_id = t3.id

-- 联合查询:将两个结果集合并到一起
-- union all:合并但不去重
-- union :合并之后,去重
SELECT * FROM t_student WHERE id <= 10
UNION
SELECT * FROM t_student WHERE id <=20

-- NULL字段
SELECT * FROM t_student WHERE class_id IS NULL
SELECT * FROM t_student WHERE class_id IS NOT NULL
SELECT * FROM t_student WHERE NOT class_id IS NULL



-- insert示例
-- 24.insert
-- 增。不指定列,则按全部列顺序指定要插入的值
INSERT INTO t_class 
VALUES (300,'缓慢学习班','2005-10-10','2006-10-10',NULL,20,0,NULL)

-- 指定要插入的列
INSERT INTO t_class (class_name,begin_time,end_time) 
VALUES ('疯狂学习班','2000-10-10','2001-10-10')
-- 插入选中的结果集
INSERT INTO t_class (class_name,begin_time,end_time)
SELECT `name`,birthday,birthday FROM t_student WHERE id = 200



-- update示例
-- Update,更新操作
UPDATE t_student
set `name` = '孙小美'
WHERE id = 1

-- 如果没有指定where条件,则修改全表
UPDATE t_student
set `name` = '高富帅',weight = 90,email = '111@222.com'
WHERE height > 180

-- 支持表连接
UPDATE t_student t1 INNER JOIN t_class t2 on t1.class_id = t2.id
set t1.`name` = 'java大牛'
WHERE class_name like '%java'



--delete示例

-- 删除
DELETE FROM t_student WHERE id = 1
DELETE FROM t_major



其他
-- DDL

TRUNCATE TABLE t_teacher

--函数

SELECT now();
SELECT YEAR(now())
SELECT MONTH(now())
SELECT MD5('123')
SELECT CONCAT('1','2',name) FROM t_student
SELECT LENGTH(`name`) FROM t_student  -- 字节
SELECT CHAR_LENGTH(`name`) FROM t_student -- 字符个数

-- 自定义函数

CREATE FUNCTION f_jiecheng(n int) RETURNS BIGINT
BEGIN
    DECLARE result BIGINT DEFAULT 1; -- 结果
    DECLARE i int DEFAULT 1; -- 计数器

    WHILE i <= n DO
        SET result = result * i;
        SET i = i + 1;
    END WHILE;

    RETURN result;
END;


SELECT f_jiecheng(10);


CREATE FUNCTION bmi(height int,weight decimal) RETURNS VARCHAR(10)
BEGIN
    IF height - 105 > weight THEN
        RETURN '超重了';
    ELSE
        RETURN '正常';
    end if;

end;


SELECT stu_id, bmi(height,weight) from t_student


-- 存储过程

create PROCEDURE p_get_height()
BEGIN
    SELECT stu_id,height FROM t_student;
end;

call p_get_height();

-- 存储过程,清理无效的学生,班级不正确的
create PROCEDURE p_clear_invalid_student()
BEGIN

    DELETE FROM t_student
    WHERE id in (
        SELECT t1.id FROM t_student t1
    LEFT JOIN t_class t2 on t1.class_id = t2.id
    WHERE t2.id IS NULL
    );


end ;


DELETE FROM t_student
    WHERE id in (
        SELECT id from (SELECT t1.id FROM t_student t1
        LEFT JOIN t_class t2 on t1.class_id = t2.id
        WHERE t2.id IS NULL) t
    );

call p_clear_invalid_student()

-- 相关子查询
UPDATE t_class t1
set student_cnt = (
    SELECT count(0) FROM t_student WHERE class_id = t1.id
)

UPDATE t_class set student_cnt = 0


create PROCEDURE p_calc_class_count()
BEGIN

    DECLARE b_end int DEFAUlt 0;
    -- 班级编号
    DECLARE cid int; -- 存储班级编号的
    declare count int; -- 存储人数

    -- 游标的使用
    DECLARE cur CURSOR FOR SELECT id FROM t_class;
    -- 当游标到头时,执行的操作
    DECLARE CONTINUE HANDLER FOR NOT found set b_end = 1;


    -- 打开游标
    open cur;
    FETCH cur into cid;

    WHILE b_end < 1 DO
        SELECT count(0) INTO count FROM t_student WHERE class_id = cid;

        UPDATE t_class set student_cnt = count WHERE id = cid;

        FETCH cur into cid;
    END WHILE;

    close cur;

end;

call p_calc_class_count()


INSERT into t_student (stu_id,class_id,`name`,sex)
VALUES ('0000',1,'钱夫人','无')

-- ddl,创建触发器
CREATE TRIGGER tr_after_student_insert 
AFTER INSERT ON t_student FOR EACH ROW
BEGIN
    UPDATE t_class set student_cnt = student_cnt + 1
    WHERE id = new.class_id;
end;


INSERT into t_student (stu_id,class_id,`name`,sex)
VALUES ('1111',1,'阿土伯','1')

限制查询结果

-- 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
-- 返回第 3 ~ 5 行
SELECT * FROM mytable LIMIT 2, 3;

SQL注入与解决办法

一文搞懂什么是SQL注入---SQL注入详解 - 掘金 (juejin.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值