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;