mysql数据库基本语法使用,初学者必备

一、基础查询

(一)语法

select 查询列表 from 表名;

(二)特点

  1. 查询列表可以是字段、常量、表达式、函数,也可以是多个
  2. 查询结果是虚拟的表

(三)示例

  1. 查询单个字段
    1. select 字段名 from 表名;
  1. 查询多个字段
    1. select 字段名, 字段名 from 表名;
  1. 查询所有字段
    1. select * from 表名;
  1. 查询常量
    1. select 100 + 90;
  1. 查询函数
    1. select 函数名();
  1. 查询表达式
    1. select 1000 / 102;
  1. 起别名
    1. as 关键字,比如:select user_id as "用户编号" from user_info;
    2. 空格 比如:select user_id  "用户编号" from user_info;
  1. 去重
    1. select distinct 字段名 from 表名;
  1. "+"号的含义
    1. 作用就是:做加法运算
      1. select 数值+数值; 直接运算
      2. select 字符+数值; 先试图将字符转换为数值,如果转换成功,则继续运算;否则转换成"0",再运算
      3. select null + "任意值"; 结果都为 null
  1. concat() 函数
    1. select concat(字符1, 字符2, 字符3 ) 
  • MySQL教程之concat以及group_concat的用法

 

1.1、concat()函数

1、功能:将多个字符串连接成一个字符串。

2、语法:concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

3、举例:

例1:select concat (id, name, score) as info from tt2;

 

中间有一行为null是因为tt2表中有一行的score值为null。

二、条件查询

(一)语法

    select 字段 from 表名 where 筛选条件;

    如果条件不成立,数据不会显示

(二)筛选条件的分类

  1.     简单条件的运算符
    1.     >, , , !=, =
  1.     逻辑运算符
    1.     &&(and), ||(and), !(not)
  1.     模糊查询
    1.     like
      1.     一般搭配通配符使用("%", "_"),可以判断字符型数值或者数值型
      2.     %:任意多个字符
      3.     _:任意单个字符
    1.     between and, 
    2.     in, not in, 
    3.     is null, is not null

is null 和  区别

 

普通类型数值

null值

可读性

is null

×

 

×

三、排序查询

(一)语法

    select 字段 from 表名 where 条件 order by 排序列表【asc/desc】(默认 asc排序)

(二)特点

  1.     asc代表的是升序,desc代表的是降序,如果不写,默认是升序
  2.     order by子句中可以支持单个字段、多个字段、表达式、函数、别名
  3.     order by一般放在查询语句最后面,如果有 limit 的话,limit 在最后面

四、常见函数

(一)介绍

  1.     概念:类似于 编程语言 中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
  2.     好处
    1.     隐藏了实现细节
    2.     提高了代码复用性
  1.     调用
    1.     select 函数名(实参) from 表名;
    2.     select 函数名();

(二)分类

  1. 单行函数
    1. 如:concat(), length(), is null 等等
  1. 分组函数
    1. 功能:做统计使用,又称为统计函数、聚合函数、组函数

五、单行函数

(一)字符函数

    length()

  1.         select length("hello")
  2.     获取参数值的字节个数

    concat()

  1.     拼接字符
  2.     select concat("a", "b", "c");

    upper()、lower()

  1.         转为大写、小写

substr(索引从“1”开始)

  1. 切割字符

instr(返回字符第一次出现的索引)

    trim(去前后空格)

  1. select trim('a' from 'aaaaaaaMaaaaYaaaSQLaaaa'); 结果为:MaaaaYaaaSQL

    lpad(左填充指定长度的)

  1. select lpad('哈哈哈', 10, '*'); 结果:*******哈哈哈

    rpad(右填充指定长度的)

  1. select rpad('哈哈哈', 10, '*'); 结果:哈哈哈*******

    replace(替换字符)

  1. select replace('哈嘿嘻', '嘻', ' '); 结果:哈嘿

(二)数学函数

    round(四舍五入)

  1.     select round(1.65); 结果:2
  2.     select round(1.65547, 2); 结果:1.66

    ceil(向上取整,返回 >= 该参数最小整数)

  1. select ceil(1.001); 结果:2
  2. select ceil(1.000); 结果:1

floor(向下取整,返回 

  1.     select floor(1.2154); 结果 1
  2.     select floor(-9.99); 结果 -10

truncate(截断,小数点后保留几位)

  1. select truncate(1.65, 1); 结果:1.6

mod(取余,取余公式:a-a/b*b)

  1. select mod(10, 3); 结果:1

rand(随机数)

  1. select rand();

(三)日期函数

    now(返回当前系统日期+时间)

  1.     select now(); 结果:2019-08-21 23:19:52

    curdate(返回当前日期,不包含时间)

  1. select curdate(); 结果:2019-08-21

    curtime(返回当前时间,不包含日期)

  1.     select curtime(); 结果:23:22:37

    year、month(获取指定部分,年、月、日、时、分、秒)

  1.     select year(now());    结果:2019
  2.     select month(now()); 结果:8

str_to_date(将字符通过指定的格式转换成日期)

  1.         select str_to_date('2018-8-1', '%Y-%m-%d'); 结果:2018-08-01

date_format(将日期转换成字符)

  1.         select date_format('2018/06/01', '%Y-%m-%d'); 结果:2018-06-01

datediff(日期查计算)

  1.     select datediff('2019-08-23', '2019-08-10'); 结果:13

 

(四)其他函数

    version(查看数据库版本号)

  1.     select version(); 结果:5.7.26

database(查看当前数据库)

  1.     select database(); 结果:test

user(代表当前用户)

  1.     select user(); 结果:root@localhost

(五)流程控制函数

    if函数

  1.     select if(10 > 5,'大','小'); 结果:大

case函数

  1. case 要判断的字段或表达式 when 常量值1 then 要显示的值或语句; when 常量2 then 要显示的值或语句; else 要显示的值或者语句;
  2.         select (case a.id when 5 then '等于5' else '不等于5' end) as id from (select 10 as id) a
  3.         select (case when a.id > 5 then '大于5' when a.id < 5 then '小于5' else '未知' end) as id from (select 10 as id) a

六、分组函数

(一)分类

  1.     sum 求和
  2.     avg 平均值
  3.     max 最大值
  4.     min 最小值
  5.     count 计算个数

(二)简单使用

    sum(求和)

  1. select sum(字段) from 表名;

avg(平均值)

  1. select avg (字段) from 表名;

max(最大值)

  1. select max(字段) from 表名;

min(最小值)

  1.     select min(字段) from 表名;

count(计算个数)

  1.     select count(字段) from 表名;
  2.     select count(1) from 表名; 意思是:在查询时候 新建了一个虚拟表,对应实际表的行数,实际上统计的是 1 的行数。
  3.     效率:
    1.     MyISAM存储引擎下:count(*) 比  count(1) 效率高,因为这个引擎内部有计数器,直接返回了个数。
    2.     InnoDB存储引擎下:count(*) 和 count(1) 差不多,比 count('字段') 效率高一些

    和 distinct 关键字搭配使用

  1.     select sum(distinct('字段')), sum('字段')  from 表名;

注意

        和分组函数一同查询的字段要求是 group by 后的字段。

七、分组查询

 

数据源

位置

关键字

分组前筛选

原始表

group by子句的前面

where

分组后筛选

分组后的结果集

group by子句的后面

having

    group by (分组函数)

  1.         select count(*), user_id from user_info group by user_id; 查询每个user_id的个数

having(查询结果后的筛选函数)

  1.         select count(*) as cou, user_id as userId from user_info group by userId having cou>2;

    注意

  1. 分组函数做条件肯定是放在 having 字句中
  2. 能用分组前筛选的,就优先考虑使用分组前筛选
  3. group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求)
  4. 也可以添加排序(排序放在整组语句的最后)

八、连接查询

    含义

        连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

    错误示例

        笛卡尔乘积的错误情况

            select count(*) from a;   假设输出12行

            select count(*) from b;   假设输出4行

            最终结果:12×4=48(行)

    查询分类

    按年代分类

  1.         sql 92标准:MySQL中仅支持内连接
  2.         sql 99标准【推荐使用】:MySQL中支持内连接、外连接(左外、右外)、交叉间接

    按功能分类

  1.         内连接
    1.         等值连接
    2.         非等值连接
    3.         自连接
  1.         外连接
    1.         左外连接
    2.         右外连接
    3.         全外连接
  1.         交叉连接

sql92标准

        内连接>等值连接

            简单示例

            select a.id,b.age from user_info a,user_ageb where a.id= b.user_id

            加筛选条件示例

            select a.id,b.age from user_info a,user_ageb where a.id= b.user_id and b.age > 18;

            总结

  1.             多表等值连接的结果为多表的交集部分
  2.             n表连接,至少需要n - 1个连接条件
  3.             多表的顺序没有要求
  4.             一般需要为表加别名,便于操作
  5.             可以搭配子句使用,比如:排序、分组等待

        内连接>非等值连接

            简单示例

            job_grade:员工工资等级表,每个等级都用工资范围值

            employess:员工表

            select e.salary,g.grade_level from employess e, job_grade g 

            where e.salary between g.lowest_sal and g.highest_sal

        内连接>自连接

            简单示例

            查询员工名和上级名称

            select e.employee_id, e.last_name,a.employee_id,a.last_name 

            from employees e, employees a where e.manager_id = a.employee_id

sql99标准

        介绍

            简单示例

            select 查询列表 

             from 表1 别名【连接类型(左连接或者右链接)】join 表2 别名 on 连接条件

            【where 筛选条件】

            【group by 分组】

            【having 筛选条件】

            【order by 排序列表】

        内连接:inner

        外连接:

            左外:left 【outer】

            右外:right【outer】

            全外:full【outer】

        交叉连接:cross

        内连接

            语法

                select * from user_info u inner join user_like ui on u.user_id = ui.user_id;

            特点

  1.                 添加排序、分组、筛选
  2.                 inner join 可以省略为 join
  3.                 筛选条件放在 where 后面,连接条件放在 on 后面,提高分离性、可读性
  4.                 inner jion 和 sql92 的等值连接效果一样,查询多表的交集

            等值连接

                select * from user_info u inner join user_like ui on u.user_id = ui.user_id;

            非等值连接

            job_grade:员工工资等级表,每个等级都用工资范围值

            employess:员工表

            select e.salary,g.grade_level from employess e inner join job_grade g 

            one.salary between g.lowest_sal and g.highest_sal

        自连接

            查询员工名和上级名称

            select e.employee_id, e.last_name,a.employee_id,a.last_name 

            from employees e inner join employees a on e.manager_id = a.employee_id;

        外连接

            特点

  1.                 外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,显示匹配值,如果没有匹配的,则显示 null,外连接查询结果=内连接结果+主表中有而从表没有的记录
  2.                 左外连接,left 左边是主表,右外连接,right join右边的是主表
  3.                 左外和右外交换两表的顺序,查询结果没有区别

全外连接(MySQL暂不支持)

            特点

  1.                 全外连接 = 内连接的结果 + 表1中有但表2没有的 + 表2中有单表1中没有的

示例

                select b.*,bo.* from beauty b full join boys bo on b.boyfriend_id = bo.id;

        交叉连接

            select a.*,b.* from A a cross join B b; 结果为:笛卡尔乘积

    sql92和sql99的区别

        功能上

  1.             sql99支持的较多

    子查询

        含义

            出现在其它语句中的 select 查询,成为子查询或内查询,外部的查询语句,

            成为主查询或外查询

        简单示例

            select * from user_info where user_id in (select user_id from user_info);

        分类

            按子查询出现的位置:

                        select 后面:仅支持标量子查询

                        from 后面:支持表子查询

                        where 或 having后面:主要支持标量子查询、列子查询,也支持行子查询

                        exists后面(相关子查询):表子查询

            按结果集行列数不同:

                        标量子查询(结果集只有一行一列)

                        列子查询(结果集只有一列多行)

                        行子查询(结果集有一行多列)

                        表子查询(结果集一般为多行多列)

        where或having后面

  1. 标量子查询(单行子查询)
  2. 列子查询(多行子查询)
  3.             行子查询(多列多行)

    特点:

  1.         子查询放在小括号内
  2.         子查询一般放在条件的右侧
  3.         标量子查询,一般搭配着单行操作符使用;列子查询,一般搭配着多行操作符使用

    标量子查询

                select * from user where id = (select id from user where id = 12);

    列子查询(多行子查询)

        特点

  1. 返回多行
  2. 使用多行比较操作符

 

    行子查询(结果集一行多列或多行多列)

        select * from user where (user_id,user_name) = (

            select user_id,user_name from user 

            where user_id = 10 and user_name like '%张%';

        );

    select 后面

                select o.*,(select count(*) from user a where a.id = o.user_id) from user_order o;

            from 后面

                简介:将子查询的结果充当一张临时表,要求必须起别名

                示例: 

                select u.*,ag.grade_level  from (select avg(age) as age from user) user_age

                inner join age_grades ag 

                on user_age.age between lowest_age and highest_age;

    exists后面(相关子查询)

        示例:

        select exists(select * from user;) 结果:1

        select exists(select * from user where id = 10000000000;) 结果:0

        查询:

        使用 in:

            select bo* from boys bo where bo.id not in (select boy_id from beauty);

        使用 exists:

        select bo* from boys bo where 

        not exists (select b.boy_id from beauty b where bo.id = b.boy_id));

        分页查询

            应用场景:

  1. 需要显示的数据,一页显示不全,需要分页提交sql查询
  2. 海量数据,使用分页提高性能

特点:

  1.             limit 语句放在查询语句的最后
  2.             公式:
    1.             page:页数,size:条目数
    2.             page = (page - 1) * size
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值