As notas de estudo SQL

Inserir dados no banco de dados:

A primeira forma não especifica o nome da coluna que deseja inserir dados apenas fornecer o valor a ser inserido, você pode adicionar uma nova linha de dados:

INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); 

Em segundo lugar, se você quiser adicionar valor para todas as colunas na tabela, você não precisa especificar nomes de coluna na consulta SQL. No entanto, certifique-se a mesma ordem que as colunas dos valores da tabela.

INSERT INTO语法如下所示: INSERT INTO table_name VALUES (value1, value2, value3, ...);

Você pode verificar por outra tabela nos valores de campo instrução SELECT, então esses dados para preencher a tabela, que a tabela Campo outra consulta à tabela, os dados a serem inseridos é um para um.

INSERT INTO first_table_name [(column1, column2, ... columnN)] 
SELECT column1, column2, ...columnN FROM second_table_name [WHERE condition]; 

SQL INSERT INTO Sintaxe SELECT podemos replicar todas as colunas de uma tabela para outra tabela já existem em:

INSERT INTO tabela2 SELECT * FROM table1;

Ou a gente pode querer copiar uma linha existente para outra tabela:

INSERÇÃO EM table2 (column_name (s)) SELECT column_name (s) a partir tabela 1;

Quando você cria uma tabela, NULL sintaxe básica é a seguinte:

SQL> CREATE TABLE CUSTOMERS( ID INT NOT NULL,
 NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, 
ADDRESS CHAR (25) , 
SALARY DECIMAL (18, 2), 
PRIMARY KEY (ID) )

Aqui, significa não nula de que para uma determinada coluna, você deve explicitamente atribuídos de acordo com seu tipo de dados. Há dois anos e não é usado para definir NOT NULL, ou seja, estas colunas podem ser NULL. O valor é NULL campos são deixados em branco no processo de gravação de campos criados.

Exemplo superior / limite / rownum a seguinte instrução SQL para selecionar os três primeiros registros da tabela "Clientes": 

SELECT TOP 3 * FROM Clientes;

A declaração a seguir mostra SQL um exemplo do uso da cláusula LIMIT equivalente: 

SELECT * FROM Customers limite de 3;

A declaração a seguir mostra SQL um exemplo do uso de ROWNUM equivalente a: 

* SELECT FROM Clientes WHERE ROWNUM <= 3;

 

O operador SQL IN IN operador permite que você especifique vários valores na cláusula WHERE. EM OU operador é uma abreviação para uma pluralidade de condições.

SQL IN 语法 SELECIONAR column_name (s) FROM table_name ONDE column_name IN (valor1, valor2, ...);

或者 SELECCIONAR column_name (s) DE ONDE table_name column_name EM (instrução SELECT);

instrução DROP INDEX

instrução DROP INDEX para largar o índice da tabela.

sintaxe DROP INDEX para o MS Access: DROP INDEX index_name ON table_name

DROP INDEX Syntax para MS SQL Server é: DROP INDEX table_name.index_name

sintaxe DROP INDEX para DB2 / Oracle é: DROP INDEX index_name

sintaxe DROP INDEX para MySQL: ALTER TABLE table_name DROP INDEX index_name

instrução DROP TABLE

Instrução DROP TABLE para remover a tabela.

DROP TABLE table_name DROP DATABASE 语句

Instrução DROP DATABASE no banco de dados de exclusão.

DROP TABLE DATABASE database_name TRUNCATE 语句

 

Se nós só precisamos remover os dados na tabela, sem excluir a própria tabela, então como é que vamos fazer?

Use TRUNCATE TABLE: table_name TABLE TRUNCATE

 

SQL ALTER TABLE Syntax Para adicionar uma coluna à tabela, use a seguinte sintaxe:

ALTER TABLE table_name tipo de dados ADD column_name  

Para excluir uma coluna de uma tabela, use a seguinte sintaxe (Note que alguns sistemas de banco de dados não permitem isso para apagar um colunas da tabela de banco de dados):

ALTER TABLE table_name column_name DROP COLUMN  

Para alterar o tipo de dados das colunas na tabela, use a seguinte sintaxe:

SQL Server / MS Access: tipo de dados ALTER TABLE table_name ALTER COLUMN column_name

My SQL / Oracle: ALTER TABLE table_name ALTERAR COLUNA column_name tipo de dados

A sintaxe para MySQL

A seguinte instrução SQL "Pessoas" da tabela na coluna "ID" é definido para automaticamente incremento (auto-incremento) campo de chave primária:

CREATE TABLE Persons 
( ID int NOT NULL AUTO_INCREMENT,
 LastName varchar(255) NOT NULL, 
 FirstName varchar(255), 
 Address varchar(255),
 City varchar(255), 
 PRIMARY KEY (ID) )

MySQL usar AUTO_INREMENT palavra-chave para executar um auto-incremento (auto-incremento) tarefa.

Por padrão, AUTO_INREMENT valor inicial é 1, cada novo registro por um.

NOT NULL restrição: para garantir que os dados em uma coluna não pode ter uma restrição DEFAULT valor NULL: fornecer valores padrão UNIQUE restrição quando os dados não especificados coluna usada: para garantir que todos os dados na coluna varia restrição de chave primária: identifica exclusivamente uma linha da tabela de dados / gravação de restrição de chave estrangeira: identificar exclusivamente uma linha nas outras tabelas / registros restrições de verificação: todos os valores satisfazem uma certa condição para garantir esta coluna índice de restrição: para criação rápida ou recuperação de dados no banco de dados

Existem várias conexões SQL diferentes:

SQL JOIN cláusula é usada para combinar duas ou mais linhas de mesas juntos com base em um campo comum entre as tabelas

É a primeira determinar uma tabela primária como um conjunto de resultados, em seguida, as linhas para outras tabelas seletivamente "conexão" em cima da mesa principal no conjunto de resultados.

O conector (INNER JOIN): quando há um jogo de ambas as tabelas, linhas antes de retornar. (Selecione duas fileiras de mesas são devolvidos)

Deixou de ligação (LEFT JOIN): retorna todas as linhas da tabela esquerda, mesmo se não houver correspondência na linha da tabela direita. conexão direita (RIGHT JOIN): retornar todas as linhas na tabela à direita, mesmo se não houver deixado correspondente linha da tabela.

Totalmente conectado (FULL JOIN): enquanto uma tabela há uma correspondência, linha de retorno.

conector cartesiano (junção cartesiana): Apresenta o produto cartesiano de dois ou mais registos do conjunto de tabela.

Cadastre-se de execução de ordens

O seguinte é a estrutura geral consulta JOIN:

SELECT <row_list> 
FROM <left_table> <inner|left|right> 
JOIN <right_table> ON <join condition> 
WHERE <where_condition>

A sua implementação na seguinte ordem (instruções SQL para ser executado no primeiro é sempre a cláusula FROM):

A PARTIR DE: cerca de duas tabelas sobre a implementação do produto cartesiano, resultando no primeiro vt1 mesa. O número de linhas n * m

(N é o número de linhas na tabela esquerda, m é um número de linhas na tabela direita)

ON: A condição ON vt1 triagem progressiva, vt2 insere o resultado na

JOIN: adicionar uma linha externa.

Se LEFT JOIN (LEFT OUTER JOIN) for especificado, o primeiro a atravessar ao longo de cada linha da tabela esquerda,

Em que linha VT2 não irá ser inserido no VT2, os campos restantes será preenchida linha é nulo, o VT3 é formado;

Se o direito especificado JOIN é o mesmo motivo.

Se você especificar um INNER JOIN, não é adicionado a linha externa, o processo de inserção é ignorado,

VT2 = vt3 (INNER JOIN filtros assim colocados na posição ON OR, em que há diferença entre os resultados da execução)

ONDE: par linha filtragem condições para vt3, satisfazendo a condição é transmitido para o VT4

SELECT: Remova o campo especificado para o VT4 VT5

PS: Na verdade, podemos ver LEFT JOIN e RIGHT JOIN não é diferente da semântica,

Os resultados dependem da diferença entre a tabela ordem os dois esquerda e direita colocação

SQL INTERSECT cláusula: combinar duas instruções SELECT, mas só retorna os resultados de duas instruções SELECT em ambas as linhas.

Dinâmica SQL:

1. <onde> </ Where> condições add dinâmico onde

<Se test = ""> </ if> determinação dinâmico, determina se o argumento passado corretamente

select * from emp 
<where> 
    <if test="name != null and name !=''"> 
        name like concat('%',#{name},'%') 
    </if> 
    <if test="job != null and job != ''"> 
        and job = #{job} 
    </if> 
</where>

2. <foreach collection = "ids" Item = "id" separator = "" abertas = "(" Close = ")"> </ froeach>

<insert id="addBatchSave"> 
    insert into tbl_employee(last_name,email,gender) 
    values 
    <foreach collection="emps" item="emppp" separator=","> 
        (#{emppp.lastName},#{emppp.email},#{emppp.gender}) 
    </foreach> 
</insert>

3. <set> </ set> atualizações dinâmicas

<update id="updateEmp"> 
    update emp 
    <set> 
        <if test="name != null and name != ''"> 
            name=#{name}, 
        </if> 
        <if test="job != null and job != ''"> 
            job=#{job} 
        </if>
    </set> 
    where id=#{id} 
</update>

4. <SQL ID = "idName"> </ SQL> frequentemente usados ​​fragmento encapsulamento SQL, referência é <includ refid = "idName">

<sql id="insertColumn"> 
    <if test="_databaseId=='mysql'"> 
        id,last_name,email,gender 
    </if> 
    <if test="_databaseId=='oracle'"> 
        id,last_name,email,department_id 
    </if> 
</sql> 
<insert id="addEmployeeBysql" databaseId="mysql"> 
    insert into tbl_employee( <!-- 引用外部定义的sql --> 
    <include refid="insertColumn" ></include> ) 
        values (#{id},#{lastName},#{email},#{gender}) 
</insert>

5. <guarnição prefix = "onde" prefixOverrides = "" sufixo = "" suffixOverrides = "e">

prefix = "": Prefixo: guarnição importância corpo guia para lutar contra o resultado de toda a cadeia string. prifix toda corda para combater uma cadeia de prefixo

prifixOverrides = "": override prefixo: a remoção de toda a cadeia de caracteres na frente do adicional

sufixo = "": Sufixo: para combater toda a cadeia mais uma seqüência de sufixo

suffixOverrides = "": tampa sufixo: a remoção de toda a cadeia de caracteres, seguido por excesso

Alternativamente valores integrais começando com o prefixo, por substituição de parte de sufixo final global.

select * from emp 
    <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and"> 
        <if test="job != null and job != ''"> 
            job=#{job} and 
        </if> 
        <if test="topid != null and topid != ''"> 
            topid=#{topid} and 
        </if> 
    </trim>

6. <escolheu> <quando test = ""> </ quando> <quando test = ""> </ quando> </ escolheu>

Quando pela primeira vez quando estabelecido, ele não será executado para baixo. Enquanto uma frente não se sustenta, é baixo para juiz, encontrar o fim do estabelecimento.

select * from emp 
<where> 
    <choose> 
        <when test="name != null and name != ''"> 
            name like concat('%',#{name},'%') 
        </when> 
        <when test="job != null and job !=''"> 
            and job=#{job} 
        </when> 
    </choose> 
</where>

juntar-se na parte de trás da condição e da condição em que a diferença entre:

1, seleccione a partir de * Tab1 deixado aderir tab2 em (tab1.size = tab2.size) onde tab2.name = 'AAA' 2, seleccionar a partir de * Tab1 deixado aderir tab2 em (tab1.size = tab2.size e tab2.name = 'AAA') 第一 条 SQL 的 过程: 1, 中间 表 em 条件: tab1.size = tab2.size

 

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA

2

20

20

BBB

2

20

20

CCC

3

30

(nulo)

(nulo)

2, e, em seguida, filtrando a tabela intermédia onde as condições: tab2.name = 'AAA'

 

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA

SQL procedimento segundo: 1, a tabela intermediária com a condição de: tab1.size = tab2.size e tab2.name = 'AAA'

 

tab1.id

tab1.size

tab2.size

tab2.name

1

10

10

AAA

2

20

(nulo)

(nulo)

3

30

(nulo)

(nulo)

sql na data, a date_format diferença, STR_TO_DATE de:

1, data (DateString)

DateString expressão de data é legítimo

如: SELECT DATE ( '2017/02/09 15: 25: 46,635') FROM dual; -> '2017/02/09'

2, date_format (DateString, formato)

argumento DateString é a data legítimo. formato de saída de formato pré-determinada data / hora.

如: SELECCIONAR STR_TO_DATE ( '2017/02/09 15: 25: 46,635', '% Y% m-% d')

DE dual; -> '2017/02/09'

3.str_to_date (str, formato)

Usando a função STR_TO_DATE (str, formato), em que, formato, como mostrado no formato acima ainda.

Notavelmente, o formato e o formato requerido formato consistente str, por exemplo STR_TO_DATE ( '2017/08/07 16:56:12', '% Y% m-% d% H:% I:% s' ), um erro ocorre se inconsistente. Não repeti-los.

 

otimização de SQL: regras de otimização comuns

Tabela 2.1 ligações

  • Quanto mais conexões tabelas, quanto mais pobre o desempenho
  • Se possível, dividida numa pluralidade de procedimento de ligação executado um
  • Preferencialmente executado pode reduzir significativamente a quantidade de conexão de dados, não só reduz a complexidade, é possível realizar facilmente como esperado
  • Se o multi-mesa inevitável junta, é provável que seja uma falha de projeto
  • ligação externa maus resultados, porque ele deve ser ao redor da mesa para verificação de tabela
  • Tente usar interior consulta de junção

2.2 usar uma tabela temporária

Se for inevitável, considerar o uso de tabelas temporárias ou variáveis ​​de tabela para armazenar resultados intermediários.

2.3 menos subconsultas

2.4 vista aninhada

Não muito profundo, a visão geral da preferência aninhados não mais do que 2.

3, Precauções gravação SQL

coluna 3,1 NULL

colunas nulos usar o índice não faz sentido qualquer coluna que contém os valores nulos não serão incluídos no índice. Portanto, quando a indicação é nulo ou não é nulo otimizador declaração não tem permissão para usar o índice.

3,2 concatenação ou ||

ou cadeia concatenação operador concatenação || mysql e Oracle, se a função da operação da coluna, ele também ignora a reunião usando o índice. Compare a seguinte consulta:

- 忽 律 索引 selecione ... de .. onde first_name || '' || last_name = 'bill gates';

- 使用 索引 selecione ... de .. onde first_name = 'Bill' e last_name = 'bill gates';

3.3 como

O curinga, em primeiro lugar, não pode usar o índice, caso contrário você pode.

- Não é possível utilizar o Índice de seleccionar a partir de .. .., onde nome como '% t%';

- Você pode usar o índice seleccionar .. de .. onde nome like 't%';

3,4 ordem pela

Não use o fim da cláusula de colunas não-indexados ou expressões aninhadas, isso irá resultar em desempenho reduzido.

3,5 operação Não

não utilizar o cálculo do índice não pode ser alterada para outras operações pode usar o índice. Da seguinte forma:

- inválido Índice de escolha .. de .. onde sal = 3000 ;!

- Início do Índice seleccionar .. de .. onde sal <3000 ou sal> 3000;

3,6 onde 与 tendo

seleccionar .. de .. .., onde a .. .. por grupo possuindo .. ordem por .. .. limite, estrutura de sintaxe da instrução SQL superior, em que em, onde um filtro e tendo um comportamento, o comportamento do filtro pode ser concluída com antecedência, mais você pode reduzir a quantidade de dados a serem passados ​​para a próxima fase, por isso, se o comportamento de filtragem em ter que completa em onde, você deve priorizar onde conseguir.

3.7 existe em alternativa

Não é, no mínimo eficaz, devido à mesa de sub-consulta tabela completa digitalização. Considere o uso de links externos ou não existe. Da seguinte forma:

- correta SELECT * FROM EMP

ONDE EMPNO> 0 e que existe (SELECT 'X' FROM DEPT

ONDE DEPT.DEPTNO = EMP.DEPTNO E LOC = 'MELB')

- Select Erro * FROM EMP

ONDE EMPNO> 0 e DEPTNO IN (SELECT DEPTNO DE DEPT ONDE LOC = 'MELB')

3.8 Índice

Os benefícios do índice de busca binária pode ser alcançado, a complexidade de tempo é O (log2N)

Mas há custos, a necessidade de espaço adicional para armazenar os dados do índice, e cada inserção, atualização e exclusão no índice será atualizado, de modo que o aumento será mais do que 4,5 vezes o disco IO. Portanto, dar algum do uso desnecessário de campo índice aumentou o índice irá reduzir o desempenho do sistema. Para o Oracle falando, instruções SQL, tente maiúsculas, minúsculas necessidade interna para gravação ao Universidade Nacional Cheng Kung, e depois executado.

Não use a função na coluna índice, ele vai parar de usar o índice, uma varredura completa da tabela, como segue:

- 错误 SELECT ... FROM DEPT ONDE SAL * 12> 25000;

- correta SELECT ... FROM DEPT ONDE SAL> 25000/12;

3,9> e> =

- 4 posicionado directamente para a gravação (recomendado) seleccionar .. de .. onde SAL> = 4;

- 3 a primeira localizar, encontrar novamente depois de um (não recomendado) seleccionar .. de .. onde SAL> 3;

3.10 união em vez de ou

Colunas no índice, ou podem, alternativamente, operar usando união. ou ação na coluna indexada causou uma varredura completa da tabela.

- 高效: SELEÇÃO LOC_ID, LOC_DESC, REGIÃO DE LOCALIZAÇÃO

ONDE LOC_ID = 10 UNION SELECT LOC_ID, LOC_DESC, REGIÃO DE LOCALIZAÇÃO

WHERE REGIÃO = 'MELBOURNE'

- 低效: SELEÇÃO LOC_ID, LOC_DESC, REGIÃO DE LOCALIZAÇÃO

ONDE LOC_ID = 10 OU REGIÃO = 'MELBOURNE'

3.11 é nulo e não é nulo

Se a coluna pode estar vazio, evitando o uso do índice. Para o índice de pluralidade de colunas de, pelo menos, garantir que, pelo menos, uma coluna não está em branco. Para o índice multi-coluna, acesso somente a primeira coluna do índice será habilitado, se o acesso à parte de trás da coluna usando uma varredura completa da tabela.

- ineficiente: (Failure Index) SELECT .. DE departamento onde DEPT_CODE IS NOT NULL;

- Eficácia: (índice eficaz) SELECT .. DE departamento onde DEPT_CODE> = 0;

3.12 união & toda a união

união com a operação de deduplicação, o tempo de cálculo aumenta. não há necessidade de re-união de tudo, mas irá incluir o mesmo registro. Sob a mesma função, a união preferido toda a operação.

vista Base de dados: Uma vista é derivado a partir de um ou vários tabela de base (vista) da tabela, que é diferente da tabela de base é uma tabela virtual;

CREATE VIEW Student (Sno, sname, Ssex, Sage, Sdept) AS SELECT SX.Sno, SX.Sname, SY.Ssex, SX.Sage, SY.Sdept DE SX, SY ONDE SX.Sno = SY.Sno;

 

Publicado 15 artigos originais · ganhou elogios 0 · Visualizações 273

Acho que você gosta

Origin blog.csdn.net/weixin_45146962/article/details/105113375
Recomendado
Clasificación