SQL总结

来源:互联网 发布:美得惨绝人寰知乎 编辑:程序博客网 时间:2024/06/06 10:57

原文博客链接:http://zhuqiuhui.space/Blogs/2017/04/sql-study.html

一、递增问题

     用语句来给字段设置递增属性

alter table user drop column user_id
alter table user add user_id int identity (1,1) not null


二、unique

     1、创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。

     2、创建唯一索引语句:

create unique index name ON user(user_name); 
alter table user add unique index(user_id,user_name);

     3、删除唯一索引:

alter table user drop index name;


三、非主键字段值递增

insert into t_seq(seq, description) values((select IFNULL(max(seq),0)+1 from t_seq),'商品23'); //报错:You can't specify target table <tbl> for update in FROM clause,即查的时候不能更改
  
//改成下面语句,先查询出一个视图来
insert into t_seq(seq, description) values((select IFNULL(max(seq),0)+1 from (select seq from t_seq) as t),'商品23');
  
//也可改成 select case when......

注:这样的查询语句虽然可以解决问题,但在大大降低了查询效率,不建议使用,可以使用锁机制来做。


四、mybatis sql中的where

      where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。


五、MySQL数据库delete数据时,不支持给表起别名


六、MySQL中的“INSERT ... ON DUPLICATE KEY UPDATE”语句

     使用场景:如user表,含有user_id(主键)、user_num(unique类型,意义可理解为学号)、count(int类型),当插入学生信息时,若学号相同,则使coun加1,语句如下:

insert into user(user_num) values (2014223040012) on duplicate key update count = count + 1//若user表中已经有学号为“2014223040012”,则count加1

 

七、处理mysql表中字段为保留字的插入情况

    如表结构:user表,含有user_id(主键)、user_num(unique类型,意义可理解为学号)、delete(int类型,意义可理解为是否已经删除)

insert into user(user_id, user_num, `delete`) values(6452); // 其中delete是由反引号括起来,否则会报错!


   保留字表示例:

ADD                     ALL                       ALTER  
ANALYZE                 AND                       AS  
ASC                     ASENSITIVE                BEFORE  
BETWEEN                 BIGINT                    BINARY  
BLOB                    BOTH                      BY  
CALL                    CASCADE                   CASE  
CHANGE                  CHAR                      CHARACTER  
CHECK                   COLLATE                   COLUMN  
CONDITION               CONNECTION                CONSTRAINT  
CONTINUE                CONVERT                   CREATE  
CROSS                   CURRENT_DATE              CURRENT_TIME  
CURRENT_TIMESTAMP       CURRENT_USER              CURSOR  
DATABASE                DATABASES                 DAY_HOUR  
DAY_MICROSECOND         DAY_MINUTE                DAY_SECOND  
DEC                     DECIMAL                   DECLARE  
DEFAULT                 DELAYED                   DELETE  
DESC                    DESCRIBE                  DETERMINISTIC  
DISTINCT                DISTINCTROW               DIV  
DOUBLE                  DROP                      DUAL  
EACH                    ELSE                      ELSEIF  
ENCLOSED                ESCAPED                   EXISTS  
EXIT                    EXPLAIN                   FALSE  
FETCH                   FLOAT                     FLOAT4  
FLOAT8                  FOR                       FORCE  
FOREIGN                 FROM                      FULLTEXT  
GOTO                    GRANT                     GROUP  
HAVING                  HIGH_PRIORITY             HOUR_MICROSECOND  
HOUR_MINUTE             HOUR_SECOND               IF  
IGNORE                  IN                        INDEX  
INFILE                  INNER                     INOUT  
INSENSITIVE             INSERT                    INT  
INT1                    INT2                      INT3  
INT4                    INT8                      INTEGER  
INTERVAL                INTO                      IS  
ITERATE                 JOIN                      KEY  
KEYS                    KILL                      LABEL  
LEADING                 LEAVE                     LEFT  
LIKE                    LIMIT                     LINEAR  
LINES                   LOAD                      LOCALTIME  
LOCALTIMESTAMP          LOCK                      LONG  
LONGBLOB                LONGTEXT                  LOOP  
LOW_PRIORITY            MATCH                     MEDIUMBLOB  
MEDIUMINT               MEDIUMTEXT                MIDDLEINT  
MINUTE_MICROSECOND      MINUTE_SECOND             MOD  
MODIFIES                NATURAL                   NOT  
NO_WRITE_TO_BINLOG      NULL                      NUMERIC  
ON                      OPTIMIZE                  OPTION  
OPTIONALLY              OR                        ORDER  
OUT                     OUTER                     OUTFILE  
PRECISION               PRIMARY                   PROCEDURE  
PURGE                   RAID0                     RANGE  
READ                    READS                     REAL  
REFERENCES              REGEXP                    RELEASE  
RENAME                  REPEAT                    REPLACE  
REQUIRE                 RESTRICT                  RETURN  
REVOKE                  RIGHT                     RLIKE  
SCHEMA                  SCHEMAS                   SECOND_MICROSECOND  
SELECT                  SENSITIVE                 SEPARATOR  
SET                     SHOW                      SMALLINT  
SPATIAL                 SPECIFIC                  SQL  
SQLEXCEPTION            SQLSTATE                  SQLWARNING  
SQL_BIG_RESULT          SQL_CALC_FOUND_ROWS       SQL_SMALL_RESULT  
SSL                     STARTING                  STRAIGHT_JOIN  
TABLE                   TERMINATED                THEN  
TINYBLOB                TINYINT                   TINYTEXT  
TO                      TRAILING                  TRIGGER  
TRUE                    UNDO                      UNION  
UNIQUE                  UNLOCK                    UNSIGNED  
UPDATE                  USAGE                     USE  
USING                   UTC_DATE                  UTC_TIME  
UTC_TIMESTAMP           VALUES                    VARBINARY  
VARCHAR                 VARCHARACTER              VARYING  
WHEN                    WHERE                     WHILE  
WITH                    WRITE                     X509  
XOR                     YEAR_MONTH                ZEROFILL

八、group_concat函数使用

select id,group_concat(name) from aa group by id;
select id,group_concat(name separator ';') from aa group by id;
select id,group_concat(distinct name) from aa group by id;
select id,group_concat(name order by name desc) from aa group by id;

九、count(*)

 

  1. 【强制】不要使用 count(列名)或 count(常量)来替代 count(*),count(*)就是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
    说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。

  2. 【强制】count(distinct col) 计算该列除 NULL 之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0。 

 
0 0
原创粉丝点击