1.concat拼接字符串函数

  • concat(参数1, 参数2, 参数3, 参数n)

    • 参数可以是数字,也可以是字符串
    • 把所有的参数连接成一个完整的字符串
-- 例 1:把 12,34,’ab’拼接为一个字符串’1234ab’
select concat(12, 34, 'ab');

2.length返回字符串字符的个数

  • 一个utf8格式的汉字,length返回3
-- 例 2:计算字符串’abc’的长度
select length('abc');

-- 例 3:计算字符串’我和你’的长度
SELECT length('我和你');


-- 例 4:计算字符串’我和you’的长度
SELECT length('我和you');

3.mysql内置函数可以在where条件后面使用

-- 例 4:查询表 students 中 name 长度等于 9(三个 utf8 格式的汉字)的学生信息
SELECT * from students where length(name) = 9;

4.left从字符串左侧截取指定数量字符

  • left(字符串, n)

    • n代表从字符串左侧截取n个字符
-- 例 5:截取字符串’我和你abc’的左端 3 个字符
select left('我和你abc', 3);

-- 例 6:截取字符串’我和你abc’的左端 4 个字符
select left('我和你abc', 4);

-- 例 6:截取字符串’abc我和你’的左端 4 个字符
select left('abc我和你', 4);

5.right从字符串右侧截取指定数量的字符

  • rigth(字符串, n)

    • n代表从字符串右侧截取n个字符
-- 例 5:截取字符串’我和你abc’的右端 3 个字符
select right('我和你abc', 3);

-- 例 5:截取字符串’我和你abc’的右端 4 个字符
select right('我和你abc', 4);

6.substring从字符串指定位置截取指定数量字符

  • substring(字符串, 起始位置, n)

    • 起始位置从1开始
    • n代表截取的数量
-- 例 7:截取字符串’我和你abc’从第 2 个字符开始的 3 个字符
select substring('我和你abc', 2, 3);


-- 例 7:截取字符串’我和你abc’从左侧开始的 3 个字符
select substring('我和你abc', 1, 3);

-- 例 7:截取字符串’我和你abc’从第 4 个字符开始的 1 个字符
select substring('我和你abc', 4, 1);

7.内置函数可以用在select显示的字段名中

-- 例 8:截取 students 表中所有学生的姓
SELECT left(name, 1) from students;
SELECT substring(name, 1, 1) from students;
  • 课堂练习答案
-- 练习 1:查询 students 表的 card 字段,截取出生年月日,显示李白的生日
SELECT substring(card, 7, 8) from students where name = '李白';

-- 练习 2:查询 students 表的所有学生信息,按生日从大到小排序(
SELECT * from students ORDER BY substring(card, 7, 8);

8.ltrim去除字符串左侧空格

  • ltrim(带空格的字符串)
-- 例 1:去除字符串' abcd '左侧空格

SELECT ltrim('         abcd ');

9.rtrim去除字符串右侧空格

  • rtrim(带空格的字符串)
-- 例 1:去除字符串' abcd     '右侧空格
SELECT rtrim(' abcd     ');
select concat(rtrim(' abcd     '), '测试字符');

10.trim去除字符串两侧空格

  • trim(带空格的字符串)
-- 例 1:去除字符串'     abcd     '两侧空格
SELECT trim('     abcd     ');

11.round四舍五入

  • round(数字, d)

    • d代表要保留的小数位,省略d默认为0
-- 例 1:1.653 四舍五入,保留整数位
SELECT round(1.653);


-- 例 2:1.653 四舍五入,保留2位小数
SELECT round(1.653, 2);
  • 课堂案例
-- 例 3:查询 students 表中学生的平均年龄,并四舍五入,保留两位小数
SELECT round(avg(age), 2) from students;

12.rand随机数

  • rand()

    • 每次运行会产生一个从0到1之间的浮点数
  • 经常用rand对一个张进行随机排序

    • order by rand()
    select rand();
    
    
    -- 小技巧:从学生表中随机抽出一个学生
    SELECT * from students order by rand() LIMIT 1;

13.current_date返回系统日期

  • current_date()

14.current_time返回系统时间

  • current_time()

15.返回系统日期与时间

  • now()
select current_date();

select current_time();

select now();
  • 日期和时间函数的案例
-- 插入记录时,插入系统当前时间
create table a (id int, indate datetime);
insert into a values (1, '2010-09-10 12:01:02');
insert into a values (1, now());
select * from a;

16.存储过程

-- 例 1:创建存储过程 stu(),查询 students 表所有学生信息
CREATE PROCEDURE stu()
BEGIN
    SELECT * from students;
end

-- 调用存储过程stu
call stu();

-- 删除存储过程,删除的时候不用写名字后面的()
DROP PROCEDURE stu;
drop PROCEDURE if EXISTS stu;

17.视图

  • 视图就是对select语句的封装
  • 视图可以理解为一张只读的表,针对视图只能用select,不能用delete和update
-- 创建一个视图,查询所有男生信息

CREATE VIEW stu_nan as 
SELECT * from students where sex = '男';

-- 使用视图
SELECT * from stu_nan INNER JOIN scores 
on stu_nan.studentNo = scores.studentNo;

-- 删除视图
drop VIEW stu_nan;
DROP view if EXISTS stu_nan;

18.事务

  • 事务是多条更改数据操作的sql语句集合
  • 一个集合数据有一致性,要么就都失败,要么就都成功回滚
  • begin ----开始事务
  • rollback ----回滚事务,放弃对表的修改
  • commit ---- 提交事务,对表的修改生效

没有写begin代表没有事务,没有事务的表操作都是实时生效.

如果只写了begin, 没有rollback,也没有commit, 系统推出,结果是rollback

回滚事务

-- 例 1:开启事务,
-- 删除 students 表中 studentNo 为 001 的记录,
-- 同时删除 scores 表中 studentNo 为 001 的记录, 
-- 回滚事务,两个表的删除同时放弃
-- 开始事务
begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
-- 回滚事务,放弃更改
ROLLBACK;
  • 如果开始一个事务,执行了begin,之后,没有rollback也没有commit,中间系统出问题了.默认会执行rollback

提交事务

-- 例 2:开启事务,
-- 删除 students 表中 studentNo 为 001 的记录,
-- 同时删除 scores 表中 studentNo 为 001 的记录, 
-- 提交事务,使两个表的删除同时生效

begin;
DELETE from students where studentNo = '001';
DELETE from scores where studentNo = '001';
-- 提交事务,一旦提交事务,两个删除操作同时生效
commit;

14.索引

  • index
  • 给表建立索引,目的是加快select查询的速度
  • 如果一个表记录很少,几十条,或者几百条,不用索引
  • 表的记录特别多,如果没有索引,select语句效率会非常低
  • 创建索引

    • create index 索引名 on 表名(字段)
    • 如果字段为字符串,需要写明创建表字段的时候字符串的长度
-- 例 1:为表 students 的 age 字段创建索引,名为 age_index
CREATE index age_index on students (age);

-- 例 2:为表 students 的 name 字段创建索引,名为 name_index
CREATE INDEX name_index on students (name(10));
  • 调用索引

    • 不需要显示的写调用索引的语句,只要where条件后面用到的字段建立了索引,那么系统会自动调用
-- where条件后面的字段,数据库系统会自动查找是否有索引
-- 这里会自动调用age_index
select * from students where age = 30;
-- 自动调用name_index
SELECT * from students where name = '李白';
-- 不会调用任何索引,因为sex字段没有索引
SELECT * from students where sex = '女';
  • 查看索引

    • show index from 表名
    • 对于主键,系统会自动建立索引
-- 查看students表的索引
show index from students;
  • 删除索引

    • drop index 索引名 on 表名
show index from students;

-- 删除索引age_index
drop index age_index on students;
-- 删除索引name_index
drop index name_index on students;
  • 索引的优缺点

    • 提高select的查询速度
    • 降低update,delete和insert语句的执行速度
    • 项目中80%以上是select,所以index必须的
    • 在实际工作中如果涉及到大量的数据修改操作,修改之前可以把索引删除,修改完成后再把索引建立起来

15.基于命令行的mysql

  • mysql -h mysql服务器的地址 -u 用户名 -p

    • -h 如果是使用本机的mysql,-h可以省略

mysql登录之后的常用命令

  • show databases

    • 显示系统所有的数据库
  • use 数据库名

    • 使用指定的一个数据库
-- 使用mydb数据库
use mydb
  • show tables

    • 查看指定数据库有多少表
  • 如果命令行默认字符集与数据库默认字符集不同

    • 在windows默认字符集是gbk
    • set names gbk

      • 告诉mysql,客户端用的字符集是gbk
-- 连接到mysql
mysql -u root -p
-- 查看数据库
show databases
-- 使用mydb数据库
use mydb
-- 查看所有表
show tables
-- 设置客户端字符集为gbk
set names gbk
-- 查询students表
select * from students;
  • 在命令行中每条sql语句用;结尾
  • 可以通过desc 表名 查看一个表的字段结构

    • desc students
    • 查看students每个字段的定义
  • 在命令行下创建和删除数据库

    • create database 数据库名 default charset 字符集
-- 创建一个数据库mytest,默认字符集为utf8
create database mytest default charset utf8;
-- 删除数据库mytest
drop database mytest
drop database if exists mytest;
最后修改:2024 年 02 月 17 日
如果觉得我的文章对你有用,请随意赞赏