mysql学习--入门(一)

    技术2023-10-02  84

    本章节为linux环境下的mysql学习日记。

    目录

    前期准备到这,准备开始学习!修改登录mysql数据库的密码建一个空的数据库创建一个表查看表结构往表中插入一或多条数据查看一个表的所有数据查看一个表的指定几个字段的所有数据运用distinct关键字是查询出来的一列数据唯一使用limit限制返回的行数,可指定起始位置单字段排序和多字段排序,升序还是降序orderbyorderby和limit 查出价格最高的商品where过滤语句的使用between和andis nulland 和 or使用and和or需要注意的问题In 操作符那为什么要使用In操作符,而不是or呢Not操作符 通配符Like操作符%通配符下划线 _ 通配符 正则表达式正则表达式的or匹配正则表达式[ ] 匹配匹配范围的 -匹配特殊字符的时候的转义 \ \正则表达式之预定义的字符类 计算字段Concat() 可以拼接多个列。利用AS对列进行重命名RTrim() 可以去掉右边多余的空格LTrim()可以去掉左边多余的空格Trim()可以去掉两边多余的空格 常见的文本处理函数常见的日期和时间处理函数数值处理函数聚集函数

    前期准备

    docker pull mysql # 拉取最新的mysql镜像 docker run -itd --name mysql-study -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql # 启动mysql docker exec -it mysql-study /bin/bash # 进入mysql容器 mysql -u root -p 123456 # 我这边是设置好了密码,没有密码直接回车进入 show databases 操作完后,结果如下图

    到这,准备开始学习!

    修改登录mysql数据库的密码

    update mysql.user set authentication_string=password('') where user='root'; # 改成无密码后,记得重启一下数据库容器

    建一个空的数据库

    create database mysqlstudy; show databases;

    创建一个表

    create table if not exists task( task_id int(11) not null auto_increment, task_name varchar(30) default null, task_telephone varchar(30) default null, task_email varchar(30) default null, primary key(task_id) )engine=InnoDB; show tables;

    查看表结构

    show columns from task;

    往表中插入一或多条数据

    insert into task(task_name,task_telephone,task_email) values ('zhangsan','19827213391','92398329@qq.com'), ('lisi','123789123','3283298923@qq.com');

    查看一个表的所有数据

    select * from task; select * from table名字;

    查看一个表的指定几个字段的所有数据

    select task_name,task_email from task;

    运用distinct关键字是查询出来的一列数据唯一

    select distinct 字段名 from 表名;

    使用limit限制返回的行数,可指定起始位置

    select * from 表名 limit 3; #表示从1-3行 select * from 表名 limit 2,3; #表示从第2行开始,检索3行。即3-5行

    单字段排序和多字段排序,升序还是降序orderby

    #单字段 select g_price from goods order by g_price; #默认升序 select g_price from goods order by g_price dese; #降序

    #多字段 select * from goods order by g_price , g_number ; #可以看到,先按照价格进行了排序,再按照商品号排序

    orderby和limit 查出价格最高的商品

    select * from goods order by g_price limit 1;

    where过滤语句的使用

    select g_name from goods where g_name = 'water';

    between和and
    select * from goods where g_price between 20 and 40; # 包括 20 和 30

    is null
    select * from goods where g_price is null;

    and 和 or
    # or的例子 select g_name from goods where g_price=20 or g_price=40;

    # and 的例子 select g_name from goods where g_price = 40 and g_address = 'shanghai';

    使用and和or需要注意的问题

    and和or组合使用时,需要注意执行顺序。

    举个例子:请看下列sql语句 这道题本意是想找1002和1003制造的大于10元的产品。

    select prod_name,prod_price from products where vend_id = 1002 or vend_id =1003 and price >=10; #但sql理解这端代码的意思是1002的任何产品和1003的价格大于10的产品

    可以发现在sql语句中,and是具有比较高的优先级的 所以正确的做法如下 加上括号来确定代码的执行顺序

    select prod_name,prod_price from products where (vend_id = 1002 or vend_id =1003) and price >=10;
    In 操作符

    In操作符配合括号来用

    select prod_name,prod_price from products where vend_id in (1002,1003) order by prod_name;

    可以发现In操作符和or操作符是差不多的。

    那为什么要使用In操作符,而不是or呢

    1.看起来逻辑比or清楚 2.计算的次序更容易管理 3.执行比or更快 4. 最主要的,In可以包含其它select语句

    Not操作符

    最主要的,功能只有一个,那就是否定not之后的所有条件 举个例子

    select prod_name,prod_price from products where vend_id not in (1002,1003) order by prod_name;

    意思就是:找出除了id为1002,1003供应商之外的所有的供应商的产品和其价格 对于mysql,not支持对In,Between和Exists取反

    通配符

    Like操作符
    %通配符

    表示任何字符出现任意次数 举个例子

    select * from goods where g_name like '%a%';

    可以看到a前后有或没有的都被查出来了。 1.mysql的通配符匹配方式是区分大小写的 2.上面的例子中也可以注意到%是可以代表0个字符的 3.尾空格是需要注意的,如果一个字符最后有几个空格的话,那么像’%apple’,是不会匹配到他们的。解决这个问题的办法就是使用’%apple%’,或者使用函数去除首位空格 4. NULL值也是需要注意的,通配符是找不到NULL值的,即使是%

    下划线 _ 通配符

    代表一个字符,只能匹配一个字符 看例子

    select * from goods where g_name like '%e_';

    可以看到查出了e前任意字符,但e后只有一个字符

    注意: 1.操作符能完成事,不要使用通配符 2.除非没办法,尽量不要把通配符放在搜索的开始,不然匹配起来总是最慢的。

    正则表达式

    REGEXP做为MySQL得正则表达式关键字,其作用是使用后面跟着的东西作为正则表达式 例子如下,通过正则表达式,迅速找出价格最后一位为5的商品。 想要区分大小写, 可以使用BINARY关键字。

    正则表达式的or匹配

    利用 | 这个可以表示,或匹配20,或匹配30 。

    正则表达式[ ] 匹配

    例子如下,匹配了或1,或2,或3。就好比[ ]界定了范围,类似于[ 1|2|3 ]。 因为如果不界定范围,那么 | 将应用于两边的整个串。 当然也可以表示否定,即不匹配什么。只需要使用^。如[ ^123 ] Ton,表示不匹配或1,或2,或3开头的Ton

    匹配范围的 -

    例如匹配数字0到9,按照上面的写法则是要[0123456789],而使用正则表达式范围符 - ,则可以表达为 [ 0-9 ] 。[a-z] 匹配任意字母。 例子:下面这个例子匹配了[b-g]中任意一个字符+上e后的结果

    匹配特殊字符的时候的转义 \ \

    如果我们想要匹配特殊字符时,因为许多特殊字符在正则表达式中已经具有特殊的含义,所以需要通过转义来使其表示为字面意思。只用在特殊字符前加上 \ \ 即可

    正则表达式之预定义的字符类

    计算字段

    Concat() 可以拼接多个列。

    通过加上’(’ , 可以使两边加上括号 可以发现上述字段列的名字是一个Concat函数,这就不好引用,所以可以对其重命名。

    利用AS对列进行重命名

    RTrim() 可以去掉右边多余的空格

    LTrim()可以去掉左边多余的空格

    Trim()可以去掉两边多余的空格

    常见的文本处理函数

    常见的日期和时间处理函数

    数值处理函数

    聚集函数

    对数据进行汇总计算 对于avg可以配合使用distinct函数,来去除相同的价格数据,以避免影响平均值

    Processed: 0.011, SQL: 9