
SQL AI
Lubomír Husar
Umělá inteligence rozumí databázím a umí psát SQL. Snadno s ní vytvoříte, upravíte a opravíte SQL dotazy. Občas se ale splete.
Když jí na to upozorníte, omluví se a zkusí chybu opravit. Někdy se jí to povede. Někdy ne. Proto potřebujete umět SQL, abyste rozuměli tomu, co vám umělá inteligence odpovídá.
Snaživý stážista
Berte AI jako stážistu.
Chytrého a snaživého stážistu, kterého ale musíte kontrolovat a opravovat, protože dělá chyby. V některých případech vám dokonce nepomůže vůbec a vy pak za něj musíte udělat práci sami.
Je to logické, protože umělá inteligence pracuje na principu pravděpodobnosti. Proto se snaží odpovědět i kdyby to mělo být špatně a má problém říct, že neví.
Generování SQL pomocí umělé inteligence
Pro vytváření testovacích dat je umělá inteligence skvělá a rychlá. Samozřejmě stále platí „důvěřuj, ale prověřuj“.
Například následující prompt zadaný do 4 chatbotů pokaždé vygeneroval jiný výsledek. Pochopitelně.
Vytvoř tabulky a testovací data. Použij dialekt MySQL. Tabulky jsou:
- Customer
- Orders
- Sales
Každá tabulka bude mít max. 10 řádků.
Čtyři soutěžící
- Gemini byl rychlý a snaživý. Pro každou tabulku vytvořil hodně sloupců. Komentáře, jména, adresy i stavy objednávek byly v češtině.
- DeepSeek byl nejpomalejší a sloupců vytvořil také hodně. V češtině byla jen jména a adresy.
- ChatGPT byl rychlý a stručný. Komentáře, jména a adresy byly v češtině. Názvy produktů byly v angličtině.
- Grok byl rychlý a nejstručnější. V češtině byla jen jména a ještě navíc bez diakritiky.
Všechna vygenerovaná SQL šla spustit bez chyb a vytvořila tabulky a data.
Gemini - generování SQL
-- Tabulka Customer
CREATE TABLE Customer (
CustomerID INT PRIMARY KEY AUTO_INCREMENT,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(100) UNIQUE,
Phone VARCHAR(20),
Address VARCHAR(255),
City VARCHAR(50),
Country VARCHAR(50)
);
-- Testovací data pro tabulku Customer
INSERT INTO Customer (FirstName, LastName, Email, Phone, Address, City, Country) VALUES
('Jan', 'Novák', 'jan.novak@email.cz', '+420 123 456 789', 'Dlouhá 10', 'Praha', 'Česká republika'),
('Petr', 'Svoboda', 'petr.svoboda@email.cz', '+420 987 654 321', 'Krátká 5', 'Brno', 'Česká republika'),
('Marie', 'Veselá', 'marie.vesela@email.cz', '+420 777 888 999', 'Hlavní 20', 'Ostrava', 'Česká republika'),
('Josef', 'Horák', 'josef.horak@email.cz', '+420 555 111 222', 'Nová 15', 'Plzeň', 'Česká republika'),
('Eva', 'Kopecká', 'eva.kopecka@email.cz', '+420 333 777 444', 'Zelená 8', 'Liberec', 'Česká republika'),
('Tomáš', 'Černý', 'tomas.cerny@email.cz', '+420 666 222 999', 'Modrá 12', 'Olomouc', 'Česká republika'),
('Hana', 'Bílá', 'hana.bila@email.cz', '+420 444 999 111', 'Žlutá 3', 'Ústí nad Labem', 'Česká republika'),
('Pavel', 'Malý', 'pavel.maly@email.cz', '+420 222 888 555', 'Červená 18', 'Hradec Králové', 'Česká republika'),
('Lucie', 'Procházková', 'lucie.prochazkova@email.cz', '+420 888 333 666', 'Fialová 7', 'Pardubice', 'Česká republika'),
('Martin', 'Dvořák', 'martin.dvorak@email.cz', '+420 999 444 777', 'Hnědá 11', 'České Budějovice', 'Česká republika');
-- Tabulka Orders
CREATE TABLE Orders (
OrderID INT PRIMARY KEY AUTO_INCREMENT,
CustomerID INT NOT NULL,
OrderDate DATETIME NOT NULL,
TotalAmount DECIMAL(10, 2) NOT NULL,
OrderStatus VARCHAR(20),
FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID)
);
-- Testovací data pro tabulku Orders
INSERT INTO Orders (CustomerID, OrderDate, TotalAmount, OrderStatus) VALUES
(1, '2024-01-15 10:00:00', 150.50, 'Dokončeno'),
(2, '2024-02-20 14:30:00', 220.75, 'Odesláno'),
(3, '2024-03-10 09:15:00', 75.20, 'Zpracovává se'),
(1, '2024-03-25 16:45:00', 310.99, 'Dokončeno'),
(4, '2024-04-05 11:00:00', 55.00, 'Nové'),
(5, '2024-04-18 13:20:00', 185.40, 'Odesláno'),
(2, '2024-05-01 08:00:00', 92.60, 'Zpracovává se'),
(6, '2024-05-12 17:50:00', 400.00, 'Dokončeno'),
(7, '2024-05-22 12:05:00', 120.30, 'Nové'),
(3, '2024-06-03 15:35:00', 255.80, 'Odesláno');
-- Tabulka Sales
CREATE TABLE Sales (
SaleID INT PRIMARY KEY AUTO_INCREMENT,
OrderID INT NOT NULL,
ProductID INT, -- Můžete mít další tabulku pro produkty
Quantity INT NOT NULL,
UnitPrice DECIMAL(10, 2) NOT NULL,
SaleDate DATETIME NOT NULL,
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);
-- Testovací data pro tabulku Sales
INSERT INTO Sales (OrderID, ProductID, Quantity, UnitPrice, SaleDate) VALUES
(1, 101, 2, 50.25, '2024-01-15 10:00:00'),
(1, 102, 1, 50.00, '2024-01-15 10:00:00'),
(2, 201, 3, 70.50, '2024-02-20 14:30:00'),
(3, 301, 1, 75.20, '2024-03-10 09:15:00'),
(4, 103, 2, 155.00, '2024-03-25 16:45:00'),
(5, 401, 5, 11.00, '2024-04-05 11:00:00'),
(6, 202, 2, 92.70, '2024-04-18 13:20:00'),
(7, 302, 4, 23.15, '2024-05-01 08:00:00'),
(8, 104, 1, 400.00, '2024-05-12 17:50:00'),
(9, 402, 3, 40.10, '2024-05-22 12:05:00');
DeepSeek - generování SQL
-- Create Customer table
CREATE TABLE Customer (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
address VARCHAR(200),
registration_date DATE
);
-- Insert test data into Customer
INSERT INTO Customer (first_name, last_name, email, phone, address, registration_date) VALUES
('Jan', 'Novák', 'jan.novak@email.com', '+420123456789', 'Praha 1, Václavské náměstí 1', '2023-01-15'),
('Petr', 'Svoboda', 'petr.svoboda@email.com', '+420987654321', 'Brno, Šumavská 15', '2023-02-20'),
('Anna', 'Dvořáková', 'anna.dvorakova@email.com', '+420555444333', 'Ostrava, Nádražní 22', '2023-03-10'),
('Martin', 'Černý', 'martin.cerny@email.com', '+420111222333', 'Plzeň, Kollárova 5', '2023-01-05'),
('Eva', 'Veselá', 'eva.vesela@email.com', '+420777888999', 'Liberec, Rumunská 12', '2023-04-18'),
('Tomáš', 'Malý', 'tomas.maly@email.com', '+420666555444', 'České Budějovice, Lannova 8', '2023-05-22'),
('Lucie', 'Křížová', 'lucie.krizova@email.com', '+420222333444', 'Olomouc, třída Svobody 25', '2023-06-30'),
('Josef', 'Horák', 'josef.horak@email.com', '+420333444555', 'Ústí nad Labem, Mírové náměstí 3', '2023-07-12'),
('Marie', 'Fialová', 'marie.fialova@email.com', '+420444555666', 'Hradec Králové, Velké náměstí 10', '2023-08-05'),
('Pavel', 'Růžička', 'pavel.ruzicka@email.com', '+420999888777', 'Pardubice, Pernštýnské náměstí 7', '2023-09-15');
-- Create Orders table
CREATE TABLE Orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
order_date DATETIME NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) DEFAULT 'Pending',
payment_method VARCHAR(30),
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);
-- Insert test data into Orders
INSERT INTO Orders (customer_id, order_date, total_amount, status, payment_method) VALUES
(1, '2023-10-01 09:15:22', 1250.50, 'Completed', 'Credit Card'),
(2, '2023-10-02 14:30:45', 899.99, 'Completed', 'Bank Transfer'),
(3, '2023-10-03 11:05:33', 450.75, 'Processing', 'Credit Card'),
(4, '2023-10-04 16:22:18', 2100.00, 'Completed', 'Cash on Delivery'),
(5, '2023-10-05 10:45:10', 675.25, 'Shipped', 'Credit Card'),
(1, '2023-10-06 13:12:05', 320.90, 'Pending', 'PayPal'),
(6, '2023-10-07 09:30:00', 1599.99, 'Completed', 'Credit Card'),
(7, '2023-10-08 15:45:30', 245.50, 'Processing', 'Bank Transfer'),
(8, '2023-10-09 12:00:15', 890.00, 'Shipped', 'Credit Card'),
(9, '2023-10-10 17:30:45', 125.75, 'Pending', 'PayPal');
-- Create Sales table
CREATE TABLE Sales (
sale_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
product_id INT,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
discount DECIMAL(10,2) DEFAULT 0.00,
FOREIGN KEY (order_id) REFERENCES Orders(order_id)
);
-- Insert test data into Sales
INSERT INTO Sales (order_id, product_id, quantity, unit_price, discount) VALUES
(1, 101, 2, 500.00, 50.00),
(1, 205, 1, 250.50, 0.00),
(2, 305, 1, 899.99, 0.00),
(3, 101, 1, 450.75, 0.00),
(4, 410, 3, 700.00, 0.00),
(5, 205, 2, 350.00, 24.75),
(6, 510, 5, 64.18, 0.00),
(7, 610, 1, 1599.99, 0.00),
(8, 205, 1, 245.50, 0.00),
(9, 305, 2, 445.00, 0.00);
ChatGPT - generování SQL
-- Vytvoření tabulky Customer
CREATE TABLE Customer (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
city VARCHAR(50)
);
-- Vložení dat do Customer
INSERT INTO Customer VALUES
(1, 'Jan Novak', 'jan@example.com', 'Praha'),
(2, 'Eva Dvořáková', 'eva@example.com', 'Brno'),
(3, 'Petr Svoboda', 'petr@example.com', 'Ostrava'),
(4, 'Lucie Malá', 'lucie@example.com', 'Plzeň'),
(5, 'Tomáš Král', 'tomas@example.com', 'Liberec'),
(6, 'Anna Černá', 'anna@example.com', 'Olomouc'),
(7, 'Michal Beneš', 'michal@example.com', 'Zlín'),
(8, 'Karel Růžička', 'karel@example.com', 'Hradec Králové'),
(9, 'Barbora Kolářová', 'barbora@example.com', 'České Budějovice'),
(10, 'David Procházka', 'david@example.com', 'Pardubice');
-- Vytvoření tabulky Orders
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);
-- Vložení dat do Orders
INSERT INTO Orders VALUES
(101, 1, '2025-04-01', 250.00),
(102, 2, '2025-04-02', 340.50),
(103, 3, '2025-04-03', 120.99),
(104, 4, '2025-04-04', 999.00),
(105, 5, '2025-04-05', 430.00),
(106, 6, '2025-04-06', 80.00),
(107, 7, '2025-04-07', 60.25),
(108, 8, '2025-04-08', 710.00),
(109, 9, '2025-04-09', 550.50),
(110, 10, '2025-04-10', 300.00);
-- Vytvoření tabulky Sales
CREATE TABLE Sales (
sale_id INT PRIMARY KEY,
order_id INT,
product_name VARCHAR(100),
quantity INT,
price DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES Orders(order_id)
);
-- Vložení dat do Sales
INSERT INTO Sales VALUES
(201, 101, 'Notebook', 1, 250.00),
(202, 102, 'Monitor', 2, 170.25),
(203, 103, 'Mouse', 3, 40.33),
(204, 104, 'Phone', 1, 999.00),
(205, 105, 'Tablet', 2, 215.00),
(206, 106, 'Charger', 4, 20.00),
(207, 107, 'Keyboard', 1, 60.25),
(208, 108, 'Desk', 1, 710.00),
(209, 109, 'Chair', 2, 275.25),
(210, 110, 'Speaker', 3, 100.00);
Grok - generování SQL
CREATE TABLE Customer (
customer_id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);
CREATE TABLE Sales (
sale_id INT PRIMARY KEY,
order_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES Orders(order_id)
);
INSERT INTO Customer (customer_id, name, email) VALUES
(1, 'Jan Novak', 'jan.novak@email.cz'),
(2, 'Marie Kovarova', 'marie.k@email.cz'),
(3, 'Petr Svoboda', 'petr.s@email.cz'),
(4, 'Anna Prochazkova', 'anna.p@email.cz'),
(5, 'Lukas Cerny', 'lukas.c@email.cz'),
(6, 'Hana Vlkova', 'hana.v@email.cz'),
(7, 'Tomas Dvorak', 'tomas.d@email.cz'),
(8, 'Jitka Maresova', 'jitka.m@email.cz'),
(9, 'Martin Zeman', 'martin.z@email.cz'),
(10, 'Klara Benesova', 'klara.b@email.cz');
INSERT INTO Orders (order_id, customer_id, order_date) VALUES
(1, 1, '2025-01-10'),
(2, 2, '2025-02-15'),
(3, 3, '2025-03-20'),
(4, 4, '2025-04-05'),
(5, 5, '2025-04-10'),
(6, 6, '2025-04-12'),
(7, 7, '2025-04-13'),
(8, 8, '2025-04-14'),
(9, 9, '2025-04-15'),
(10, 10, '2025-04-15');
INSERT INTO Sales (sale_id, order_id, amount) VALUES
(1, 1, 1500.50),
(2, 2, 2300.75),
(3, 3, 1800.00),
(4, 4, 950.25),
(5, 5, 3000.00),
(6, 6, 1200.80),
(7, 7, 2700.60),
(8, 8, 800.90),
(9, 9, 1900.30),
(10, 10, 2100.40);
Závěr
Všechny testované modely si s tímto jednoduchým úkolem poradily bez problémů. Nejlépe totiž fungují, když řešíte dobře zdokumentované věci – ideálně takové, které se probírají na fórech jako StackOverflow a týkají se běžně používaných technologií.
Když jsem se ale pokoušel řešit něco specifického, spojeného s technologiemi používanými typicky jen ve velkých společnostech, AI často selhávala. Sice odpovídala, ale špatně.
Což se dalo čekat, protože platí: menší množství trénovacích dat = horší porozumění. A naopak.