limit 与offset的用法

在mysql中一般使用limit来实现分页

LIMIT后面跟一个参数,表示要提取的数量。
如 :select from test LIMIT 3 指提取前三条数据,类似sqlServer的top语法。
LIMIT后面跟两个参数时,第一个参数是指第几行,第二个参数是取几条数据。
如: select
from test limit 2,3; 这个SQL是指从第二行的下一行开始向下取3条数据。(即取:3,4,5行的三条数据)
LIMIT和OFFSET组合使用时,LIMIT后面只能有一个参数,表示要提取的数量,offset后面的数字则表示第几行。
如:select * from test LIMIT 3 offset 2; 这个SQL是指从第二行的下一行开始向下取3条数据。(即取:3,4,5行的三条数据)
————————————————
版权声明:本文为CSDN博主「chenflap」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44145208/article/details/110470972

主键(primary key)

mysql有三种建表方式

  1. 常规创建
    create table if not exists 目标表
  2. 复制表格
    create 目标表 like 来源表
  3. 将table1的部分拿来创建table2
    create table if not exists actor_name
    (
    first_name varchar(45) not null,
    last_name varchar(45) not null
    )
    select first_name,last_name
    from actor

    对表批量插入数据

    insert into:插入数据,如果主键重复,则报错 insert repalce:插入替换数据,如果存在主键或unique数据则替换数据 insert ignore:如果存在数据,则忽略。

插入行内容

insert into

手工插入:表名 values(v1,v2,..),values(v1,v2,…),…

  1. insert into actor
  2. values(1,"PENELOPE","GUINESS",'2006-02-15 12:34:33'),
  3. (2,"NICK","WAHLBERG",'2006-02-15 12:34:33')

这条语句高度依赖表中列的定义顺序。虽然简单,但是并不安全。如果表的结构发生变化,就会报错。

最好表名后给出列名(如下)。

这样即使表的结构发生变化,语句依然可以执行。(悄悄的嘀咕~虽然更繁琐)。

  1. insert into actor
  2. (actor_id,first_name,last_name,last_update)
  3. values
  4. (1,"PENELOPE","GUINESS","2006-02-15 12:34:33"),
  5. (2,"NICK","WAHLBERG","2006-02-15 12:34:33")

插入结果集:insert into 新表 select a,b from 被复制表

  1. create table if not exists actor_name (
  2. first_name varchar(45) not null,
  3. last_name varchar(45) not null
  4. );
  5. insert into actor_name select first_name,last_name from actor;
  1. CREATE TABLE if not exists actor_name
  2. select first_name, last_name from actor;

insert repalce:插入替换数据,如果存在主键或unique数据则替换数据

insert ignore:如果存在数据,则忽略。

  1. /*
  2. mysql中常用的三种插入数据的语句:
  3. insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
  4. replace into表示插入替换数据,需求表中有PrimaryKey,
  5. 或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
  6. insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;*/
  7. insert ignore into actor values("3","ED","CHASE","2006-02-15 12:34:33");

插入列内容

用 alter table 表名 add(‘列的属性’)

ALTER TABLE <表名> ADD COLUMN <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];
如果要设置默认的值 用default 

题目
在actor表last_update后面新增加一列名字为create_date,
类型为datetime, NOT NULL,默认值为'2020-10-01 00:00:00'

alter table actor 
add column create_date datetime not null default '2020-10-01 00:00:00' after last_update

MySQL中给字段创建不同类型索引的基本语法

添加主键

ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
// 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

添加唯一索引

ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
// 这条语句创建索引的值必须是唯一的。

添加普通索引

ALTER TABLE tbl_name ADD INDEX index_name (col_list);
// 添加普通索引,索引值可出现多次。

添加全文索引

ALTER TABLE tbl_name ADD FULLTEXT index_name (col_list);
// 该语句指定了索引为 FULLTEXT ,用于全文索引。

PS: 附赠删除索引的语法:

DROP INDEX index_name ON tbl_name;
// 或者
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;

PPS:用CREATE来创建索引

注意事项:每一段索引要加;!!
唯一索引:CREAT UNIQUE INDEX 索引命名 ON 表名(‘建立索引的对象’)

CREATE UNIQUE INDEX uniq_idx_firstname ON actor (`first_name`);

普通索引

CREATE INDEX idx_lastname ON actor (`last_name`);

CREATE INDEX的基本常用语法:

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name ON tbl_name (col_name);
//该语句指定了索引可以是唯一索引、全文索引、空间索引(一种基于空间对象的空间关系排

使用索引进行查询

强制索引

mysql 使用 force index 进行强制索引: force index (index_name)

//注意:括号是必须的
题目:针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005,使用强制索引。

select * from salaries
force index (idx_emp_no) where emp_no = 10005;

针对原表创建视图

题目描述:针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v

1.直接在视图名的后面用小括号创建视图中的字段名

create view actor_name_view (first_name_v,last_name_v) as
select first_name ,last_name from actor

2.在select后面对列重命名为视图的字段名

create view actor_name_view as
select first_name as first_name_v
       ,last_name as last_name_v
from actor

用curdate() 获取当前日期

SQL之CASE WHEN用法详解

sum(case(type) when('add') then grade_num else -grade_num end) grade_sum

求中位数

给出个数时:

当某一数的正序和逆序累计个数均大于整个序列的数字个数的一半即为中位

select grade #4 输出
from (
    select  grade
            ,(select sum(number) from class_grade) as 'total'
            ,sum(number) over(order by grade) a
            ,sum(number) over(order by grade desc) b
    from class_grade 
    ) t1 #1求出总个数,正序个数,逆序个数
where a >= total/2 and b >=total/2 #2 留下正序和逆序个数>总个数的一半的
order by grade #3 排序

其他思路

常用字符串函数

常用函数 对应描述
RIGHT(s,n) 返回字符串 s 的后 n 个字符
LEFT(s,n) 返回字符串 s 的前 n 个字符
MID(s,n,len) 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)
LCASE(s) 将字符串 s 的所有字母变成小写字母