• MYSQL语句


    MySQL常用基础语句

    cmd登录

    sql
    mysql -h localhost -u root -p

    SHOW语句

    sql
    返回可用数据库列表
    show databases;
    
    返回当前选择数据库内可用表的列表
    show tables;
    
    显示表中的所有列(xxx:表名)
    show columns  from xxx; or describe xxx;
    
    显示服务器状态信息
    show status;
    
    显示创建特定数据库(xxx:数据库名)
    show create database xxx;
    
    显示创建特定表(xxx:表名)
    show create table xxx;
    
    显示授予用户(所有用户或特定用户)的安全权限
    show grants;
    
    显示服务器错误信息
    show errors;
    
    显示服务器警告信息
    show warnings;
    sql
    关于选择数据库进行表的操作(xxx:数据库名)
    use xxx;

    SELECT语句

    检索表中的列 SELECT column... FROM table

    sql
    select username from user;
    select username,age from user;
    select * from user;

    DISTINCT 去除列中的重复值(必须放在列名的前面)一般用来查询不重复的字段和条数(count(distinct username)) 如果查询不重复的记录 用group by

    sql
    select distinct addr from user;
    
    需要过滤不止一条记录
    select distinct age,addr from user;
    过滤表中age和addr都重复的记录

    LIMIT限制查询

    sql
    select username from user limit 2;
    
    表示从第三列开始返回一行
    select username from user limit 2,1;
    select username from user limit 1 offset 2;

    使用完全限定的表名和列名(user为表名 test为数据库名)

    sql
    select user.username from test.user

    ORDER BY排序检索数据 (用非检索的列排序数据是合法的)

    sql
    select username from user order by username;
    
    多个排序时按顺序进行,如果username都是唯一,则按照age排序
    select username,age from user order by username,age;
    sql
    按指定排序方法 升序(ASC 默认)降序DESC(只用用到直接位于其前面的列名)
    select username,age from user order by username,age;

    使用order by和limit组合(order by必须位于from之后 limit必须位于order by之后)

    sql
    eg:找出年龄最大的前三个人
    select username,age from user order by age desc limit 3;

    WHERE过滤数据

    sql
    select username,age from user where age=20;
    select username,age from user where addr='wuhan';

    空值检查 IS NULL

    sql
    select username,age,addr from user where addr is null;

    操作符 AND和OR(and优先级高于or,所以组合使用时优先执行and)

    sql
    select username,age,addr from user where age=20 and addr='beijing';
    select username,age,addr from user where age=10 or addr='wuhan';
    select username,age,addr from user where username='zhangsan' or addr='beijing' and age>10;

    IN操作符(用来指定条件范围)

    sql
    select username,age from user where username in ('zhangsan','lisi');

    in和or的功能相同,使用in有什么好处

    • 在使用长的合法选项清单时,in操作符的语法更清楚且更直观
    • 计算的次序更容易管理(使用的操作符更少)
    • 一般情况下比or清单执行更快
    • 可以包含其他select语句,使得更动态的建立where语句

    NOT(否定它之后所跟的任何条件,mysql支持not对in,between和exists子句取反)

    sql
    select username,age from user where username not in ('zhangsan','lisi');

    LIKE

    sql
    百分号(%)通配符(可以区分大小写,跟mysql的配置有关,默认是不区分) %不能匹配NULL
    select username, age from user where username like 'z%';
    select username, age from user where username like '%a%';
    select username, age from user where addr like '%';

    下划线通配符只能匹配一个字符,功能与%通配符相同

    sql
    select username,age from user where username like '_hansan'

    通配符使用技巧

    • 不要太依赖通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
    • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的
    • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

    REGEXP正则表达式进行搜索

    sql
    select username,age from user where username regexp 'z';
    
    BINARY 区分大小写
    select username,age from user where username regexp binary 'z';
    
    '.'表示匹配任意一个字符
    select username,age from user where addr regexp '.';
    
    or匹配
    select username,age from user where username regexp 'z|l';
    
    [123]=[1|2|3]
    select username,age from user where username regexp '[123] z';
    
    集合中使用^匹配除这些字符以外的,否则指字符串的开始处
    select username,age from user where username regexp '^[123] z';
    
    ^字符串的开始处
    select username,age from user where username regexp '^[0~9]';
    
    范围匹配相当于[123456]
    select username,age from user where username regexp '[1-6] z';
    
    匹配特殊字符用\\
    select username,age from user where username regexp '\\.'

    CONCAT 拼接串

    sql
    AS:别名
    select concat(username,'(',age,')') AS info from user;

    文本处理函数

    sql
    select upper(username),age from user;

    常用文本处理函数

    函数 说明
    Left() 返回串左边的字符
    Length() 返回串的长度
    Locate() 找出串的一个子串
    Lower() 将串转换为小写
    LTrim() 去掉串左边的空格
    Right() 返回串右边的字符
    RTrim() 去掉串右边的空格
    Soundex() 返回串的SOUNDEX值 根据发音字符和音节进行比较
    SubString() 返回子串的字符
    Upper() 将串转换为大写

    日期与时间处理函数

    sql
    按日查询
    select username,age,createdate from user where date(createdate)='2004-11-11';
    按月查询
    select username, age, createdate from user where date_format(createdate,'%Y-%m') = '2004-11'; 
    按年查询
    select username,age,createdate from user where date_format(createdate,'%Y')='2004'

    数值处理函数

    函数 说明
    Abs() 返回一个数的绝对值
    Cos() 返回一个角度的余弦
    Exp() 返回一个数的指数值
    Mod() 返回除操作的余数
    Pi() 返回圆周率
    Rand() 返回一个随机数
    Sin() 返回一个角度的正弦
    Sqrt() 返回一个数的平方根
    Tan() 返回一个角度的正切

    聚集函数

    函数 说明
    AVG() 返回某列的平均值 忽略NULL
    COUNT() 返回某列的行数 如果为*则不忽略NULL,为列时忽略
    MAX() 返回某列的最大值
    MIN() 返回某列的最小值
    SUM() 返回某列值之和

    数据分组 GROUP BYHAVING
    GROUP BY子句经常在聚合函数中使用,而HAVING配合GROUP BY使用

    sql
    select count(age) AS a_age from user group by age;
    
    select age,count(age) AS a_age from user group by age having count(age)>1; having:过滤分组

    子句

    子句 说明 是否必须使用
    SELECT 要返回的列或表达式
    FROM 从中检索数据的表 仅在从表选择数据时使用
    WHERE 行级过滤
    GROUP BY 分组说明 仅在按组计算聚集时使用
    HAVING 组级过滤
    ORDER BY 输出顺序排序
    LIMIT 要检索的行数

    子查询

    sql
    select * from user where age=(select age from user_1 where addr='beijing');

    联结

    联结是一种机制,用来在一条SELECT语句中关联表
    内部联结

    sql
    select cust_name, cust_contact from customers, orders, orderitems where customers.cust_id = orders.cust_id AND orders.order_num = orderitems.order_num AND prod_id = 'TNT2';

    INNER JOIN ON

    sql
    select vend_name, prod_name, prod_price from vendors inner join products on vendors.vend_id = products.vend_id;

    INNER JOIN ON 连接三个数据表的用法:

    SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

    INNER JOIN 连接四个数据表的用法:

    SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号)

    INNER JOIN 表4 ON Member.字段号=表4.字段号

    INNER JOIN 连接五个数据表的用法:

    SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号)

    INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

    自联结(相同的表查询两次)

    sql
    select p1.prod_id, p1.prod_name from products AS p1, products AS p2 where p1.vend_id = p2.vend_id AND p2.vend_id = "DTNTR";

    自然连结

    排除多次出现,使每个列只返回一次

    外部联结LEFT | RIGHT OUTER JOIN ON 返回包括没有的列

    sql
    select vendors.vend_name, products.prod_name from vendors left outer join products ON vendors.vend_id = products.vend_id;

    带聚集函数的联结
    例:检索所有客户及每个客户所下的订单数

    sql
    select customers.cust_name, customers.cust_id, count(orders.num) AS num_ord FROM customers inner join orders on customers.cust_id = orders.cust_id group by customers.cust_id;

    组合函数 union

    sql
    select vend_id, prod_id, prod_price from products where prod_price <= 5 union select vend_id, prod_id, prod_price from products where vend_id IN (1001, 1002);

    UNION使用规则

    • 必须由两条或两条以上的SELECT语句组成,语句之间用UNION分隔
    • 每个查询必须包含相同的列、表达式或聚集函数(次序可以不同)
    • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换类型
    • UNION默认自动取消重复的行,如果想返回所有匹配的行使用UNION ALL

    插入数据 INSERT INTO VALUES

    sql
    insert into user(username, age, addr) values ('zhangba', 17, 'shanghai');
    
    插入多条
    insert into user(username, age, addr) values ('zhangjiu', 18, 'shanghai'), ('lishi', 20, 'beijing'), ('wangyi', 17, 'shanghai');
    
    LOW_PRIORITY 降低INSERT语句的优先级
    insert low_priority into user(username, age, addr) values ('zhangba', 17, 'shanghai');

    插入数据INSERT INTO VALUES

    sql
    insert into user(username,age,addr) values ('zhangsan',17,'beijing');
    
    插入多条
    insert into user(username,age,addr) values ('zhangjiu', 18, 'shanghai'), ('lishi', 20, 'beijing'), ('wangyi', 17, 'shanghai');

    更新数据 UPDATE SET

    sql
    update user SET age = 20 where username = 'zhangsi';
    
    IGNORE 即使发生错误,也继续进行更新
    update ignore user set createdate = '2019-07-15' where addr = 'beijing';

    删除数据 DELETE FROM

    sql
    delete FROM t_user where username = 'liujiu';
    
    删除表中所有数据,删除原来的表并重新创建一个表,而delete是逐行删除,比deleteTRUNCATE TABLE user;

    创建表

    sql
     create table if not exists tb_user(          
        -> id int auto_increment primary key,//自增id从0开始
        -> user varchar(15) not null,
        -> password varchar(15) not null);

    修改表 ALTER TABLE

    sql
    向表中添加字段
    alter table user add createdate datetime;
    
    从表中删除字段
    alter table user drop column createdate;
    
    修改表中列的类型
    alter table user modify createdate char(20);
    
    修改表中列名
    alter table user change createdate starttime datetime;
    
    添加外键
    alter table user add constraint fk_t_user_test_one foreign KEY (外键名) references t_new_user (主键名); 
    
    on delete CASCADE on update CASCADE 联合删除 更新
    alter table test_one add constraint fk_t_user_test_one foreign KEY (n_id) references t_new_user (n_id) on delete CASCADE on update CASCADE;
    
    删除外键
    alter table test_one drop FOREIGN KEY fk_t_user_test_one;

    删除表DROP TABLE

    sql
    drop table user

    重命名表RENAME TABLE 原表名 TO 新表名

    sql
    rename table user to test;
    alter table user rename test

    视图

    sql
    创建视图
    create view v_getuser as select t_user.username, t_user.age from t_user;
    select * from v_getuser where age > 20;
    
    查看创建视图的语句
    show create view v_getuser;
    
    删除视图
    drop view v_getuser;
    
    更新视图 也可先dropcreate
    create or replace view;

    存储过程

    sql
    CREATE PROCEDURE getavg()
      BEGIN
        SELECT AVG(DISTINCT age) AS age_avg FROM t_user;
      END;
    
    调用存储过程
    CALL getavg();
    
    删除存储过程
    DROP PROCEDURE IF EXISTS getavg;
    
    显示存储过程的语句
    SHOW CREATE PROCEDURE getavg;
    
    显示所有存储过程
    SHOW PROCEDURE STATUS;
    
    过滤显示所有存储过程
    SHOW PROCEDURE STATUS LIKE '%user%';
    
    // 带输出参数
    CREATE PROCEDURE procedure_age(OUT age_min DECIMAL, OUT age_max DECIMAL)
      BEGIN
        SELECT MIN(DISTINCT age) INTO age_min FROM t_user;
        SELECT MAX(DISTINCT age) INTO age_max FROM t_user;
      END;
    
    CALL procedure_age(@ageMin, @ageMax);
    SELECT @ageMin as minage, @ageMax as maxage;

    游标

    sql
    CREATE PROCEDURE p_username()
      BEGIN
        -- 定义局部变量
        DECLARE u CHAR(20);
        DECLARE done BOOLEAN DEFAULT 0;
        DECLARE cur_user CURSOR FOR SELECT username FROM user;
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
        -- 开启游标
        OPEN cur_user;
        --循环每一行
        REPEAT
        -- 检索当前行的列
        FETCH cur_user INTO u;
          INSERT INTO p_users VALUES(u);
        --结束循环
        UNTIL done END REPEAT;
         -- 关闭游标
        CLOSE cur_user;
      END;

    触发器

    MySQL响应 DELETE、UPDATE 和 INSERT 而自动执行的一条MySQL语句(或位于 BEGIN 和 END 语句之间的一组语句)
    只有表才支持触发器,视图不支持,临时表也不支持

    sql
    创建触发器
    CREATE TRIGGER testtrigger AFTER INSERT ON user FOR EACH ROW SELECT 'add';
    
    删除
    DROP TRIGGER testtrigger;
    
    insert触发器
    CREATE TRIGGER insertuser AFTER INSERT ON user FOR EACH ROW SELECT NEW.id INTO @insert_id;
    INSERT INTO user(username, age, addr) VALUES('zhangyiyi', 23, 'tianjin');
    SELECT @insert_id;
    
    delete触发器 
    -- begin end 块的好处是触发器能容纳多条sql语句
    CREATE TRIGGER deleteuser BEFORE DELETE ON user FOR EACH ROW 
    BEGIN
    SELECT OLD.id INTO @delete_id;
    END;
    
    update触发器 OLD虚拟表访问更新之前的值,NEW访问更新之后的值
    CREATE TRIGGER updateuser BEFORE UPDATE ON user FOR EACH ROW SET NEW.username = UPPER(NEW.username);

    事务

    用来维护数据库的完整性,保证成批的mysql操作要么完全执行,要么完全不执行

    回滚ROLLBACK

    sql
    SELECT * FROM user;
    开启事务
    START TRANSACTION;
    DELETE FROM user;
    SELECT * FROM user;
    回滚
    ROLLBACK;
    SELECT * FROM user;

    提交COMMIT

    sql
    开启事务之后,只有都成功才会执行commit,出错都会撤销
    START TRANSACTION;
    DELETE FROM user WHERE id = 10;
    DELETE FROM user WHERE id = 11;
    提交
    COMMIT;

    保留点SAVEPOINT

    sql
    START TRANSACTION;
    INSERT INTO user(username, age, addr) VALUES ('zhangyier', 19, 'tianjin');
    SAVEPOINT insesrt_user;
    DELETE FROM user WHERE addr = 'tianjin';
    ROLLBACK TO insesrt_user;

    安全管理

    sql
    USE mysql;
    SELECT user FROM user;
    
    创建账号
    CREATE USER zyw IDENTIFIED BY 'zywrxq1224';
    
    重命名
    RENAME USER zyw TO zyw;
    
    删除账号
    DROP USER zyw1;
    
    显示账号权限
    SHOW GRANTS FOR zyw;
    
    授权
    GRANT SELECT, INSERT ON test_daily.* TO zyw;
    
    取消授权
    REVOKE SELECT ON test_daily.* FROM zyw;
    
    整个服务器
    GRANT ALL ON *.* TO zyw;
    整个数据库
    GRANT ALL ON test_daily.* TO zyw;
    整个表
    GRANT ALL ON test_daily.t_user TO zyw;
    
    修改账号密码
    ALTER user 'root'@'localhost' IDENTIFIED BY '新密码';

    __EOF__

  • 本文作者: 欢迎来到小赵同学的blog
  • 本文链接: https://www.cnblogs.com/ZhaoYork/p/17781208.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    24.【特殊函数篇==(十篇一章,持续更新~)】
    C语言高级教程-C语言数组(四):多维数组
    按漏洞的攻击途径分类情况分析
    计算机毕业设计ssm+vue基本微信小程序的智能图书管理系统
    16.预处理、动态库、静态库
    精彩回顾|【ACDU 中国行·成都站】数据库主题交流活动成功举办!
    第九章 项目人力资源管理
    论文阅读:自适应ViT(A-ViT)
    stack-es-标准篇-ElasticsearchClient-function_score
    什么是MQ
  • 原文地址:https://www.cnblogs.com/ZhaoYork/p/17781208.html