zoukankan      html  css  js  c++  java
  • mysql基础知识

    、String 类
    1. mysql 常用函数
    length, concat, substr, upper, lower, trim,ifnull,isnull;
    如果中文字段乱码:
    set names gbk;
    2. 其他函数
    (1) lpad, 左边用 * 号填充, 总字符串为长度为 10;
    rpad 右填充
    select lpad("小猫", 10, " * ")
    (2)relpace,替换; #
    二、数学函数
    1.
    round:
    四舍五入
    2.
    ceil:
    向下取整数
    3.
    floor:
    向上取整数
    三、日期函数
    1.curdate
    (),now
    ();
    2.
    将字符串通过指定格式转化成日期:
    str_to_date
    select str_to_date('1992-7-12','%Y-%c-%d');
    3.
    将日期转换为字符串:
    date_format
    date_format
    ('2019/10/10',"%Y-%m-%d")
    4.相差多少天
    select datediff(max(hiredate),min(hiredate))
    from emp;
    四、流程控制
    1.if语句
    select
    if(10<6,'true','false');
    select price,
    if(price is null,'happy','促销','sad','正常价格')
    2.case语句
    case 要判断的字段或表达式
    when 常量1 then 要显示的结果1
    when 常量2 then 要显示的结果2
    else 要显示的结果
    end 别名;
    五、分组函数
    1.group by,sum,max,avg,min,
    count:
    分组函数都忽略null值
    2.
    select distinct name, id
    from user;//distinct必须写在前面
    3.
    select count(distinct name, age
    )from user;
    4.group
    by:
    select column, column2, column3
    where condition
    group by exxpress_ssion
    order by column desc
    /asc
    5.
    select count(1) , dept_id
    from emp
    group by dept_id
    having count(1) > 2;
    六、进阶自查询
    1.按子查询出现的位置
    select
    from ,
    where
    group by ...having..
    exists
    (相关子查询)
    七、插入方式
    insert into table1
    (id, name)
    select (id, name
    )from t2

    八、语法
    1.sql99语法
    多表更新:
    update t1 as t
    inner/left/right join t2 as t2
    on 连接条件
    set column = val1,column2 = val2
    where 条件
    2.sql92语法
    (多表删除)
    delete t1的别名
    ,t2的别名
    from t1 as t,t2 as t2
    where 连接条件
    and 筛选条件;

    delete t1的别名
    ,t2的别名
    from t1 as t
    inner/left/right join t2 as t2
    on 连接条件
    where 连接条件
    #2.多表的删除
    #案例:
    删除张无忌的女朋友的信息
    DELETE b T
    FROM beauty b
    INNER JOIN boys bo ON b.、boyfriend id' = bo.、id'
    WHERE bo. 、boyName‘='张无忌'
    ;

    九、插入多行
    INSERT
    INTO my_
    employees
    VALUES
    (1, 'patel' , 'Ralph' , ' Rpatel' , 895) ,
    (2, ' Dancs' , 'Betty', ' Bdancs' , 860) ,
    (3, 'Biri' , 'Ben', 'Bbiri' , 1100) ,
    (4, ' Newman' , 'Chad' , . Cnewman' , 750) ,
    (5, ' Ropeburn' , ' Audrey', ' Aropebur' , 1550) ;

     
    十、案例:
    #1.创建库Books
    CREATE DATABASE IF NOT EXISTS books;
    #2.仅仅复制表的结构
    CREATE TABLE copy LIKE author;
    #3.复制表的结构+数据
    CREATE TABLE copy2 SELECT★ FROM author;
    #4.只复制部分数据
    CREATE TABLE copy3 SELECT id, au name FROM author WHERE nation='中国' ;|

    #5.添加列级约束
    USE students ;
    CREATE TABLE stuinfo (
    id INT PRIMARY KEY,#主键
    stuName VARCHAR(20) NOT NULL, #非空
    gender CHAR(1) CHECK (gender='男' OR gender ='女'), #检查
    seat INT UNIQUE, #唯-
    age INT DEFAULT 18, #默认约束
    majorId INT FOREIGN KEY REFERENCES major (id) #外键
    3CREATE TABLE major (
    id INT PRIMARY KEY,
    majorName VARCHAR(20)
    t) ;
    #2.添加表级约束
    DROP TABLE IF EXISTS stuinfo;
    CREATE TABLE stuinfo (
    id INT,
    stuname VARCHAR(20) ,
    gender CHAR(1) ,
    seat INT,
    age INT,
    majorid INT,
    CONSTRAINT pk PRIMARY KEY(id),#主键
    CONSTRAINT uq UNIQUE (seat) ,#唯一键
    CONSTRAINT ck JHECK (gender ='男' OR gender = ' 女') , #检查
    CONSTRAINT fk_ stuinfo_ major FOREIGN KEY (majorid) REFERENCES major(id) #外键.

    十一、主键与外键
    主键和唯--的大对比:
    保证唯一性是否 允许为空一 个 表中可以有多少个是 否允许组合
    主键 V x 至多有1个 V,但不推荐
    唯- V 可以有多个 V, 但不推荐

    十二、事务的特性
    事务的特性:
    ACID
    原子性: - -个事务不可再分割,要么都执行要么都不执行
    一致性:一个事务执行会使数据从一一个一致状态切换到另外一个一致状态
    隔离性:一个事务的执行不受其他事务的干扰
    持久性: - -个事务一旦提交,则会永久的改变数据库的数据.

    十三、数据库的隔离级别
    对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没
    有采取必要的隔离机制,就会导致各种并发问题:
    ➢脏读:对于两个事务T1, T2,T1读取了已经被T2更新但还没有被提交的字段.
    之后,若T2回滚,T1读取的内容就是临时且无效的.
    ➢不可重复读:对于两个事务T1, T2, T1读取了一个字段,然后T2更新了该字段.
    之后, T1再次读取同一个字段,值就不同了.
    ➢幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插
    入了一些新的行.之后,如果T1再次读取同一个表,就会多出几行.
    )数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,
    使它们不会相互影响,避免各种并发问题.

    ●数据库提供的4种事务隔离级别:.
    隔离级别
    描述
    READ UNCOMMITTED
    允许事务读取未被其他事物提交的变更,脏读,不可重复读和幻读的问题都会出现
    (读未提交数据)
    READ COMMITED
    只允许事务读取已经被其它事务提交的变更.可以避免脏读.但不可重复读和幻读问
    (读已提交数据)
    题仍然可能出现
    REPEATABLE READ
    确保事务可以多次从一个字段中读取相同的值.在这个事务持续期问,禁止其他事物
    (可重复读)
    对这个字段进行更新.可以避免脏读和不可重复读,但幻读的问题仍然存在.
    SERIALIZABLE(串 行化)
    确保事务可以从一个表中读取相同的行.在这个事务持续期间,禁止其他事务对该表
    执行插入,更新和删除操作.所有并发问题都可以避免,但性能十分低下.
    ●Oracle支持的2种事务隔离级别: READ COMMITED,
    SERIALIZABLE。Oracle 默认的事务隔离级别为: READ
    COMMITED~ c
    ●Mysq|支持4种事务隔离级别.Mysql默认的事务隔离级别
    为:REPEATABLE READ

    十四、存储过程
    1. CREATE procedure pre3()
    begin
    declare p1 int default 0;
    myloop : loop
    set p1 = p1+1;
    if p1 < 10 then iterate myloop;
    elseif p1 > 10 then leave myloop;
    end if;
    select p1;
    end loop myloop;
    end;

    CALL pre3();

    2.repeat语句
    REPEAT语句示例,id 值小于等于10之前,将重复执行循环过程,代码如下:
    DECLARE id INT DEFAULT 0;
    REPEAT
    SET id = id+ 1;
    UNTIL id>= 10
    END REPEAT:
    3.while语句
    WHILE语句示例,i值小于10时,将重复执行循环过程,代码如下:
    DECLARE i INT DEFAULT 0;
    WHILE i<10 DO
    SET i= i+1;
    END WHILE;
    4.创建函数
    #案例1:根据传入的成绩,来显示等级,比如传入的成绩: 90-100, 返回A,80-90, 返回B,60-80, 返回c,否则,返回D
    CREATE FUNCTION test_ if(score INT) RETURNS CHAR
    白BEGIN
    IF score>=90 AND score<=100 THEN RETURN 'A' ;
    ELSEIF score>=80 THEN RETURN 'B' ;
    ELSEIF score>=60 THEN RETURN 'C' ;
    ELSE RETURN 'D' ;
    END IF;
    END $
    set global log_bin_trust_function_creators=TRUE(先执行,否则会报错1418)
    create function fn1 (sid int)
    returns int
    begin
    return (select count(*) from emp where id = sid);
    end
    #------------------------------案例演示-------
    #1.无参有返回
    #案例:返回公司的员工个数
    CREATE FUNCTION myf1 () RETURNS INT
    ]BEGIN
    DECLARE c INT DEFAULT 0;#定义变量
    SELECT COUNT(*) INTO c# 赋值
    FROM employees;
    RETURN C;
    END $
    SELECT myf1 () $
    案例2:
    CREATE FUNCTION myf2 (empName VARCHAR(20) ) RETURNS DOUBLE
    日BEGIN
    SET @sal=0;#定义用户变量
    SELECT salary INTO @sal
    #赋值
    FROM employees
    WHERE last name = empName;
    RETURN @sal ;
    LEND $
    SELECT myf2('k_ _ing') $
    ##f7J2: EÈßl]Z, iE®iÈÈßJÉJFtJIR
    CREATE FUNCTION myf3 (deptName VARCHAR(20) )
    RETURNS DOUBLE
    BEGIN
    DECLARE
    sal
    DOUBLE
    SELECT AVG(salary)
    INTO sal
    FROM employees
    JOIN
    departments d ON e. department_ id = d. department_ id
    WHERE d. depar tment_ name=deptName ;
    RETURN sal;
    END $
    SELECT myf3(' IT') $
    #三、查看函数
    SHOW CREATE FUNCTION myf3;
    #四、删除函数
    DROP FUNCTION myf3;
    #案例
    #一、创建函数,实现传入两个float,返回二者之和
    CREATE FUNCTION test fun1 (num1 FLOAT, num2 FLOAT)
    BEGIN
    DECLARE SUM FLOAT DEFAULT 0;
    SET SUM=num1 +num2 ;
    RETURN SUM;
    .END$
    SELECT test_ fun1 (1,2) $

    十五、视图
    1.create or REPLACE view t_view as select quantity,price,price*quantity total from t
    select * from t_view
    2.查看视图详细信息:show create view t_view

    十六、设置隔离级别
    1.查询当前数据库事务的隔离级别
    select @@transaction_isolation;
    2.设置事务隔离级别
    //设置read uncommitted级别:
    set session transaction isolation level read uncommitted;

    //设置read committed级别:
    set session transaction isolation level read committed;

    //设置repeatable read级别:
    set session transaction isolation level repeatable read;

    //设置serializable级别:
    set session transaction isolation level serializable;

    设置数据库系统的全局的隔离级别:
    set global transaction isolation level read committed;
    十七、事务关键词
    set atuocommit = 0;
    start transaction ;
    savepoint;
    rollback,commit
    #3.演示savepoint的使用
    SET autocommit=0;
    START TRANSACTION ;
    DELETE FROM account WHERE id=25;
    SAVEPOINT a;#设置保存点
    DELETE FROM account WHERE id=28;
    ROLLBACK TO a;# 回滚到保存点

    视图的可更新性和视图中查询的定义有关系,以下类型的|
    视图是不能更新的。
    包含以下关键字的sg!语句:分组函数、distinct、 group by
    having、union或 者union all
    常量视图
    Select中包含子查询
    join
    from一个不能更新的视图
    where子句的子查询引用了from子句中的表

    十八、查看变量
    1.查看全局变量
    show gloabal variables;
    2.查看部分的全局变量
    show global variables like '%transaction_isolation%'
    3.查看指定的全局变量的值
    show @@globle.autocommit;

    十九、存储过程例子
    #案例2 :创建存储过程实现,用户是否登录成功
    CREATE PROCEDURE myp4 (IN username VARCHAR(20) , IN PASSWORD VARCHAR (20) )
    BEGIN
    DECLARE result INT DEFAULT 0;#声明并初始化
    SELECT COUNT (*) INTo result#赋值
    FROM admin
    WHERE admin.username = username
    AND admin.password = PASSWORD;
    SELECT IF (result>0, '
    成功', '失败') ;#使用
    END $

    #案例3:根据女神名,返回对应的男神名
    CREATE PROCEDURE myp5 (IN beautyName VARCHAR (20) , OUT boyName VARCHAR(20) )
    ]BEGIN
    SELECT bo. boyName INTO boyName
    FROM boys bo
    INNER JOIN beauty b ON bo.id = b.boyfriend id
    WHERE b. name=beautyName ;
    END $
    #调用
    CALL myp5('小昭' , @bName)
    SELECT @bName

    #案例4:根据女神名,返回对应的男神名和男神魅力值
    CREATE PROCEDURE myp6 (IN beautyName VARCHAR(20) , OUT boyName VARCHAR(20) ,OUT userCP INT)
    ] BEGIN
    SELECT bo.boyName ,bo.userCP INTO boyName, userCP
    FROM boys bo
    INNER JOIN beauty b ON bo.id = b.boyfriend id
    WHERE b. name=beautyName;
    END $
    #调用
    CALL myp6('小昭' , @bName, @usercp) $
    SELECT @bName,@usercp

    #5.创建带inout模式参数的存储过程
    #案例1:传入a和b两个值,最终a和b都翻倍并返回
    CREATE PROCEDURE myp8 (INOUT a INT, INOUT b INT)
    BBEGIN
    SET a=a*2 ;
    SET b=b*2 ;
    END $
    #调用
    SET @m=10
    SET @n=20
    CALL myp8 (@m, @n)
    select @m,@n
    查看存储过程:
    show create procedure my2
    #案例
    #6.带条件语句存储过程,根据传入的成绩,来显示等级,比如传入的成绩: 90-100, 显示A,80-90, 显示B,60-80, 显示c,否则,显示D
    CREATE PROCEDURE test_ case(IN score INT)
    BEGIN
    CASE
    WHEN score>=90 AND score<=100 THEN SELECT 'A' ;
    WHEN score>=80 THEN SELECT 'B';
    WHEN score>=60 THEN SELECT 'C' ;
    ELSE SELECT 'D' ;
    END CASE;
    END $

    #7.案例:批量插入,根据次数插入到admin表中多条记录
    CREATE PROCEDURE pro_ while1 (IN insertCount INT)
    日BEGIN
    DECLARE i INT DEFAULT 1 ;
    a:WHILE i<=insertCount DO
    INSERT INTO admin (username,、password^) VALUES('Rose'+i, '666') ;
    SET i=i+1;
    END WHILE a;
    END S
    #2.添加leave语句
    #案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
    TRUNCATE TABLE adminS
    DROP PROCEDURE test_ while1S .
    CREATE PROCEDURE test_ while1 (IN insertCount INT)
    BEGIN
    DECLARE i INT DEFAULT 1;
    a:WHILE i<=insertCount DO
    INSERT INTO admin (username,、password^) VALUES (CONCAT ('xiaohua' ,i) , '0000') ;
    IF i>=20 THEN LEAVE a;
    END IF ;
    SET i=i+1;
    END WHILET a;
    END $

    二十、mysql锁相关
    1.表锁(偏读)
    a.#手动增加锁表;
    lock table t1(表名) read(write) ,t2 read(write),其他;
    说明:读锁是共享锁,不同session都可以同时读取表;
    读锁:当前session可以查询锁定的表,不能查询未锁定的其他表,不能更新;其他session可以读取锁定的表和未锁定的表,不能更新锁定的表;
    b.查看表加过的锁;
    show open tables;
    MyISAM在执行查询语句(SELECT) 前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
    MySQL的表级锁有两种模式:
    表共享读锁(Table Read Lock)
    表独占写锁(Table Write Lock)
    结论:
    结合上表,所以对MyISAM表进行操作,会有以下情况:
    1、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同- -表的写请求。只有当读锁释放后,
    才会执行其它进程的写操作。
    2、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操
    简而言之,就是读锁会阻塞写,但是不会堵塞读。而写锁则会把读和写都堵塞。
    3.查看锁时间 show status like "table%"
    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION) ;二是采用了行级锁
    +由于行锁支持事务,复习老知识.
    B、锁定一行:
    1.begin
    select * from a1 where name = 'a' for update ;
    commit;
    2.查看行级锁定状态InnoDB;
    show status like 'innodb_row_lock%'
  • 相关阅读:
    基于jQuery的一个弹出层
    获取一个数组内的最大最小值
    flex内根据id(string)获取对象
    整理的一份iframe编辑器代码
    仿163邮箱工具条
    获取dom到浏览器窗口坐上坐标
    the solution to fix 'Failed to access IIS metabase'
    .Net下的Windows服务程序开发指南.
    Castle学习笔记之Windsor(二)
    IOC:主要概念
  • 原文地址:https://www.cnblogs.com/qiyc/p/12153010.html
Copyright © 2011-2022 走看看