Last active
February 6, 2025 21:02
-
-
Save RichardChalk/f712c63ad9cfeb12a6f677882b46b92a to your computer and use it in GitHub Desktop.
Create Syntax - SQL Fördjupning
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- TIPS | |
-- Om du får 'jordgubbsland' utan förklarning kan det vara Intellisense cachen! | |
-- Intellisense i Query fönstret uppdaterar inte sig själv. | |
-- För att göra det manuellt gå till Edit -> Intellisense -> Refresh Local cache | |
-- Eller CTRL SHIFT R | |
-- CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE | |
-- CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE | |
-- CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE | |
-- CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE CREATE DATABASE | |
-- Vi skapar en tabell tillsammans med hjälp av SSMS GUI först... klunkigt! Tidskrävande. | |
-- Stor risk för att göra fel. | |
-- Allt vi gör måste göras om... om databasen blir raderad eller korrupt. | |
-- Det finns ett bättre sätt! SYNTAXER! | |
-- Denna syntax kommer att skapa en helt ny databas på era lokala SQL Server | |
-- Vi klickar på antingen Execute eller F5 | |
-- Se du den nya databasen? | |
CREATE DATABASE DeleteMe | |
-- ---------------------------------------------------------------------------------------------- | |
-- Kan du gissa vad denna syntax gör? :) | |
DROP DATABASE DeleteMe | |
-- ---------------------------------------------------------------------------------------------- | |
-- Om du är connected till dbas DeleteMe kommer inte DROP syntaxen att fungera! | |
-- Du får inte radera en databas som har active connections! (se dropdown listan i menyn högst upp) | |
-- För att lösa detta kan du connecta till en annan dbas temporärt | |
USE master | |
DROP DATABASE DeleteMe | |
-- ---------------------------------------------------------------------------------------------- | |
-- Vi vill jobba med vår nya databas... så vi skapar den igen och se till att koppla upp oss mot den | |
-- `GO`-satsen är faktiskt inte en del av T-SQL-syntaxen; | |
-- den är en batch-separatör som används av vissa verktyg, inklusive SQL Server Management Studio (SSMS). | |
-- Den erkänns inte av SQL Server-databasmotorn i sig själv, utan används för att separera batches | |
-- av T-SQL-kod vid sändning av förfrågningar till servern från verktyg som SSMS. | |
-- I SSMS, när du kör en skript som innehåller flera omgångar av T-SQL-kod, indikerar `GO`-satsen | |
-- slutet på en batch och början på nästa. Varje omgång skickas sedan separat till SQL Server för utförande. | |
CREATE DATABASE DeleteMe | |
GO | |
USE DeleteMe | |
-- CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE | |
-- CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE | |
-- CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE | |
-- CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE CREATE TABLE | |
CREATE TABLE tbl_Employee | |
( | |
FirstName VARCHAR(100), | |
MiddleName VARCHAR(100), | |
LastName VARCHAR(100), | |
Age INT | |
) | |
-- ---------------------------------------------------------------------------------------------- | |
-- Option 1 | |
-- Om man inte inkluderar kolumnerna i INSERT raden så MÅSTE man ha VALUES för VARJE kolumn | |
INSERT INTO tbl_Employee | |
VALUES ('Homer', 'J', 'Simpson', 51) | |
-- Option 2 | |
-- TIPS - Ta bort siffran 49... kör igen... vad händer? | |
INSERT INTO tbl_Employee | |
VALUES ('Marge', null, 'Simpson', 49) | |
-- Option 3 | |
-- Här definierar vi att endast 3 kolumner är relvanta för oss i denna insert | |
-- OBS: Detta fungerar endast om kolumnerna som saknas (MiddleName) tillåter null | |
INSERT INTO tbl_Employee(FirstName, LastName, Age) | |
VALUES | |
('Lisa', 'Simpson', 11), | |
('Bart', 'Simpson', 9) | |
-- ---------------------------------------------------------------------------------------------- | |
-- Det saknas en del viktiga saker från vår tbl_Employee | |
-- Vi skapar om tabellen som numera innehåller PK och några constraints (not null) | |
-- Först raderar vi den gamla sämre tabellen | |
DROP TABLE tbl_Employee | |
-- Visa tabellen i GUI... titta på PK... Identity ifylld! Woohoo! | |
CREATE TABLE tbl_Employee | |
( | |
Id INT IDENTITY(1,1) PRIMARY KEY, | |
FirstName VARCHAR(100) NOT NULL, | |
MiddleName VARCHAR(100), | |
LastName VARCHAR(100) NOT NULL, | |
Age INT NOT NULL | |
) | |
-- fr1. Varför fungerar inte denna? Id? | |
INSERT INTO tbl_Employee(Id, FirstName, MiddleName, LastName, Age) | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', null, 'Simpson', 9) | |
-- fr2. Denna fungerar inte heller. Varför? Efternamn? | |
INSERT INTO tbl_Employee(FirstName, MiddleName, LastName, Age) | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', 'Simpson', null, 9) | |
-- fr3. Denna fungerar inte heller. Varför? Ålder? | |
INSERT INTO tbl_Employee(FirstName, MiddleName, LastName, Age) | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', null, 'Simpson', 'Nine') | |
-- fr4. Lägg märke till att denna faktiskt fungerar! | |
-- SSMS är så smart att den kasta om strängen 9 till en INT! | |
INSERT INTO tbl_Employee(FirstName, MiddleName, LastName, Age) | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', null, 'Simpson', '9') | |
-- Success! Hmmm dubletter! | |
INSERT INTO tbl_Employee(FirstName, MiddleName, LastName, Age) | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', null, 'Simpson', 9) | |
-- Funkar också... (utan att definiera kolumnerna) | |
-- Men nu MÅSTE vi insert data i exakt samma ordning som tabellen! | |
INSERT INTO tbl_Employee | |
VALUES | |
('Homer', 'J', 'Simpson', 51), | |
('Marge', null, 'Simpson', 49), | |
('Lisa', null, 'Simpson', 11), | |
('Bart', null, 'Simpson', 9) | |
-- UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE | |
-- UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE | |
-- UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE | |
-- UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE UPDATE TABLE | |
-- Jag glömde lägga till telefon... | |
ALTER TABLE tbl_Employee ADD Telephone VARCHAR(30) NOT NULL | |
-- 'Telephone' kolumn tillåter INTE null... | |
-- Om det redan finns data i denna tabell kommer inte denna syntax att tillåtas! | |
-- Var skulle hända med alla poster som redan fanns!? | |
-- De kommer att bli tilldelade värdet null... trots att det egentligen inte tillåts... | |
-- Detta strider mot contraint och kommer därför att skapa en error! | |
-- Om det inte finns data i tabellen redan kommer syntaxen att fungera utan problem :) | |
-- Vi behöver inte Telephone kolumnen.. .vi raderar den. | |
ALTER TABLE tbl_Employee DROP COLUMN Telephone | |
-- GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX | |
-- GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX | |
-- GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX | |
-- GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX GUI SKAPAR SYNTAX | |
-- TIPS | |
-- När man använder ADD behöver man INTE skriver COLUMN | |
-- När man använder DROP MÅSTE man skriva COLUMN | |
-- ---------------------------------------------------------------------------------------------- | |
-- TIPS | |
-- Man kan få hjälp från SSMS GUI att skapa syntaxer också! | |
-- 1. Högerklick på 'tbl_Employee' i Obejct Explorer till höger | |
-- 2. Välj 'Script Table as' | |
-- 3. Välj 'Create To' | |
-- 4. Välj 'New Query Editor Window' | |
-- Till slut får man denna syntax... | |
-- Det finns en hel del i denna syntax som vi inte förstår (och inte behöver förstå!) | |
-- Men... vi ser exakt var och hur tabellen skapas. | |
-- Användbar om du vill skicka till en arbetskollega :) | |
USE [DeleteMe] | |
GO | |
/****** Object: Table [dbo].[tbl_Employee] Script Date: 2023-08-09 10:09:51 ******/ | |
SET ANSI_NULLS ON | |
GO | |
SET QUOTED_IDENTIFIER ON | |
GO | |
CREATE TABLE [dbo].[tbl_Employee]( | |
[Id] [int] IDENTITY(1,1) NOT NULL, | |
[FirstName] [varchar](100) NOT NULL, | |
[MiddleName] [varchar](100) NULL, | |
[LastName] [varchar](100) NOT NULL, | |
[Age] [int] NOT NULL, | |
PRIMARY KEY CLUSTERED | |
( | |
[Id] ASC | |
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] | |
) ON [PRIMARY] | |
GO | |
-- ---------------------------------------------------------------------------------------------- | |
-- RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS | |
-- RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS | |
-- RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS | |
-- RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS RELATIONS | |
-- Homer jobbar på en Nuclear Power Plant... | |
-- Så vi skapar en ny tabell som heter 'Employer' | |
CREATE TABLE tbl_Employer | |
( | |
Id INT IDENTITY(1,1) PRIMARY KEY, | |
CompanyName VARCHAR(100) NOT NULL, | |
) | |
INSERT INTO tbl_Employer(CompanyName) | |
VALUES | |
('Nuclear Power Plant') | |
-- Vi vill kunna skapa en tabell och relaterar Homer till rätt arbetsplats | |
-- Enklast är att lägga till en ny kolumn i Employee tabellen med en Foreign key | |
-- Lisa och Bart har inget jobb... så vi tillåter NULL | |
ALTER TABLE tbl_Employee ADD EmployerId INT | |
-- Nu kan vi skriva syntaxen som kopplar employer tabellen till employee | |
ALTER TABLE [dbo].[tbl_Employee] WITH CHECK ADD CONSTRAINT [FK_tbl_Employee_tbl_Employer] FOREIGN KEY([EmployerId]) | |
REFERENCES [dbo].[tbl_Employer] ([Id]) | |
GO | |
-- Nu kontrollerar vi att relationen finns... och inga felaktiga kopplingar får göras i framtiden | |
ALTER TABLE [dbo].[tbl_Employee] CHECK CONSTRAINT [FK_tbl_Employee_tbl_Employer] | |
GO | |
-- Och till slut... se vi till att Homer arbetar på rätt arbetsplats | |
-- Denna kommer INTE att fungera! Eftersom det finns inga EmployerIds med värdet 1001! | |
UPDATE tbl_Employee | |
SET EmployerId = 1001 | |
WHERE FirstName = 'Homer'; | |
-- Denna fungerar! :) Eftersom det finns en EmployerId med värdet 1! | |
UPDATE tbl_Employee | |
SET EmployerId = 1 | |
WHERE FirstName = 'Homer'; | |
-- Nu kan vi ställa en fråga till vår databas (mer om detta i en senare kurs) | |
SELECT * FROM tbl_Employee ee | |
INNER JOIN tbl_Employer er ON er.Id = ee.Id | |
-- ---------------------------------------------------------------------------------------------- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment