MySQL(二)----基础一

校招面试整理出来的,比较简单,给自己记笔记用的。

数据库中常用的概念

  1. DB:database:”数据库“,存储数据的容器

  2. DBSM:数据库管理系统 , 数据库管理软件

  3. sql:结构化查询语言,御用数据库通讯的语言,不是某个软件特有的,而是所有主流数据库软件通用的语言

数据库存储的特点

  1. 数据存放到表中,然后表放在库中

  2. 一个库有多张表,每张表有唯一的表名

  3. 表中有一个或多个列,列又称为字段,相当于属性

  4. 表中的每一行数据,都是后端语言的一个对象

 

 

1.基础

  1. 显示表的结构

    DESC TBALE1; DESC是description的缩写

  2. 基础查询select

    select 查询列表 from 表名

  3. 语法的执行顺序

    select name1 , name2        //3
    from table1                 //1
    where name = 'xxx';        //2

     

  4. 起别名的方式

    • 使用as

    • 使用空格 。如果使用空格,就要注意别名不要有空格,如果有空格,则用引号

  5. 去重

    如果查询的某个字段在存在多个重复,那么使用DISTINCT

    select  DISTINCT name FROM TABLE1;

     

  6. ‘+’的作用

    select 90+100;

    select '123' + 90; 会将‘123’转化为数字进行操作

    select 'add' + 90; 如果‘add’转化不成数字,变为0

    select null + 90; 只要其中一个为null,则全为null

  7. 将查询到的两个字段进行拼接:concat

    select concat(name1 , name2) as name from table1;

     

  8. 判断是某个字段值是否为空

    因为在使用+或者是concat的时候 ,如果是name1为null

    select concat(name1 , name2) as name from table1;

    那么输出的字段的那一列都是null

    判定是不是null的语句

    -- select IFNULL(字段 ,null的时候的默认值) as 奖金率 , 不是null的返回值(基本上不是null就是返回这个字段了) from table1
    select IFNULL(name1 , 0) AS 姓名 , name1 FROM  TABLE1 ;
    ​
    ​
    -- 如果是在使用concat(name1 , name2)的时候 name1为null , 可以如下操作
    select concat(IFNULL(name1 , 0) , '-' , name2) from TABLE1;

     

  9. 条件查询

    /*select 查询列表 from 表名 where 筛选条件
    ​
    分类:按条件表达式筛选
        按条件表达式筛选
        1.条件运算符
        >  、  <  、  =  、 <>(不等于) 、 >= 、  <=
        2.逻辑表达式进行筛选
        && , || , !  或者是 not , and , or
        3.模糊查询
        like , betweent...and...  , in , is null
    */
    ​
    ​
    ​
    1. 模糊查询:

      • like:一般和通配符一起使用

        通配符:

        %:任意多个字符,包括0个字符

        _:占一个位置

         

        案例:

        1.搜素包含a字符的

        select name1 from table1 where name1 like '%a%';

        2.搜索第三个字符为a,第五个字符为m的

        select name1 from table1 where name1 like '__a_m%'

        3.搜索第二个字符为_的(支持使用\进行转义)

        select name1 from table1 where name1 like '_\_%'

        同时还支持自定义转义字符(使用 ESCAPE 转义字符)

        select name1 from table1 where name1 like '_$_%' ESCAPE '$'

       

      • between and

        在区间[a ,b]之间

      • in

        用于判断某字段的值是否属于in列表中的某一项

        in列表中的值要必须一致或者是兼容(可以转换成同一种)

        不支持转义 , 是使用_或者是%

        select name1 , cname from table1 while name in ('xxx' , 'ooo' ,'ggg');

      • is null

        sql语句中当判断某个值是null的时候,不能使用 类似id=null ,应该换成is null

        不为空的时候 使用is not null

      • 安全等与 <=>

 

2.常见函数

 

2.1.字符函数

length(str) 【获取字符串的长度 ,返回的是字节数 , 一个汉字是三个子节 ,使用的utf8】

-- 子节长度为4
SELECT LENGTH('addd') as 子节长度;
-- 子节长度为15 一个函数3个子节
SELECT LENGTH('用户输入123') 字节长度;
concat 【连接字符或是字符串】

-- aaa-- -ccc
SELECT CONCAT('aaa','#','ccc')AS 字符;
lower(str) , upper 【转换大小写】

-- AUSTIN-- david
SELECT CONCAT(UPPER(last_name), '# ' ,LOWER(first_name)) AS con_name from employees;


substr,substring 【截取字符串】

注意sql中索引从1开始

-- 从第4个开始(注意sql的索引是从0开始的) 结果:建数据工具
SELECT SUBSTR('查询创建数据工具' , 4) AS text;
-- 从第4个开始,截取3个长度
SELECT SUBSTR('查询创建数据工具' , 4 , 3) AS text;
instr(str1 , str2) 【返回str2在str1的起始索引 , 如果找到返回索引值,如果找不到返回0】

-- 能够匹配到字符串  结果:3
SELECT INSTR('查询创建数据工具','创建') AS 位置;
-- 匹配不到字符串    结果:0
SELECT INSTR('查询创建数据工具' , '吹牛') AS location;
trim(str) 【去除前后空格】

-- 结果:14
SELECT LENGTH('    查询    ') as length;
-- 结果:6
SELECT LENGTH(TRIM('    查询    ')) AS length;
​


LPAD(str , 长度 , 填充字符(如'*')) 【用指定的字符实现左填充指定长度】

-- LPAD(str,len,padstr)  结果:****创建查询工具
SELECT LPAD("创建查询工具",10,'*') AS text;
replace(str , 要替换的 , 替换成的) 【替换】

-- REPLACE(str,from_str,to_str) 结果:创建查询数据工具
SELECT REPLACE('创建查询工具','查询','查询数据') AS text;
-- 要替代的字符或者是字符串不在整个字符串中,返回原字符串   结果:创建查询工具
SELECT REPLACE('创建查询工具','mm','查询数据') AS text

2.2.数学字符

round(num) 四舍五入

-- 结果:1
SELECT ROUND(1.333) as num;
-- 结果:2
SELECT ROUND(1.545) as num;
-- 结果:1.333     第二个参数是保留的小数位
SELECT ROUND(1.3334 , 3) as num;
-- 结果:1.334
SELECT ROUND(1.3336 , 3) as num;
ceil(num) 【向上取整,返回>=该参数的最小整数】

-- 向上取整   结果:2
SELECT CEIL(1.1) as text;
-- 结果:1
SELECT CEIL(1.0) AS text;


floor(num)

-- 向下取整   结果:1
SELECT FLOOR(1.1) as text;
-- 结果:1
SELECT FLOOR(1.0) as text;


truncate(num , n)【截断 保留n位小数,后面的值截取掉】

-- 直接从小数点后第二位进行劫取  结果:1.22
SELECT TRUNCATE(1.222,2) as text;
-- 结果:1.22
SELECT TRUNCATE(1.227,2) AS text;


mod【取余】

mod的算法 mod(a , b) <=> a - a / b * b;

-- 取余  结果:2
SELECT MOD(5,3) AS text;

2.3.日期函数

  1. now 【返回系统当前的日期+时间】

  2. curdate 【返回系统当前的日期 , 不包含时间】

  3. curtime 【返回当前的时间,不包含系统日期】

  4. 可以获取指定的部分 year() , mounth() 等。 年,月,日,小时,分钟,秒

    -- 结果:2020-10-21 15:53:59
    SELECT NOW() AS time;
    -- 结果:2020-10-21
    SELECT CURDATE() AS time;
    -- 结果:2020-10-21
    SELECT CURTIME() AS time;
    -- 结果:2020
    SELECT YEAR(NOW()) as time;
    -- 结果:10
    SELECT MONTH(NOW()) as time;

     

  5.  

-- 格式化字符串里的时间,要注意前面的字符串是什么样的,后面的就是什么样的,只是要将里面的数字换成格式符
-- 结果:2008-05-03
SELECT STR_TO_DATE('03-05 2008','%d-%m %Y') AS time;
​
​
-- 将时间格式化    结果:2020年10月21日
SELECT DATE_FORMAT(CURDATE(),'%Y年%m月%d日') as time;

2.4.其他函数

 

 

 

2.5.流程控制函数

 

  1. if函数 【三个参数类似于三元表达式】

    SELECT last_name , salary ,
    IF(ISNULL(commission_pct),'哈哈哈没奖金','搞得不丑') AS 备注
    FROM employees;
    ​

     

  2. case函数

    /*
        查询的参数是个范围
        工资大于20000  等级A
        大于18000  等级B
        大于14000  等级C
        其他       等级D
    */
    SELECT last_name , salary , 
    CASE 
    WHEN salary > 20000 THEN  'A'
    WHEN salary > 18000 THEN  'B'
    WHEN salary > 14000 THEN  'C'
    ELSE 'D' 
    END AS level
    FROM employees ORDER BY salary DESC;
    ​
    ​
    /*
        查询的参数是指定的值
        部门id为100  工资*1.1
        部门id为101  工资*1.2
        部门id为102  工资*1.5
        其他         不变
        
    */
    SELECT last_name , department_id , salary AS 原始工资 ,
    CASE department_id
    WHEN 100 then salary*1.1
    WHEN 60 THEN salary*1.2
    WHEN 90 THEN salary*1.5
    ELSE salary
    END AS 最终工资 
    FROM employees;

     

2.6.测试

  1. 显示系统时间

  2. 查询员工号,姓名,工资,以及工资提高20%后的结果(new salary)

  3. 将员工的姓名按照首字母排序,并输出 首字母 , 姓名的长度 , 姓名 ,

  4. 做一个查询,产生下面的结果

    <last_name> earns <salary> monthly but wants <salary*3>

    king earns 3000 monthly but wants 9000

  5. 使用case -when , 按照下面条件,输出last_name , salary , job_id , grade

    job grade

    AD_PRES A

    ST_MAN B

    IT_PROG C

 
--  1. 显示系统时间
SELECT NOW() ;
​
--  2. 查询员工号,姓名,工资,以及工资提高20%后的结果(new salary)
SELECT employee_id , last_name , salary  , salary * 1.2 AS "new salary"
FROM employees;
​
--  3. 将员工的姓名按照首字母排序升序,并输出 首字母 , 姓名的长度 , 姓名 
-- 要注意的是按照首字母排序,和按照last_name排序是不同的,因为如果是按照last_name排序的时候,会先使用第一个字母排,然后再使用第二个字母排,直到最后一个
​
SELECT SUBSTR(last_name , 1 , 1) AS 首字母 , LENGTH(last_name) AS 长度 , last_name
FROM employees ORDER BY 首字母;
--  4. 做一个查询,产生下面的结果
--  
--     <last_name> earns <salary> monthly but wants <salary*3>
--  
--     king earns 3000 monthly but wants 9000
​
SELECT CONCAT(last_name, ' earns ' , salary , ' monthly but wants ' , salary*3) AS text
FROM employees;
--  
--  5. 使用case -when , 按照下面条件,输出last_name , salary , job_id  , grade
--  
--     job              grade
--  
--     AD_PRES       A
--  
--     ST_MAN        B
--  
--     IT_PROG       C
--  
SELECT last_name , salary , job_id ,
CASE job_id
    WHEN 'AD_PRES' THEN
        'A'
    WHEN 'ST_MAN'  THEN
      'B'
    WHEN 'IT_PROG' THEN
      'C'
END AS grade
FROM employees;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值